@edvisor/product-language 0.10.0 → 0.10.2

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 (410) hide show
  1. package/.babelrc +12 -0
  2. package/.eslintrc.json +147 -0
  3. package/.release-it.json +17 -0
  4. package/.storybook/main.js +57 -0
  5. package/.storybook/manager.js +7 -0
  6. package/.storybook/preview.js +15 -0
  7. package/.storybook/tsconfig.json +30 -0
  8. package/jest.config.ts +15 -0
  9. package/jest.setup.ts +2 -0
  10. package/package.json +2 -27
  11. package/project.json +98 -0
  12. package/src/README.md +61 -0
  13. package/src/assets/svg/example_icon.svg +3 -0
  14. package/src/assets/svg/example_icon_white.svg +3 -0
  15. package/src/assets/svg/spinner.svg +3 -0
  16. package/src/assets/svg/spinner_white.svg +3 -0
  17. package/src/helpers/index.ts +4 -0
  18. package/src/helpers/playground.ts +26 -0
  19. package/src/helpers/talesOf.tsx +42 -0
  20. package/src/index.ts +2 -0
  21. package/src/lib/components/README.md +49 -0
  22. package/src/lib/components/alert-banner/alert-banner.test.tsx +93 -0
  23. package/src/lib/components/alert-banner/alert-banner.tsx +117 -0
  24. package/src/lib/components/alert-banner/alert-level-flags.ts +101 -0
  25. package/src/lib/components/alert-banner/index.ts +1 -0
  26. package/src/lib/components/alert-banner/storybook/alert-banner.stories.mdx +67 -0
  27. package/src/lib/components/alert-banner/storybook/components.tsx +124 -0
  28. package/src/lib/components/badge/badge-type-flags.ts +72 -0
  29. package/src/lib/components/badge/badge.test.tsx +29 -0
  30. package/src/lib/components/badge/badge.tsx +22 -0
  31. package/src/lib/components/badge/index.ts +1 -0
  32. package/src/lib/components/badge/stories/badge.stories.mdx +44 -0
  33. package/src/lib/components/badge/stories/components.tsx +49 -0
  34. package/{lib/components/card/atoms/card-frame.d.ts → src/lib/components/card/atoms/card-frame.tsx} +16 -7
  35. package/src/lib/components/card/atoms/index.ts +1 -0
  36. package/src/lib/components/card/card.test.tsx +162 -0
  37. package/src/lib/components/card/card.tsx +78 -0
  38. package/src/lib/components/card/components/card-alert-banner-slot.tsx +16 -0
  39. package/src/lib/components/card/components/card-controls-slot.tsx +19 -0
  40. package/src/lib/components/card/components/card-section-slot.tsx +51 -0
  41. package/src/lib/components/card/components/index.ts +3 -0
  42. package/src/lib/components/card/index.ts +3 -0
  43. package/src/lib/components/card/molecules/index.ts +1 -0
  44. package/src/lib/components/card/molecules/left-right-card.test.tsx +89 -0
  45. package/src/lib/components/card/molecules/left-right-card.tsx +63 -0
  46. package/src/lib/components/card/storybook/card.stories.mdx +100 -0
  47. package/src/lib/components/card/storybook/components.tsx +227 -0
  48. package/src/lib/components/checkbox/checkbox.test.tsx +39 -0
  49. package/src/lib/components/checkbox/checkbox.tsx +70 -0
  50. package/src/lib/components/checkbox/helpers.tsx +98 -0
  51. package/src/lib/components/checkbox/index.tsx +1 -0
  52. package/src/lib/components/checkbox/stories/checkbox.stories.mdx +57 -0
  53. package/src/lib/components/checkbox/stories/components.tsx +84 -0
  54. package/src/lib/components/date-picker/components/custom-calendar.tsx +193 -0
  55. package/src/lib/components/date-picker/components/index.ts +1 -0
  56. package/src/lib/components/date-picker/data-picker.test.tsx +220 -0
  57. package/src/lib/components/date-picker/date-picker.tsx +10 -0
  58. package/src/lib/components/date-picker/helpers/date-picker-factory.tsx +210 -0
  59. package/src/lib/components/date-picker/index.ts +1 -0
  60. package/src/lib/components/date-picker/storybook/components.tsx +259 -0
  61. package/src/lib/components/date-picker/storybook/date-picker.stories.mdx +133 -0
  62. package/src/lib/components/divider/divider-type-flags.tsx +37 -0
  63. package/src/lib/components/divider/divider.test.tsx +34 -0
  64. package/src/lib/components/divider/divider.tsx +37 -0
  65. package/src/lib/components/divider/index.tsx +1 -0
  66. package/src/lib/components/divider/stories/components.tsx +13 -0
  67. package/src/lib/components/divider/stories/divider.stories.mdx +44 -0
  68. package/src/lib/components/flag/flag-size-flags.tsx +55 -0
  69. package/src/lib/components/flag/flag.list.tsx +788 -0
  70. package/src/lib/components/flag/flag.test.tsx +65 -0
  71. package/src/lib/components/flag/flag.tsx +97 -0
  72. package/src/lib/components/flag/index.tsx +1 -0
  73. package/src/lib/components/flag/stories/components.tsx +403 -0
  74. package/src/lib/components/flag/stories/flag.stories.mdx +48 -0
  75. package/src/lib/components/flag/stories/playGround-select.tsx +145 -0
  76. package/src/lib/components/icon/icon-list.tsx +135 -0
  77. package/src/lib/components/icon/icon.test.tsx +47 -0
  78. package/src/lib/components/icon/icon.tsx +181 -0
  79. package/src/lib/components/icon/index.tsx +1 -0
  80. package/src/lib/components/icon/stories/components.tsx +282 -0
  81. package/src/lib/components/icon/stories/icon.stories.mdx +65 -0
  82. package/src/lib/components/index.ts +26 -0
  83. package/src/lib/components/input-field/components/index.ts +2 -0
  84. package/src/lib/components/input-field/components/labeled-input.tsx +57 -0
  85. package/src/lib/components/input-field/components/stepper.tsx +64 -0
  86. package/src/lib/components/input-field/index.ts +6 -0
  87. package/src/lib/components/input-field/input-field.test.tsx +107 -0
  88. package/src/lib/components/input-field/input-field.tsx +154 -0
  89. package/src/lib/components/input-field/input-number.tsx +41 -0
  90. package/src/lib/components/input-field/input-text.tsx +30 -0
  91. package/src/lib/components/input-field/storybook/components.tsx +367 -0
  92. package/src/lib/components/input-field/storybook/input-field.stories.mdx +120 -0
  93. package/src/lib/components/layout/flex.tsx +22 -0
  94. package/src/lib/components/layout/grid-layout.tsx +40 -0
  95. package/src/lib/components/layout/index.ts +3 -0
  96. package/src/lib/components/layout/left-right-layout.tsx +67 -0
  97. package/src/lib/components/link/index.ts +1 -0
  98. package/src/lib/components/link/link.test.tsx +29 -0
  99. package/src/lib/components/link/link.tsx +56 -0
  100. package/src/lib/components/link/storybook/link.stories.mdx +52 -0
  101. package/src/lib/components/modal/index.ts +3 -0
  102. package/src/lib/components/modal/modal-base.tsx +129 -0
  103. package/src/lib/components/modal/modal-destructive.tsx +70 -0
  104. package/src/lib/components/modal/modal.test.tsx +138 -0
  105. package/src/lib/components/modal/modal.tsx +114 -0
  106. package/src/lib/components/modal/storybook/components.tsx +105 -0
  107. package/src/lib/components/modal/storybook/modal-destructive.stories.mdx +31 -0
  108. package/src/lib/components/modal/storybook/modal.stories.mdx +50 -0
  109. package/src/lib/components/molecules/avatar/avatar-size-flags.tsx +55 -0
  110. package/src/lib/components/molecules/avatar/avatar.test.tsx +114 -0
  111. package/src/lib/components/molecules/avatar/avatar.tsx +80 -0
  112. package/src/lib/components/molecules/avatar/index.tsx +1 -0
  113. package/src/lib/components/molecules/avatar/stories/avatar.stories.mdx +52 -0
  114. package/src/lib/components/molecules/avatar/stories/components.tsx +36 -0
  115. package/src/lib/components/molecules/button/button-flags.tsx +340 -0
  116. package/src/lib/components/molecules/button/button.test.tsx +77 -0
  117. package/src/lib/components/molecules/button/button.tsx +212 -0
  118. package/src/lib/components/molecules/button/index.tsx +1 -0
  119. package/src/lib/components/molecules/button/stories/button.stories.mdx +105 -0
  120. package/src/lib/components/molecules/button/stories/components.tsx +90 -0
  121. package/src/lib/components/molecules/index.ts +3 -0
  122. package/src/lib/components/molecules/input-checkbox/index.tsx +1 -0
  123. package/src/lib/components/molecules/input-checkbox/input-checkbox.test.tsx +34 -0
  124. package/src/lib/components/molecules/input-checkbox/input-checkbox.tsx +50 -0
  125. package/src/lib/components/molecules/input-checkbox/stories/components.tsx +53 -0
  126. package/src/lib/components/molecules/input-checkbox/stories/input-checkbox.stories.mdx +49 -0
  127. package/src/lib/components/organisms/choice-list/choice-list.test.tsx +36 -0
  128. package/src/lib/components/organisms/choice-list/choice-list.tsx +72 -0
  129. package/src/lib/components/organisms/choice-list/index.tsx +1 -0
  130. package/src/lib/components/organisms/choice-list/stories/choice-list.stories.mdx +57 -0
  131. package/src/lib/components/organisms/choice-list/stories/components.tsx +45 -0
  132. package/src/lib/components/organisms/index.ts +2 -0
  133. package/src/lib/components/organisms/multi-choice-list/index.tsx +1 -0
  134. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.test.tsx +33 -0
  135. package/src/lib/components/organisms/multi-choice-list/multi-choice-list.tsx +53 -0
  136. package/src/lib/components/organisms/multi-choice-list/stories/components.tsx +124 -0
  137. package/src/lib/components/organisms/multi-choice-list/stories/multi-choice-list.stories.mdx +99 -0
  138. package/src/lib/components/progress-bar/index.ts +1 -0
  139. package/src/lib/components/progress-bar/progress-bar-size-flags.tsx +37 -0
  140. package/src/lib/components/progress-bar/progress-bar.test.tsx +66 -0
  141. package/src/lib/components/progress-bar/progress-bar.tsx +42 -0
  142. package/src/lib/components/progress-bar/storybook/components.tsx +62 -0
  143. package/src/lib/components/progress-bar/storybook/progress-bar.stories.mdx +43 -0
  144. package/{lib/components/spinner/index.d.ts → src/lib/components/radio-button/index.tsx} +1 -1
  145. package/src/lib/components/radio-button/radio-button.tsx +135 -0
  146. package/src/lib/components/radio-button/radio.test.tsx +59 -0
  147. package/src/lib/components/radio-button/stories/components.tsx +36 -0
  148. package/src/lib/components/radio-button/stories/radio-button.stories.mdx +44 -0
  149. package/src/lib/components/range-slider/components/bar-chart.tsx +50 -0
  150. package/src/lib/components/range-slider/components/handle.tsx +58 -0
  151. package/src/lib/components/range-slider/components/rail.tsx +44 -0
  152. package/src/lib/components/range-slider/components/slider-component.tsx +98 -0
  153. package/src/lib/components/range-slider/components/slider-inputs.tsx +150 -0
  154. package/src/lib/components/range-slider/components/tick.tsx +51 -0
  155. package/src/lib/components/range-slider/components/track.tsx +67 -0
  156. package/src/lib/components/range-slider/index.tsx +2 -0
  157. package/src/lib/components/range-slider/range-slider.test.tsx +185 -0
  158. package/src/lib/components/range-slider/range-slider.tsx +132 -0
  159. package/src/lib/components/range-slider/slider.test.tsx +89 -0
  160. package/src/lib/components/range-slider/slider.tsx +80 -0
  161. package/src/lib/components/range-slider/stories/components.tsx +179 -0
  162. package/src/lib/components/range-slider/stories/range-slider.stories.mdx +84 -0
  163. package/src/lib/components/range-slider/types.ts +18 -0
  164. package/src/lib/components/select/components/menu-container.tsx +69 -0
  165. package/src/lib/components/select/components/menu-list.tsx +195 -0
  166. package/src/lib/components/select/components/menu-row.tsx +43 -0
  167. package/src/lib/components/select/components/menu.tsx +151 -0
  168. package/src/lib/components/select/components/option.tsx +91 -0
  169. package/src/lib/components/select/components/select-label.tsx +10 -0
  170. package/src/lib/components/select/components/value-component-multi.tsx +40 -0
  171. package/src/lib/components/select/components/value-component-single.tsx +27 -0
  172. package/src/lib/components/select/components/value.tsx +370 -0
  173. package/src/lib/components/select/index.tsx +3 -0
  174. package/src/lib/components/select/select.test.tsx +148 -0
  175. package/src/lib/components/select/select.tsx +337 -0
  176. package/src/lib/components/select/storybook/components.tsx +999 -0
  177. package/src/lib/components/select/storybook/radio-group.tsx +157 -0
  178. package/src/lib/components/select/storybook/select.stories.mdx +172 -0
  179. package/src/lib/components/select/types.ts +149 -0
  180. package/src/lib/components/select/utils.ts +101 -0
  181. package/src/lib/components/spinner/index.tsx +1 -0
  182. package/src/lib/components/spinner/spinner-size-flags.tsx +39 -0
  183. package/src/lib/components/spinner/spinner.test.tsx +31 -0
  184. package/src/lib/components/spinner/spinner.tsx +54 -0
  185. package/src/lib/components/spinner/stories/components.tsx +39 -0
  186. package/src/lib/components/spinner/stories/spinner.stories.mdx +35 -0
  187. package/src/lib/components/tabs/components/index.ts +1 -0
  188. package/src/lib/components/tabs/components/tab.tsx +85 -0
  189. package/src/lib/components/tabs/index.tsx +1 -0
  190. package/src/lib/components/tabs/storybook/components.tsx +317 -0
  191. package/src/lib/components/tabs/storybook/tabs.stories.mdx +105 -0
  192. package/src/lib/components/tabs/tabs.test.tsx +86 -0
  193. package/src/lib/components/tabs/tabs.tsx +115 -0
  194. package/src/lib/components/tag/components/close-button.tsx +85 -0
  195. package/src/lib/components/tag/components/index.ts +2 -0
  196. package/src/lib/components/tag/components/tag-label.tsx +45 -0
  197. package/src/lib/components/tag/index.tsx +1 -0
  198. package/src/lib/components/tag/stories/components.tsx +86 -0
  199. package/src/lib/components/tag/stories/tag.stories.mdx +42 -0
  200. package/src/lib/components/tag/tag.test.tsx +36 -0
  201. package/src/lib/components/tag/tag.tsx +33 -0
  202. package/src/lib/components/thumbnail/index.tsx +1 -0
  203. package/src/lib/components/thumbnail/stories/thumbnail.stories.mdx +44 -0
  204. package/src/lib/components/thumbnail/thumbnail-size-flags.tsx +41 -0
  205. package/src/lib/components/thumbnail/thumbnail.test.tsx +51 -0
  206. package/src/lib/components/thumbnail/thumbnail.tsx +44 -0
  207. package/src/lib/components/tooltip/index.tsx +1 -0
  208. package/src/lib/components/tooltip/stories/components.tsx +224 -0
  209. package/src/lib/components/tooltip/stories/tooltip.stories.mdx +63 -0
  210. package/src/lib/components/tooltip/tooltip.test.tsx +22 -0
  211. package/src/lib/components/tooltip/tooltip.tsx +179 -0
  212. package/src/lib/components/tree-view/components/tree-node.tsx +203 -0
  213. package/src/lib/components/tree-view/helper.tsx +171 -0
  214. package/src/lib/components/tree-view/index.ts +2 -0
  215. package/src/lib/components/tree-view/stories/components.tsx +640 -0
  216. package/src/lib/components/tree-view/stories/tree-view.stories.mdx +127 -0
  217. package/src/lib/components/tree-view/tree-view.test.tsx +146 -0
  218. package/src/lib/components/tree-view/tree-view.tsx +168 -0
  219. package/src/lib/components/tree-view/types.tsx +70 -0
  220. package/src/lib/components/typography/index.ts +1 -0
  221. package/src/lib/components/typography/storybook/components.tsx +288 -0
  222. package/src/lib/components/typography/storybook/typography.stories.mdx +90 -0
  223. package/src/lib/components/typography/typography.test.tsx +97 -0
  224. package/src/lib/components/typography/typography.tsx +99 -0
  225. package/src/lib/foundations/color-system/base-palette/base-palette.stories.tsx +123 -0
  226. package/src/lib/foundations/color-system/base-palette/base-palette.ts +93 -0
  227. package/src/lib/foundations/color-system/base-palette/index.ts +1 -0
  228. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.mdx +85 -0
  229. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.stories.tsx +231 -0
  230. package/src/lib/foundations/color-system/color-guidelines/color-guidelines.ts +160 -0
  231. package/src/lib/foundations/color-system/color-guidelines/index.ts +1 -0
  232. package/src/lib/foundations/color-system/components/color-sample.tsx +99 -0
  233. package/src/lib/foundations/color-system/components/index.ts +1 -0
  234. package/src/lib/foundations/color-system/index.ts +1 -0
  235. package/src/lib/foundations/index.ts +4 -0
  236. package/src/lib/foundations/shadows/components.tsx +59 -0
  237. package/src/lib/foundations/shadows/index.ts +1 -0
  238. package/src/lib/foundations/shadows/shadows.stories.mdx +71 -0
  239. package/src/lib/foundations/shadows/shadows.tsx +47 -0
  240. package/src/lib/foundations/spacing/index.ts +1 -0
  241. package/src/lib/foundations/spacing/spacing-guidelines.ts +37 -0
  242. package/src/lib/foundations/spacing/spacing.stories.mdx +51 -0
  243. package/src/lib/foundations/spacing/spacing.ts +18 -0
  244. package/src/lib/foundations/typography/constants.ts +25 -0
  245. package/src/lib/foundations/typography/fonts.ts +205 -0
  246. package/src/lib/foundations/typography/index.tsx +1 -0
  247. package/src/lib/foundations/typography/text-aspect-flags.ts +61 -0
  248. package/src/lib/foundations/typography/typography.tsx +102 -0
  249. package/src/lib/helpers/generic-types.ts +44 -0
  250. package/src/lib/helpers/index.ts +8 -0
  251. package/src/lib/helpers/isReactElementOfType.test.tsx +108 -0
  252. package/src/lib/helpers/isReactElementOfType.ts +42 -0
  253. package/src/lib/helpers/nothing.tsx +22 -0
  254. package/{lib/helpers/numbers.d.ts → src/lib/helpers/numbers.ts} +67 -50
  255. package/src/lib/helpers/safe-navigation.ts +57 -0
  256. package/src/lib/helpers/slots.tsx +126 -0
  257. package/src/lib/helpers/strings.test.ts +47 -0
  258. package/src/lib/helpers/strings.ts +16 -0
  259. package/src/lib/helpers/useInputElementState.ts +56 -0
  260. package/src/lib/helpers/useKeyDown.ts +17 -0
  261. package/tsconfig.json +35 -0
  262. package/tsconfig.lib.json +28 -0
  263. package/tsconfig.spec.json +21 -0
  264. package/index.d.ts +0 -2
  265. package/index.js +0 -11246
  266. package/lib/components/alert-banner/alert-banner.d.ts +0 -15
  267. package/lib/components/alert-banner/alert-level-flags.d.ts +0 -18
  268. package/lib/components/alert-banner/index.d.ts +0 -1
  269. package/lib/components/badge/badge-type-flags.d.ts +0 -18
  270. package/lib/components/badge/badge.d.ts +0 -5
  271. package/lib/components/badge/index.d.ts +0 -1
  272. package/lib/components/card/atoms/index.d.ts +0 -1
  273. package/lib/components/card/card.d.ts +0 -14
  274. package/lib/components/card/components/card-alert-banner-slot.d.ts +0 -6
  275. package/lib/components/card/components/card-controls-slot.d.ts +0 -5
  276. package/lib/components/card/components/card-section-slot.d.ts +0 -11
  277. package/lib/components/card/components/index.d.ts +0 -3
  278. package/lib/components/card/index.d.ts +0 -3
  279. package/lib/components/card/molecules/index.d.ts +0 -1
  280. package/lib/components/card/molecules/left-right-card.d.ts +0 -16
  281. package/lib/components/checkbox/checkbox.d.ts +0 -11
  282. package/lib/components/checkbox/helpers.d.ts +0 -12
  283. package/lib/components/checkbox/index.d.ts +0 -1
  284. package/lib/components/date-picker/components/custom-calendar.d.ts +0 -6
  285. package/lib/components/date-picker/components/index.d.ts +0 -1
  286. package/lib/components/date-picker/date-picker.d.ts +0 -4
  287. package/lib/components/date-picker/helpers/date-picker-factory.d.ts +0 -34
  288. package/lib/components/date-picker/index.d.ts +0 -1
  289. package/lib/components/divider/divider-type-flags.d.ts +0 -9
  290. package/lib/components/divider/divider.d.ts +0 -7
  291. package/lib/components/divider/index.d.ts +0 -1
  292. package/lib/components/flag/flag-size-flags.d.ts +0 -12
  293. package/lib/components/flag/flag.d.ts +0 -9
  294. package/lib/components/flag/flag.list.d.ts +0 -782
  295. package/lib/components/flag/index.d.ts +0 -1
  296. package/lib/components/icon/icon-list.d.ts +0 -132
  297. package/lib/components/icon/icon.d.ts +0 -131
  298. package/lib/components/icon/index.d.ts +0 -1
  299. package/lib/components/index.d.ts +0 -24
  300. package/lib/components/input-field/components/index.d.ts +0 -2
  301. package/lib/components/input-field/components/labeled-input.d.ts +0 -10
  302. package/lib/components/input-field/components/stepper.d.ts +0 -7
  303. package/lib/components/input-field/index.d.ts +0 -3
  304. package/lib/components/input-field/input-field.d.ts +0 -26
  305. package/lib/components/input-field/input-number.d.ts +0 -18
  306. package/lib/components/input-field/input-text.d.ts +0 -14
  307. package/lib/components/layout/flex.d.ts +0 -16
  308. package/lib/components/layout/grid-layout.d.ts +0 -11
  309. package/lib/components/layout/index.d.ts +0 -3
  310. package/lib/components/layout/left-right-layout.d.ts +0 -34
  311. package/lib/components/link/index.d.ts +0 -1
  312. package/lib/components/link/link.d.ts +0 -14
  313. package/lib/components/modal/index.d.ts +0 -3
  314. package/lib/components/modal/modal-base.d.ts +0 -28
  315. package/lib/components/modal/modal-destructive.d.ts +0 -11
  316. package/lib/components/modal/modal.d.ts +0 -13
  317. package/lib/components/molecules/avatar/avatar-size-flags.d.ts +0 -12
  318. package/lib/components/molecules/avatar/avatar.d.ts +0 -12
  319. package/lib/components/molecules/avatar/index.d.ts +0 -1
  320. package/lib/components/molecules/button/button-flags.d.ts +0 -44
  321. package/lib/components/molecules/button/button.d.ts +0 -12
  322. package/lib/components/molecules/button/index.d.ts +0 -1
  323. package/lib/components/molecules/index.d.ts +0 -3
  324. package/lib/components/molecules/input-checkbox/index.d.ts +0 -1
  325. package/lib/components/molecules/input-checkbox/input-checkbox.d.ts +0 -8
  326. package/lib/components/organisms/choice-list/choice-list.d.ts +0 -9
  327. package/lib/components/organisms/choice-list/index.d.ts +0 -1
  328. package/lib/components/organisms/index.d.ts +0 -2
  329. package/lib/components/organisms/multi-choice-list/index.d.ts +0 -1
  330. package/lib/components/organisms/multi-choice-list/multi-choice-list.d.ts +0 -11
  331. package/lib/components/progress-bar/index.d.ts +0 -1
  332. package/lib/components/progress-bar/progress-bar-size-flags.d.ts +0 -10
  333. package/lib/components/progress-bar/progress-bar.d.ts +0 -8
  334. package/lib/components/radio-button/index.d.ts +0 -1
  335. package/lib/components/radio-button/radio-button.d.ts +0 -10
  336. package/lib/components/range-slider/components/bar-chart.d.ts +0 -8
  337. package/lib/components/range-slider/components/handle.d.ts +0 -12
  338. package/lib/components/range-slider/components/rail.d.ts +0 -9
  339. package/lib/components/range-slider/components/slider-component.d.ts +0 -12
  340. package/lib/components/range-slider/components/slider-inputs.d.ts +0 -14
  341. package/lib/components/range-slider/components/tick.d.ts +0 -10
  342. package/lib/components/range-slider/components/track.d.ts +0 -11
  343. package/lib/components/range-slider/index.d.ts +0 -2
  344. package/lib/components/range-slider/range-slider.d.ts +0 -15
  345. package/lib/components/range-slider/slider.d.ts +0 -11
  346. package/lib/components/range-slider/types.d.ts +0 -11
  347. package/lib/components/select/components/menu-container.d.ts +0 -3
  348. package/lib/components/select/components/menu-list.d.ts +0 -3
  349. package/lib/components/select/components/menu-row.d.ts +0 -9
  350. package/lib/components/select/components/menu.d.ts +0 -3
  351. package/lib/components/select/components/option.d.ts +0 -13
  352. package/lib/components/select/components/select-label.d.ts +0 -1
  353. package/lib/components/select/components/value-component-multi.d.ts +0 -4
  354. package/lib/components/select/components/value-component-single.d.ts +0 -4
  355. package/lib/components/select/components/value.d.ts +0 -4
  356. package/lib/components/select/index.d.ts +0 -3
  357. package/lib/components/select/select.d.ts +0 -10
  358. package/lib/components/select/types.d.ts +0 -133
  359. package/lib/components/select/utils.d.ts +0 -15
  360. package/lib/components/spinner/spinner-size-flags.d.ts +0 -10
  361. package/lib/components/spinner/spinner.d.ts +0 -9
  362. package/lib/components/tabs/components/index.d.ts +0 -1
  363. package/lib/components/tabs/components/tab.d.ts +0 -8
  364. package/lib/components/tabs/index.d.ts +0 -1
  365. package/lib/components/tabs/tabs.d.ts +0 -16
  366. package/lib/components/tag/components/close-button.d.ts +0 -8
  367. package/lib/components/tag/components/index.d.ts +0 -2
  368. package/lib/components/tag/components/tag-label.d.ts +0 -8
  369. package/lib/components/tag/index.d.ts +0 -1
  370. package/lib/components/tag/tag.d.ts +0 -10
  371. package/lib/components/thumbnail/index.d.ts +0 -1
  372. package/lib/components/thumbnail/thumbnail-size-flags.d.ts +0 -10
  373. package/lib/components/thumbnail/thumbnail.d.ts +0 -10
  374. package/lib/components/tooltip/index.d.ts +0 -1
  375. package/lib/components/tooltip/tooltip.d.ts +0 -26
  376. package/lib/components/tree-view/components/tree-node.d.ts +0 -3
  377. package/lib/components/tree-view/helper.d.ts +0 -12
  378. package/lib/components/tree-view/index.d.ts +0 -2
  379. package/lib/components/tree-view/tree-view.d.ts +0 -3
  380. package/lib/components/tree-view/types.d.ts +0 -63
  381. package/lib/components/typography/index.d.ts +0 -1
  382. package/lib/components/typography/typography.d.ts +0 -24
  383. package/lib/foundations/color-system/base-palette/base-palette.d.ts +0 -76
  384. package/lib/foundations/color-system/base-palette/index.d.ts +0 -1
  385. package/lib/foundations/color-system/color-guidelines/color-guidelines.d.ts +0 -133
  386. package/lib/foundations/color-system/color-guidelines/index.d.ts +0 -1
  387. package/lib/foundations/color-system/components/color-sample.d.ts +0 -17
  388. package/lib/foundations/color-system/components/index.d.ts +0 -1
  389. package/lib/foundations/color-system/index.d.ts +0 -1
  390. package/lib/foundations/index.d.ts +0 -4
  391. package/lib/foundations/shadows/components.d.ts +0 -8
  392. package/lib/foundations/shadows/index.d.ts +0 -1
  393. package/lib/foundations/shadows/shadows.d.ts +0 -8
  394. package/lib/foundations/spacing/index.d.ts +0 -1
  395. package/lib/foundations/spacing/spacing-guidelines.d.ts +0 -33
  396. package/lib/foundations/spacing/spacing.d.ts +0 -18
  397. package/lib/foundations/typography/constants.d.ts +0 -22
  398. package/lib/foundations/typography/fonts.d.ts +0 -1
  399. package/lib/foundations/typography/index.d.ts +0 -1
  400. package/lib/foundations/typography/text-aspect-flags.d.ts +0 -19
  401. package/lib/foundations/typography/typography.d.ts +0 -24
  402. package/lib/helpers/generic-types.d.ts +0 -21
  403. package/lib/helpers/index.d.ts +0 -8
  404. package/lib/helpers/isReactElementOfType.d.ts +0 -8
  405. package/lib/helpers/nothing.d.ts +0 -10
  406. package/lib/helpers/safe-navigation.d.ts +0 -17
  407. package/lib/helpers/slots.d.ts +0 -17
  408. package/lib/helpers/strings.d.ts +0 -1
  409. package/lib/helpers/useInputElementState.d.ts +0 -30
  410. package/lib/helpers/useKeyDown.d.ts +0 -1
@@ -0,0 +1,44 @@
1
+ // eslint-disable-next-line no-restricted-syntax
2
+ import React, { FC as FunctionComponent, ForwardRefExoticComponent, ForwardRefRenderFunction, PropsWithChildren as PWC, PropsWithoutRef, RefAttributes } from 'react'
3
+ import { Slot } from './slots'
4
+
5
+ /** @see https://stackoverflow.com/a/49725198/29182 */
6
+ export type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<
7
+ T,
8
+ Exclude<keyof T, Keys>
9
+ > &
10
+ {
11
+ [K in Keys]-?: Required<Pick<T, K>> &
12
+ Partial<Record<Exclude<Keys, K>, undefined>>;
13
+ }[Keys];
14
+
15
+ export type MappedEnum<E, T> = {
16
+ [key in keyof E]: T;
17
+ }
18
+
19
+ export type Values<T> = T[keyof T];
20
+
21
+ export type PropsWithChildren<T = unknown> = PWC<T>
22
+
23
+ // Our FC type adds the ability to specify sub-components such as Slots
24
+ // also, just good to wrap imports from 3rd parties in general
25
+ export type FC<
26
+ // eslint-disable-next-line @typescript-eslint/ban-types
27
+ P = {},
28
+ // eslint-disable-next-line @typescript-eslint/ban-types
29
+ E extends { [x: symbol]: FunctionComponent<PropsWithChildren> | typeof Slot } = {}
30
+ > = FunctionComponent<P>
31
+ & {
32
+ [key in keyof E]: E[key]
33
+ }
34
+
35
+ // eslint-disable-next-line @typescript-eslint/ban-types
36
+ type ExtensibleForwardRef<T, P = {}, E = {}> = ForwardRefExoticComponent<PropsWithoutRef<P> & RefAttributes<T>>
37
+ & {
38
+ [key in keyof E]: E[key]
39
+ }
40
+
41
+ // eslint-disable-next-line @typescript-eslint/ban-types
42
+ export function forwardRef<T, P = {}, E = {}>(render: ForwardRefRenderFunction<T, P>): ExtensibleForwardRef<T, P, E> {
43
+ return React.forwardRef(render) as ExtensibleForwardRef<T, P, E>
44
+ }
@@ -0,0 +1,8 @@
1
+ export * from './safe-navigation'
2
+ export * from './slots'
3
+ export * from './generic-types'
4
+ export * from './numbers'
5
+ export * from './nothing'
6
+ export * from './strings'
7
+ export * from './isReactElementOfType'
8
+ export * from './useInputElementState'
@@ -0,0 +1,108 @@
1
+ import styled from 'styled-components'
2
+ import { FC } from './generic-types'
3
+ import { isReactElementOfType } from './isReactElementOfType'
4
+ import { Slot } from './slots'
5
+ import { Nothing } from './nothing'
6
+
7
+ describe('isReactElementOfType', () => {
8
+ describe('class component', () => {
9
+ class Bob extends Slot {}
10
+
11
+ describe('both component and element are unstyled', () => {
12
+ it('knows when they are different', () => {
13
+ expect(isReactElementOfType(Bob)(<div />)).toBe(false)
14
+ })
15
+ it('knows when they are the same', () => {
16
+ expect(isReactElementOfType(Bob)(<Bob />)).toBe(true)
17
+ })
18
+ })
19
+
20
+ describe('component type is styled', () => {
21
+ const StyledBob = styled(Bob)``
22
+
23
+ it('knows when they are different', () => {
24
+ expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
25
+ })
26
+ it('knows when they are the same', () => {
27
+ expect(isReactElementOfType(StyledBob)(<Bob />)).toBe(true)
28
+ })
29
+ })
30
+
31
+ describe('element is styled', () => {
32
+ const StyledBob = styled(Bob)``
33
+
34
+ it('knows when they are different', () => {
35
+ expect(isReactElementOfType(Bob)(<div />)).toBe(false)
36
+ })
37
+ it('knows when they are the same', () => {
38
+ expect(isReactElementOfType(Bob)(<StyledBob />)).toBe(true)
39
+ })
40
+ })
41
+
42
+ describe('both component and element are styled', () => {
43
+ const StyledBob = styled(Bob)``
44
+
45
+ it('knows when they are different', () => {
46
+ expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
47
+ })
48
+ it('knows when they are the same', () => {
49
+ expect(isReactElementOfType(StyledBob)(<StyledBob />)).toBe(true)
50
+ })
51
+ })
52
+ })
53
+
54
+ describe('function component', () => {
55
+ const Bob: FC = () => <div />
56
+
57
+ describe('both component and element are unstyled', () => {
58
+ it('knows when they are different', () => {
59
+ expect(isReactElementOfType(Bob)(<div />)).toBe(false)
60
+ })
61
+ it('knows when they are the same', () => {
62
+ expect(isReactElementOfType(Bob)(<Bob />)).toBe(true)
63
+ })
64
+ })
65
+
66
+ describe('component type is styled', () => {
67
+ const StyledBob = styled(Bob)``
68
+
69
+ it('knows when they are different', () => {
70
+ expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
71
+ })
72
+ it('knows when they are the same', () => {
73
+ expect(isReactElementOfType(StyledBob)(<Bob />)).toBe(true)
74
+ })
75
+ })
76
+
77
+ describe('element is styled', () => {
78
+ const StyledBob = styled(Bob)``
79
+
80
+ it('knows when they are different', () => {
81
+ expect(isReactElementOfType(Bob)(<div />)).toBe(false)
82
+ })
83
+ it('knows when they are the same', () => {
84
+ expect(isReactElementOfType(Bob)(<StyledBob />)).toBe(true)
85
+ })
86
+ })
87
+
88
+ describe('both component and element are styled', () => {
89
+ const StyledBob = styled(Bob)``
90
+
91
+ it('knows when they are different', () => {
92
+ expect(isReactElementOfType(StyledBob)(<div />)).toBe(false)
93
+ })
94
+ it('knows when they are the same', () => {
95
+ expect(isReactElementOfType(StyledBob)(<StyledBob />)).toBe(true)
96
+ })
97
+ })
98
+
99
+ describe('one of the components is Nothing', () => {
100
+ it('knows when they are different', () => {
101
+ expect(isReactElementOfType(Nothing)(<div />)).toBe(false)
102
+ })
103
+ it('knows when they are the same', () => {
104
+ expect(isReactElementOfType(Nothing)(<Nothing />)).toBe(true)
105
+ })
106
+ })
107
+ })
108
+ })
@@ -0,0 +1,42 @@
1
+ import { PureComponent, ReactElement } from 'react'
2
+ import { StyledComponent } from 'styled-components'
3
+ import { FC, PropsWithChildren } from './generic-types'
4
+ import { isDefined } from './safe-navigation'
5
+
6
+ export const isReactElementOfType =
7
+ <P extends PropsWithChildren>(
8
+ // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
9
+ component: (StyledComponent<FC<P>, any> | FC<P> | typeof PureComponent) & {
10
+ // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
11
+ target?: any
12
+ }
13
+ ) =>
14
+ // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-explicit-any
15
+ (element?: any): element is ReactElement<P> => {
16
+ /**
17
+ * I'm going to leave this as a big if/else instead of a compound expression to make
18
+ * it clear exactly what we are checking.
19
+ */
20
+ if (element?.type === component) {
21
+ // component is a function or a class, and element is an element of that type
22
+ return true
23
+ } else if (element?.type?.target === component) {
24
+ // element is a styled element of the given component
25
+ // so we have to look at what it is styling (its target)
26
+ return true
27
+ } else if (isDefined(component?.target) && element?.type === component?.target) {
28
+ // component is the type of a styled component
29
+ // and element is an element of the original unstyled component,
30
+ // so we have to look at the target of the component itself (what it styled)
31
+ return true
32
+ } else if (
33
+ isDefined(component?.target) &&
34
+ element?.type?.target === component?.target
35
+ ) {
36
+ // element and component are both styled, possibly _differently_
37
+ // but their underlying component type is the same
38
+ return true
39
+ }
40
+
41
+ return false
42
+ }
@@ -0,0 +1,22 @@
1
+ import { FC, PropsWithChildren } from './generic-types'
2
+ import { isNil } from './safe-navigation'
3
+ import { isReactElementOfType } from './isReactElementOfType'
4
+
5
+ // eslint-disable-next-line no-null/no-null
6
+ export const Nothing: FC = () => null
7
+
8
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
9
+ export const isNothing = isReactElementOfType(Nothing)
10
+
11
+ export function maybeRender<T>(prop: T, JSX: JSX.Element) {
12
+ return isNil(prop) || (false === Boolean(prop)) || isNothing(prop) ? <Nothing /> : JSX
13
+ }
14
+
15
+ interface IIfProps {
16
+ is: unknown
17
+ }
18
+
19
+ export const If: FC<PropsWithChildren<IIfProps>> = (props) => {
20
+ // eslint-disable-next-line react/jsx-no-useless-fragment
21
+ return maybeRender(props.is, <>{props.children}</>)
22
+ }
@@ -1,50 +1,67 @@
1
- export declare type Hex = `#${string}`;
2
- export declare function clamp(a: number, b: number, c: number): number;
3
- export declare function toHex(n: number, length: number): Hex;
4
- export declare function concatHex(a: Hex, b: Hex): Hex;
5
- /** given an array of boolean flags, bitwiseOr interprets them as an unsigned integer
6
- *
7
- * ```ts
8
- * bitwiseOr([false, true, false, true]) => 5 // 0b0101
9
- * ```
10
- *
11
- * This is useful for indexing into an enum:
12
- *
13
- * ```ts
14
- * const enum Level {
15
- * default = 0,
16
- * info = 0,
17
- * danger = 1,
18
- * warning = 2
19
- * }
20
- *
21
- * interface IProps {
22
- * info?: boolean
23
- * danger?: boolean
24
- * warning?: boolean
25
- * }
26
- *
27
- * function toLevel(n: number): Level {
28
- * switch (n) {
29
- * case Level.info: return Level.info
30
- * case Level.danger: return Level.danger
31
- * case Level.warning: return Level.warning
32
- * default: return Level.default
33
- * }
34
- * }
35
- *
36
- * const level = bitwiseOr([props.info, props.danger, props.warning])
37
- *
38
- * const levelEnum = toLevel(level)
39
- * ```
40
- */
41
- export declare function bitwiseOr(flags: unknown[]): number;
42
- /** given a number, it returns the number formed by the rightmost set bit as 1 and the 0s that comes after it
43
- *
44
- * ```ts
45
- * getRightmostSetBitNumber(12) => 4 // 12(1100) => 4(100)
46
- * getRightmostSetBitNumber(40) => 8 // 40(101000) => 8(1000)
47
- * ```
48
- *
49
- * */
50
- export declare function getRightmostSetBitNumber(n: number): number;
1
+ export type Hex = `#${string}`
2
+
3
+ export function clamp(a: number, b: number, c: number) {
4
+ return Math.max(a, Math.min(b, c))
5
+ }
6
+
7
+ export function toHex(n: number, length: number): Hex {
8
+ return `#${n.toString(16).padStart(length, '0').toUpperCase()}`
9
+ }
10
+
11
+ export function concatHex(a: Hex, b: Hex): Hex {
12
+ return `#${a.slice(1) + b.slice(1)}`
13
+ }
14
+
15
+ /** given an array of boolean flags, bitwiseOr interprets them as an unsigned integer
16
+ *
17
+ * ```ts
18
+ * bitwiseOr([false, true, false, true]) => 5 // 0b0101
19
+ * ```
20
+ *
21
+ * This is useful for indexing into an enum:
22
+ *
23
+ * ```ts
24
+ * const enum Level {
25
+ * default = 0,
26
+ * info = 0,
27
+ * danger = 1,
28
+ * warning = 2
29
+ * }
30
+ *
31
+ * interface IProps {
32
+ * info?: boolean
33
+ * danger?: boolean
34
+ * warning?: boolean
35
+ * }
36
+ *
37
+ * function toLevel(n: number): Level {
38
+ * switch (n) {
39
+ * case Level.info: return Level.info
40
+ * case Level.danger: return Level.danger
41
+ * case Level.warning: return Level.warning
42
+ * default: return Level.default
43
+ * }
44
+ * }
45
+ *
46
+ * const level = bitwiseOr([props.info, props.danger, props.warning])
47
+ *
48
+ * const levelEnum = toLevel(level)
49
+ * ```
50
+ */
51
+ export function bitwiseOr(flags: unknown[]): number {
52
+ return flags.reduce((mask: number, flag, i) => mask | (Number(flag) << i), 0)
53
+ }
54
+
55
+
56
+ /** given a number, it returns the number formed by the rightmost set bit as 1 and the 0s that comes after it
57
+ *
58
+ * ```ts
59
+ * getRightmostSetBitNumber(12) => 4 // 12(1100) => 4(100)
60
+ * getRightmostSetBitNumber(40) => 8 // 40(101000) => 8(1000)
61
+ * ```
62
+ *
63
+ * */
64
+
65
+ export function getRightmostSetBitNumber(n: number) {
66
+ return n & -n
67
+ }
@@ -0,0 +1,57 @@
1
+
2
+ /** even though we have null disabled in the repo,
3
+ * I still would not want isNil to skip checking null
4
+ * it is for juuuuust in case a third party sends us a null
5
+ * or something, and the types are not correct
6
+ */
7
+
8
+ /* eslint-disable no-null/no-null */
9
+ /* eslint-disable @typescript-eslint/ban-types */
10
+
11
+ export function isNil<T>(value: T | undefined | null): value is undefined | null {
12
+ return value === null || value === undefined
13
+ }
14
+
15
+ export function isDefined<T>(value: T | undefined | null): value is T {
16
+ return !isNil(value)
17
+ }
18
+
19
+ export function defaultTo<T>(value: T | undefined | null, fallback: T): T {
20
+ return isDefined(value) ? value : fallback
21
+ }
22
+
23
+ export function isEmpty<T extends { length: number }>(obj: T) {
24
+ return obj.length < 1
25
+ }
26
+
27
+ /** used for evaluating tri-state logic (true | false | undefined) */
28
+ export function is (pred?: boolean): boolean {
29
+ return isDefined(pred) && pred
30
+ }
31
+
32
+ export function toArray<T>(obj: T | T[] | undefined | null): T[] {
33
+ return isDefined(obj) ? Array.isArray(obj) ? obj : [obj] : []
34
+ }
35
+
36
+ export function safeArray<T>(arr: T[] | undefined | null): T[] {
37
+ return isDefined(arr) ? arr : []
38
+ }
39
+
40
+ export function safeCallback <T>(f?: (e: T) => void, e?: T) {
41
+ if (isDefined(f)) {
42
+ if (isDefined(e)) {
43
+ f(e)
44
+ } else {
45
+ (f as () => void)()
46
+ }
47
+ }
48
+ }
49
+
50
+ export {
51
+ first,
52
+ isString,
53
+ isFunction,
54
+ uniqueId,
55
+ debounce,
56
+ throttle,
57
+ } from 'lodash'
@@ -0,0 +1,126 @@
1
+ import { Children, CSSProperties, PureComponent, ReactElement, ReactNode } from 'react'
2
+ import { FC, PropsWithChildren } from './generic-types'
3
+ import { Nothing } from './nothing'
4
+ import { isDefined, isFunction, isNil } from './safe-navigation'
5
+
6
+ /**
7
+ * @TODO these aren't quiiiiite right
8
+ *
9
+ * They all say they return ReactNode but I feel like JSX.Element or something
10
+ * is more accurate? The child type needs to include _anything react can render_
11
+ * but it should also allow the caller to cloneElement on the results so that
12
+ * they can do stuff like
13
+ *
14
+ * const sections = getSlots(Section, children)
15
+ * .map((el, i) => i === 0 ? cloneElement(el, { first: true }) : el)
16
+ *
17
+ * Right? I want this...
18
+ * */
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ function isReactElement (obj?: any): obj is ReactElement {
22
+ // eslint-disable-next-line no-prototype-builtins
23
+ return isDefined(obj) && obj.hasOwnProperty('type')
24
+ }
25
+
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
27
+ export const isSlotOfType = <T extends typeof Slot>(type: T | FC) => (obj?: any): obj is T => {
28
+ return (
29
+ (isDefined(obj) &&
30
+ isReactElement(obj) &&
31
+ isDefined(obj.type) &&
32
+ (Object.getPrototypeOf(obj.type) === type || obj.type === type)) ||
33
+ (isDefined(obj.type) &&
34
+ isDefined(obj.type.target) &&
35
+ (Object.getPrototypeOf(obj.type.target) === type ||
36
+ obj.type.target === type))
37
+ )
38
+ }
39
+
40
+ const findSlotByType = <T extends typeof Slot>(type: T, children?: ReactNode): ReactElement => {
41
+ return Children.toArray(children).find(isSlotOfType(type)) as ReactElement
42
+ }
43
+
44
+ const filterSlotByType = <T extends typeof Slot>(type: T, children?: ReactNode): ReactElement[] => {
45
+ return Children.toArray(children).filter(isSlotOfType(type)) as ReactElement[]
46
+ }
47
+
48
+ export class Slot<T = unknown> extends PureComponent<PropsWithChildren<T>> {
49
+ override render () {
50
+ return this.props.children
51
+ }
52
+ }
53
+
54
+ export class StylableSlot extends Slot {
55
+ override render () {
56
+ return <div {...this.props}>{this.props.children}</div>
57
+ }
58
+ }
59
+
60
+ /** gets children that are _not_ slots */
61
+ export function getOtherChildren(children?: ReactNode): ReactNode[] {
62
+ return Children.toArray(children).filter((child) => !isSlotOfType(Slot)(child))
63
+ }
64
+
65
+ export function getSlots<T extends typeof Slot>(slot: T, children?: ReactNode): ReactElement[] {
66
+ const result = filterSlotByType(slot, children)
67
+
68
+ if (isNil(result)) {
69
+ return []
70
+ }
71
+
72
+ return result
73
+ }
74
+
75
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
76
+ function hasProps (obj: any): obj is { props: { children: ReactNode }} {
77
+ // eslint-disable-next-line no-prototype-builtins
78
+ return isDefined(obj) && obj.hasOwnProperty('props')
79
+ }
80
+
81
+ export function getSlot<T extends typeof Slot>(slot: T, children?: ReactNode): ReactElement {
82
+ const result = findSlotByType(slot, children)
83
+
84
+ if (isNil(result)) {
85
+ return <Nothing />
86
+ }
87
+
88
+ if (hasProps(result)) {
89
+ return result
90
+ }
91
+
92
+ return result
93
+ }
94
+
95
+ /** given a ReactElement, like a child, apply the given props to it */
96
+ export function applyProps<T>(element: ReactElement<T>, props: Partial<T>): ReactElement
97
+ export function applyProps<T>(element: ReactElement<T>, props: Partial<T> | ((props: T) => T)): ReactElement {
98
+ if (isFunction(props)) {
99
+ return {
100
+ ...element,
101
+ props: props(element.props)
102
+ }
103
+ }
104
+
105
+ return {
106
+ ...element,
107
+ props: {
108
+ ...element.props,
109
+ ...props,
110
+ },
111
+ }
112
+ }
113
+
114
+ /** given a ReactElement, like a child, apply the given styles to it, merging with the existing styles */
115
+ export function applyStyle(element: ReactElement, style: CSSProperties): ReactElement {
116
+ return {
117
+ ...element,
118
+ props: {
119
+ ...element.props,
120
+ style: {
121
+ ...element.props.style,
122
+ ...style,
123
+ },
124
+ },
125
+ }
126
+ }
@@ -0,0 +1,47 @@
1
+ import { toKebabCase } from './strings'
2
+
3
+ describe('strings', () => {
4
+ describe('toKebabCase', () => {
5
+ it('sends camel case to kebab case', () => {
6
+ const result = toKebabCase('helloMyFriends')
7
+
8
+ expect(result).toBe('hello-my-friends')
9
+ })
10
+
11
+ it('sends leading caps to kebab case', () => {
12
+ const result = toKebabCase('HelloMyFriends')
13
+
14
+ expect(result).toBe('hello-my-friends')
15
+ })
16
+
17
+ it('respects numbers', () => {
18
+ const result = toKebabCase('Section1IsGood')
19
+
20
+ expect(result).toBe('section-1-is-good')
21
+ })
22
+
23
+ it('respects leading and trailing numbers', () => {
24
+ const result = toKebabCase('1Section1')
25
+
26
+ expect(result).toBe('1-section-1')
27
+ })
28
+
29
+ it('removes non-alphanumeric characters, such as whitespace and punctuation', () => {
30
+ const result = toKebabCase('Help Text. Lorem Ipsum')
31
+
32
+ expect(result).toBe('help-text-lorem-ipsum')
33
+ })
34
+
35
+ it('removes leading and trailing nonsense', () => {
36
+ const result = toKebabCase('__Foo_Bar__')
37
+
38
+ expect(result).toBe('foo-bar')
39
+ })
40
+
41
+ it('removes leading and trailing whitespace', () => {
42
+ const result = toKebabCase(' . Foo_Bar_ _ . ')
43
+
44
+ expect(result).toBe('foo-bar')
45
+ })
46
+ })
47
+ })
@@ -0,0 +1,16 @@
1
+ import { isDefined } from './safe-navigation'
2
+
3
+ export const toKebabCase = (str: string) => {
4
+ return isDefined(str)
5
+ ? str
6
+ .replace(/[^a-zA-Z0-9\\-]/g, ' ')
7
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
8
+ .replace(/([0-9]+)(.*)/g, '$1-$2')
9
+ .replace(/(.*)([0-9]+)/g, '$1-$2')
10
+ .replace(/^[\s_]+/g, '')
11
+ .replace(/[\s_]+$/g, '')
12
+ .replace(/[\s_]+/g, '-')
13
+ .replace(/[^a-zA-Z0-9\\-]/g, '')
14
+ .toLowerCase()
15
+ : ''
16
+ }
@@ -0,0 +1,56 @@
1
+ /* eslint-disable no-console */
2
+ import { useState, useEffect } from 'react'
3
+ import { isDefined, isNil } from './safe-navigation'
4
+
5
+ const READ_ONLY_WARNING = 'Warning: You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`'
6
+ const UNCONTROLLED_TO_CONTROLLED = 'Warning: A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components'
7
+ const CONTROLLED_TO_UNCONTROLLED = 'Warning: A component is changing a controlled input to be uncontrolled. This is likely caused by the value changing from a defined to undefined, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components'
8
+
9
+ type IInputElementState<T> = [
10
+ T | undefined,
11
+ (change: T) => void
12
+ ]
13
+
14
+ /**
15
+ *
16
+ * This hook is to help implement a common pattern:
17
+ *
18
+ * <input onChange={doSomething} /> // uncontrolled
19
+ * <input value={1} /> // should be marked read only
20
+ * <input value={state} onChange={setState} /> // controlled
21
+ *
22
+ * I've reimplemented this logic a few times, but now I have a nice helper :D
23
+ *
24
+ * const [state, setState] = useInputElementState({
25
+ * value: props.value,
26
+ * defaultValue: props.defaultValue, // the value to use if value is undefined
27
+ * onChange: props.onChange,
28
+ * })
29
+ *
30
+ * if you give it nothing, you get state, setState for internal state management (uncontrolled input)
31
+ * if you give it value only, you get a warning
32
+ * if you give it value and onChange, state management if deferred to the parent (controlled input)
33
+ */
34
+ export function useInputElementState<T>(props: { value?: T, defaultValue?: T, onChange?: (change: T) => void }): IInputElementState<T> {
35
+ const [initialValue] = useState(props.value)
36
+ const [state, setState] = useState(props.defaultValue)
37
+
38
+ const { value = state, onChange = setState } = props
39
+
40
+ useEffect(() => {
41
+ if (initialValue === undefined && props.value !== undefined) {
42
+ console.error(UNCONTROLLED_TO_CONTROLLED)
43
+ } else if (initialValue !== undefined && props.value === undefined) {
44
+ console.error(CONTROLLED_TO_UNCONTROLLED)
45
+ }
46
+ }, [props.value, initialValue])
47
+
48
+ if ( isDefined(props.value) && isNil(props.onChange)) {
49
+ console.error(READ_ONLY_WARNING)
50
+ }
51
+
52
+ return [
53
+ value,
54
+ onChange,
55
+ ]
56
+ }
@@ -0,0 +1,17 @@
1
+ import { useEffect } from 'react'
2
+
3
+ export function useKeyDown(targetKey: string, handler: () => void) {
4
+ function downHandler({ key }: { key: string}) {
5
+ if (key === targetKey) {
6
+ handler()
7
+ }
8
+ }
9
+
10
+ useEffect(() => {
11
+ window.addEventListener('keydown', downHandler)
12
+ return () => {
13
+ window.removeEventListener('keydown', downHandler)
14
+ }
15
+ }, [])
16
+ return
17
+ }