@wordpress/components 19.12.0 → 19.13.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 (717) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/CONTRIBUTING.md +94 -12
  3. package/build/alignment-matrix-control/index.js +3 -3
  4. package/build/alignment-matrix-control/index.js.map +1 -1
  5. package/build/angle-picker-control/index.js +2 -2
  6. package/build/angle-picker-control/index.js.map +1 -1
  7. package/build/border-box-control/border-box-control-linked-button/component.js.map +1 -1
  8. package/build/border-box-control/utils.js.map +1 -1
  9. package/build/border-control/border-control/hook.js.map +1 -1
  10. package/build/box-control/all-input-control.js +6 -10
  11. package/build/box-control/all-input-control.js.map +1 -1
  12. package/build/box-control/axial-input-controls.js.map +1 -1
  13. package/build/box-control/index.js +3 -7
  14. package/build/box-control/index.js.map +1 -1
  15. package/build/box-control/input-controls.js +6 -10
  16. package/build/box-control/input-controls.js.map +1 -1
  17. package/build/box-control/unit-control.js +4 -4
  18. package/build/box-control/unit-control.js.map +1 -1
  19. package/build/button/index.native.js +1 -3
  20. package/build/button/index.native.js.map +1 -1
  21. package/build/checkbox-control/index.js.map +1 -1
  22. package/build/color-picker/index.native.js.map +1 -1
  23. package/build/combobox-control/index.js +4 -2
  24. package/build/combobox-control/index.js.map +1 -1
  25. package/build/confirm-dialog/component.js.map +1 -1
  26. package/build/custom-gradient-bar/constants.js +1 -3
  27. package/build/custom-gradient-bar/constants.js.map +1 -1
  28. package/build/custom-gradient-bar/control-points.js +15 -8
  29. package/build/custom-gradient-bar/control-points.js.map +1 -1
  30. package/build/custom-gradient-bar/index.js +5 -5
  31. package/build/custom-gradient-bar/index.js.map +1 -1
  32. package/build/custom-gradient-bar/utils.js +5 -7
  33. package/build/custom-gradient-bar/utils.js.map +1 -1
  34. package/build/custom-gradient-picker/utils.js.map +1 -1
  35. package/build/custom-select-control/index.js.map +1 -1
  36. package/build/date-time/date/index.js +4 -4
  37. package/build/date-time/date/index.js.map +1 -1
  38. package/build/date-time/date-time/index.js +3 -3
  39. package/build/date-time/date-time/index.js.map +1 -1
  40. package/build/dimension-control/index.js +1 -3
  41. package/build/dimension-control/index.js.map +1 -1
  42. package/build/divider/styles.js +5 -5
  43. package/build/divider/styles.js.map +1 -1
  44. package/build/draggable/index.js.map +1 -1
  45. package/build/draggable/index.native.js +6 -1
  46. package/build/draggable/index.native.js.map +1 -1
  47. package/build/drop-zone/provider.js.map +1 -1
  48. package/build/dropdown/index.js +2 -2
  49. package/build/dropdown/index.js.map +1 -1
  50. package/build/dropdown-menu/index.js +13 -2
  51. package/build/dropdown-menu/index.js.map +1 -1
  52. package/build/dropdown-menu/index.native.js +13 -2
  53. package/build/dropdown-menu/index.native.js.map +1 -1
  54. package/build/external-link/index.js +20 -8
  55. package/build/external-link/index.js.map +1 -1
  56. package/build/external-link/styles/external-link-styles.js +3 -3
  57. package/build/external-link/styles/external-link-styles.js.map +1 -1
  58. package/build/external-link/types.js +6 -0
  59. package/build/external-link/types.js.map +1 -0
  60. package/build/flex/flex/hook.js +9 -5
  61. package/build/flex/flex/hook.js.map +1 -1
  62. package/build/focal-point-picker/controls.js +3 -7
  63. package/build/focal-point-picker/controls.js.map +1 -1
  64. package/build/focal-point-picker/index.js.map +1 -1
  65. package/build/focal-point-picker/media.js +4 -8
  66. package/build/focal-point-picker/media.js.map +1 -1
  67. package/build/font-size-picker/index.js +1 -1
  68. package/build/font-size-picker/index.js.map +1 -1
  69. package/build/form-toggle/index.js +6 -4
  70. package/build/form-toggle/index.js.map +1 -1
  71. package/build/form-token-field/index.js +328 -359
  72. package/build/form-token-field/index.js.map +1 -1
  73. package/build/form-token-field/suggestions-list.js +26 -20
  74. package/build/form-token-field/suggestions-list.js.map +1 -1
  75. package/build/form-token-field/token-input.js +39 -53
  76. package/build/form-token-field/token-input.js.map +1 -1
  77. package/build/form-token-field/token.js +3 -3
  78. package/build/form-token-field/token.js.map +1 -1
  79. package/build/form-token-field/types.js +6 -0
  80. package/build/form-token-field/types.js.map +1 -0
  81. package/build/gradient-picker/index.js.map +1 -1
  82. package/build/heading/hook.js.map +1 -1
  83. package/build/higher-order/navigate-regions/index.js.map +1 -1
  84. package/build/higher-order/with-focus-return/index.js.map +1 -1
  85. package/build/higher-order/with-spoken-messages/index.js.map +1 -1
  86. package/build/icon/index.js.map +1 -1
  87. package/build/input-control/index.js +5 -5
  88. package/build/input-control/index.js.map +1 -1
  89. package/build/input-control/input-field.js +10 -10
  90. package/build/input-control/input-field.js.map +1 -1
  91. package/build/input-control/reducer/reducer.js.map +1 -1
  92. package/build/input-control/utils.js +1 -1
  93. package/build/input-control/utils.js.map +1 -1
  94. package/build/menu-items-choice/index.js +3 -7
  95. package/build/menu-items-choice/index.js.map +1 -1
  96. package/build/mobile/bottom-sheet/bottom-sheet-context.native.js.map +1 -1
  97. package/build/mobile/bottom-sheet/cell.native.js.map +1 -1
  98. package/build/mobile/bottom-sheet/cycle-picker-cell.native.js +1 -7
  99. package/build/mobile/bottom-sheet/cycle-picker-cell.native.js.map +1 -1
  100. package/build/mobile/bottom-sheet/index.native.js.map +1 -1
  101. package/build/mobile/bottom-sheet/picker-cell.native.js.map +1 -1
  102. package/build/mobile/bottom-sheet/stepper-cell/index.native.js.map +1 -1
  103. package/build/mobile/color-settings/index.native.js.map +1 -1
  104. package/build/mobile/global-styles-context/index.native.js.map +1 -1
  105. package/build/mobile/gradient/index.native.js.map +1 -1
  106. package/build/mobile/html-text-input/index.native.js.map +1 -1
  107. package/build/mobile/inserter-button/index.native.js.map +1 -1
  108. package/build/mobile/link-settings/image-link-destinations-screen.native.js.map +1 -1
  109. package/build/mobile/media-edit/index.native.js.map +1 -1
  110. package/build/mobile/segmented-control/index.native.js +1 -1
  111. package/build/mobile/segmented-control/index.native.js.map +1 -1
  112. package/build/modal/index.js +1 -1
  113. package/build/modal/index.js.map +1 -1
  114. package/build/navigable-container/container.js +4 -2
  115. package/build/navigable-container/container.js.map +1 -1
  116. package/build/navigation/context.js +12 -16
  117. package/build/navigation/context.js.map +1 -1
  118. package/build/navigation/index.js +3 -3
  119. package/build/navigation/index.js.map +1 -1
  120. package/build/navigation/item/index.js +3 -3
  121. package/build/navigation/item/index.js.map +1 -1
  122. package/build/navigator/navigator-back-button/hook.js.map +1 -1
  123. package/build/navigator/navigator-button/hook.js.map +1 -1
  124. package/build/navigator/navigator-provider/component.js +1 -1
  125. package/build/navigator/navigator-provider/component.js.map +1 -1
  126. package/build/navigator/navigator-screen/component.js +1 -1
  127. package/build/navigator/navigator-screen/component.js.map +1 -1
  128. package/build/notice/index.js +5 -5
  129. package/build/notice/index.js.map +1 -1
  130. package/build/notice/list.js +4 -2
  131. package/build/notice/list.js.map +1 -1
  132. package/build/panel/body.js +3 -3
  133. package/build/panel/body.js.map +1 -1
  134. package/build/placeholder/index.js +26 -12
  135. package/build/placeholder/index.js.map +1 -1
  136. package/build/radio-control/index.js +43 -7
  137. package/build/radio-control/index.js.map +1 -1
  138. package/build/radio-control/types.js +6 -0
  139. package/build/radio-control/types.js.map +1 -0
  140. package/build/range-control/index.js +8 -6
  141. package/build/range-control/index.js.map +1 -1
  142. package/build/range-control/input-range.js +6 -10
  143. package/build/range-control/input-range.js.map +1 -1
  144. package/build/range-control/utils.js +7 -5
  145. package/build/range-control/utils.js.map +1 -1
  146. package/build/resizable-box/resize-tooltip/index.js +3 -3
  147. package/build/resizable-box/resize-tooltip/index.js.map +1 -1
  148. package/build/resizable-box/resize-tooltip/utils.js +4 -7
  149. package/build/resizable-box/resize-tooltip/utils.js.map +1 -1
  150. package/build/responsive-wrapper/index.js.map +1 -1
  151. package/build/select-control/index.js +5 -3
  152. package/build/select-control/index.js.map +1 -1
  153. package/build/slot-fill/fill.js +1 -7
  154. package/build/slot-fill/fill.js.map +1 -1
  155. package/build/slot-fill/slot.js +14 -3
  156. package/build/slot-fill/slot.js.map +1 -1
  157. package/build/snackbar/index.js +7 -7
  158. package/build/snackbar/index.js.map +1 -1
  159. package/build/snackbar/list.js +3 -1
  160. package/build/snackbar/list.js.map +1 -1
  161. package/build/tab-panel/index.js +3 -1
  162. package/build/tab-panel/index.js.map +1 -1
  163. package/build/text/hook.js +4 -4
  164. package/build/text/hook.js.map +1 -1
  165. package/build/text/utils.js.map +1 -1
  166. package/build/toggle-control/index.js +1 -3
  167. package/build/toggle-control/index.js.map +1 -1
  168. package/build/toggle-control/index.native.js +1 -7
  169. package/build/toggle-control/index.native.js.map +1 -1
  170. package/build/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -1
  171. package/build/toolbar/index.js.map +1 -1
  172. package/build/tools-panel/tools-panel/hook.js.map +1 -1
  173. package/build/tools-panel/tools-panel-header/hook.js.map +1 -1
  174. package/build/tooltip/index.js +2 -1
  175. package/build/tooltip/index.js.map +1 -1
  176. package/build/tree-grid/roving-tab-index-item.js.map +1 -1
  177. package/build/tree-select/index.js +57 -4
  178. package/build/tree-select/index.js.map +1 -1
  179. package/build/tree-select/types.js +6 -0
  180. package/build/tree-select/types.js.map +1 -0
  181. package/build/ui/form-group/form-group-content.js.map +1 -1
  182. package/build/unit-control/index.js.map +1 -1
  183. package/build/utils/unit-values.js.map +1 -1
  184. package/build/utils/values.js.map +1 -1
  185. package/build/z-stack/component.js +22 -3
  186. package/build/z-stack/component.js.map +1 -1
  187. package/build/z-stack/types.js +6 -0
  188. package/build/z-stack/types.js.map +1 -0
  189. package/build-module/alignment-matrix-control/index.js +2 -1
  190. package/build-module/alignment-matrix-control/index.js.map +1 -1
  191. package/build-module/angle-picker-control/index.js +1 -1
  192. package/build-module/angle-picker-control/index.js.map +1 -1
  193. package/build-module/border-box-control/border-box-control-linked-button/component.js.map +1 -1
  194. package/build-module/border-box-control/utils.js.map +1 -1
  195. package/build-module/border-control/border-control/hook.js.map +1 -1
  196. package/build-module/box-control/all-input-control.js +3 -5
  197. package/build-module/box-control/all-input-control.js.map +1 -1
  198. package/build-module/box-control/axial-input-controls.js.map +1 -1
  199. package/build-module/box-control/index.js +2 -5
  200. package/build-module/box-control/index.js.map +1 -1
  201. package/build-module/box-control/input-controls.js +3 -5
  202. package/build-module/box-control/input-controls.js.map +1 -1
  203. package/build-module/box-control/unit-control.js +3 -1
  204. package/build-module/box-control/unit-control.js.map +1 -1
  205. package/build-module/button/index.native.js +1 -2
  206. package/build-module/button/index.native.js.map +1 -1
  207. package/build-module/checkbox-control/index.js.map +1 -1
  208. package/build-module/color-picker/index.native.js.map +1 -1
  209. package/build-module/combobox-control/index.js +5 -2
  210. package/build-module/combobox-control/index.js.map +1 -1
  211. package/build-module/confirm-dialog/component.js.map +1 -1
  212. package/build-module/custom-gradient-bar/constants.js +0 -1
  213. package/build-module/custom-gradient-bar/constants.js.map +1 -1
  214. package/build-module/custom-gradient-bar/control-points.js +16 -9
  215. package/build-module/custom-gradient-bar/control-points.js.map +1 -1
  216. package/build-module/custom-gradient-bar/index.js +6 -6
  217. package/build-module/custom-gradient-bar/index.js.map +1 -1
  218. package/build-module/custom-gradient-bar/utils.js +6 -8
  219. package/build-module/custom-gradient-bar/utils.js.map +1 -1
  220. package/build-module/custom-gradient-picker/utils.js.map +1 -1
  221. package/build-module/custom-select-control/index.js.map +1 -1
  222. package/build-module/date-time/date/index.js +4 -3
  223. package/build-module/date-time/date/index.js.map +1 -1
  224. package/build-module/date-time/date-time/index.js +2 -1
  225. package/build-module/date-time/date-time/index.js.map +1 -1
  226. package/build-module/dimension-control/index.js +1 -2
  227. package/build-module/dimension-control/index.js.map +1 -1
  228. package/build-module/divider/styles.js +5 -5
  229. package/build-module/divider/styles.js.map +1 -1
  230. package/build-module/draggable/index.js.map +1 -1
  231. package/build-module/draggable/index.native.js +6 -1
  232. package/build-module/draggable/index.native.js.map +1 -1
  233. package/build-module/drop-zone/provider.js.map +1 -1
  234. package/build-module/dropdown/index.js +2 -2
  235. package/build-module/dropdown/index.js.map +1 -1
  236. package/build-module/dropdown-menu/index.js +12 -1
  237. package/build-module/dropdown-menu/index.js.map +1 -1
  238. package/build-module/dropdown-menu/index.native.js +12 -1
  239. package/build-module/dropdown-menu/index.native.js.map +1 -1
  240. package/build-module/external-link/index.js +22 -7
  241. package/build-module/external-link/index.js.map +1 -1
  242. package/build-module/external-link/styles/external-link-styles.js +3 -3
  243. package/build-module/external-link/styles/external-link-styles.js.map +1 -1
  244. package/build-module/external-link/types.js +2 -0
  245. package/build-module/external-link/types.js.map +1 -0
  246. package/build-module/flex/flex/hook.js +7 -5
  247. package/build-module/flex/flex/hook.js.map +1 -1
  248. package/build-module/focal-point-picker/controls.js +3 -5
  249. package/build-module/focal-point-picker/controls.js.map +1 -1
  250. package/build-module/focal-point-picker/index.js.map +1 -1
  251. package/build-module/focal-point-picker/media.js +3 -5
  252. package/build-module/focal-point-picker/media.js.map +1 -1
  253. package/build-module/font-size-picker/index.js +1 -1
  254. package/build-module/font-size-picker/index.js.map +1 -1
  255. package/build-module/form-toggle/index.js +1 -1
  256. package/build-module/form-toggle/index.js.map +1 -1
  257. package/build-module/form-token-field/index.js +329 -361
  258. package/build-module/form-token-field/index.js.map +1 -1
  259. package/build-module/form-token-field/suggestions-list.js +32 -23
  260. package/build-module/form-token-field/suggestions-list.js.map +1 -1
  261. package/build-module/form-token-field/token-input.js +43 -58
  262. package/build-module/form-token-field/token-input.js.map +1 -1
  263. package/build-module/form-token-field/token.js +3 -1
  264. package/build-module/form-token-field/token.js.map +1 -1
  265. package/build-module/form-token-field/types.js +2 -0
  266. package/build-module/form-token-field/types.js.map +1 -0
  267. package/build-module/gradient-picker/index.js.map +1 -1
  268. package/build-module/heading/hook.js.map +1 -1
  269. package/build-module/higher-order/navigate-regions/index.js.map +1 -1
  270. package/build-module/higher-order/with-focus-return/index.js.map +1 -1
  271. package/build-module/higher-order/with-spoken-messages/index.js.map +1 -1
  272. package/build-module/icon/index.js.map +1 -1
  273. package/build-module/input-control/index.js +2 -1
  274. package/build-module/input-control/index.js.map +1 -1
  275. package/build-module/input-control/input-field.js +2 -1
  276. package/build-module/input-control/input-field.js.map +1 -1
  277. package/build-module/input-control/reducer/reducer.js.map +1 -1
  278. package/build-module/input-control/utils.js +1 -1
  279. package/build-module/input-control/utils.js.map +1 -1
  280. package/build-module/menu-items-choice/index.js +3 -5
  281. package/build-module/menu-items-choice/index.js.map +1 -1
  282. package/build-module/mobile/bottom-sheet/bottom-sheet-context.native.js.map +1 -1
  283. package/build-module/mobile/bottom-sheet/cell.native.js.map +1 -1
  284. package/build-module/mobile/bottom-sheet/cycle-picker-cell.native.js +1 -6
  285. package/build-module/mobile/bottom-sheet/cycle-picker-cell.native.js.map +1 -1
  286. package/build-module/mobile/bottom-sheet/index.native.js.map +1 -1
  287. package/build-module/mobile/bottom-sheet/picker-cell.native.js.map +1 -1
  288. package/build-module/mobile/bottom-sheet/stepper-cell/index.native.js.map +1 -1
  289. package/build-module/mobile/color-settings/index.native.js.map +1 -1
  290. package/build-module/mobile/global-styles-context/index.native.js.map +1 -1
  291. package/build-module/mobile/gradient/index.native.js.map +1 -1
  292. package/build-module/mobile/html-text-input/index.native.js.map +1 -1
  293. package/build-module/mobile/inserter-button/index.native.js.map +1 -1
  294. package/build-module/mobile/link-settings/image-link-destinations-screen.native.js.map +1 -1
  295. package/build-module/mobile/media-edit/index.native.js.map +1 -1
  296. package/build-module/mobile/segmented-control/index.native.js +2 -2
  297. package/build-module/mobile/segmented-control/index.native.js.map +1 -1
  298. package/build-module/modal/index.js +1 -1
  299. package/build-module/modal/index.js.map +1 -1
  300. package/build-module/navigable-container/container.js +5 -2
  301. package/build-module/navigable-container/container.js.map +1 -1
  302. package/build-module/navigation/context.js +3 -5
  303. package/build-module/navigation/context.js.map +1 -1
  304. package/build-module/navigation/index.js +3 -1
  305. package/build-module/navigation/index.js.map +1 -1
  306. package/build-module/navigation/item/index.js +3 -1
  307. package/build-module/navigation/item/index.js.map +1 -1
  308. package/build-module/navigator/navigator-back-button/hook.js.map +1 -1
  309. package/build-module/navigator/navigator-button/hook.js.map +1 -1
  310. package/build-module/navigator/navigator-provider/component.js +1 -1
  311. package/build-module/navigator/navigator-provider/component.js.map +1 -1
  312. package/build-module/navigator/navigator-screen/component.js +1 -1
  313. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  314. package/build-module/notice/index.js +2 -1
  315. package/build-module/notice/index.js.map +1 -1
  316. package/build-module/notice/list.js +4 -1
  317. package/build-module/notice/list.js.map +1 -1
  318. package/build-module/panel/body.js +3 -1
  319. package/build-module/panel/body.js.map +1 -1
  320. package/build-module/placeholder/index.js +24 -11
  321. package/build-module/placeholder/index.js.map +1 -1
  322. package/build-module/radio-control/index.js +40 -7
  323. package/build-module/radio-control/index.js.map +1 -1
  324. package/build-module/radio-control/types.js +2 -0
  325. package/build-module/radio-control/types.js.map +1 -0
  326. package/build-module/range-control/index.js +4 -2
  327. package/build-module/range-control/index.js.map +1 -1
  328. package/build-module/range-control/input-range.js +2 -5
  329. package/build-module/range-control/input-range.js.map +1 -1
  330. package/build-module/range-control/utils.js +4 -1
  331. package/build-module/range-control/utils.js.map +1 -1
  332. package/build-module/resizable-box/resize-tooltip/index.js +2 -1
  333. package/build-module/resizable-box/resize-tooltip/index.js.map +1 -1
  334. package/build-module/resizable-box/resize-tooltip/utils.js +3 -5
  335. package/build-module/resizable-box/resize-tooltip/utils.js.map +1 -1
  336. package/build-module/responsive-wrapper/index.js.map +1 -1
  337. package/build-module/select-control/index.js +3 -1
  338. package/build-module/select-control/index.js.map +1 -1
  339. package/build-module/slot-fill/fill.js +1 -6
  340. package/build-module/slot-fill/fill.js.map +1 -1
  341. package/build-module/slot-fill/slot.js +12 -2
  342. package/build-module/slot-fill/slot.js.map +1 -1
  343. package/build-module/snackbar/index.js +3 -1
  344. package/build-module/snackbar/index.js.map +1 -1
  345. package/build-module/snackbar/list.js +4 -1
  346. package/build-module/snackbar/list.js.map +1 -1
  347. package/build-module/tab-panel/index.js +3 -1
  348. package/build-module/tab-panel/index.js.map +1 -1
  349. package/build-module/text/hook.js +4 -4
  350. package/build-module/text/hook.js.map +1 -1
  351. package/build-module/text/utils.js.map +1 -1
  352. package/build-module/toggle-control/index.js +1 -2
  353. package/build-module/toggle-control/index.js.map +1 -1
  354. package/build-module/toggle-control/index.native.js +1 -6
  355. package/build-module/toggle-control/index.native.js.map +1 -1
  356. package/build-module/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.js.map +1 -1
  357. package/build-module/toolbar/index.js.map +1 -1
  358. package/build-module/tools-panel/tools-panel/hook.js.map +1 -1
  359. package/build-module/tools-panel/tools-panel-header/hook.js.map +1 -1
  360. package/build-module/tooltip/index.js +2 -1
  361. package/build-module/tooltip/index.js.map +1 -1
  362. package/build-module/tree-grid/roving-tab-index-item.js.map +1 -1
  363. package/build-module/tree-select/index.js +53 -3
  364. package/build-module/tree-select/index.js.map +1 -1
  365. package/build-module/tree-select/types.js +2 -0
  366. package/build-module/tree-select/types.js.map +1 -0
  367. package/build-module/ui/form-group/form-group-content.js.map +1 -1
  368. package/build-module/unit-control/index.js.map +1 -1
  369. package/build-module/utils/unit-values.js.map +1 -1
  370. package/build-module/utils/values.js.map +1 -1
  371. package/build-module/z-stack/component.js +21 -2
  372. package/build-module/z-stack/component.js.map +1 -1
  373. package/build-module/z-stack/types.js +2 -0
  374. package/build-module/z-stack/types.js.map +1 -0
  375. package/build-style/style-rtl.css +32 -3
  376. package/build-style/style.css +32 -4
  377. package/build-types/base-control/stories/index.d.ts.map +1 -1
  378. package/build-types/base-field/hook.d.ts +0 -1
  379. package/build-types/base-field/hook.d.ts.map +1 -1
  380. package/build-types/border-box-control/border-box-control/hook.d.ts +0 -1
  381. package/build-types/border-box-control/border-box-control/hook.d.ts.map +1 -1
  382. package/build-types/border-box-control/border-box-control-linked-button/component.d.ts.map +1 -1
  383. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts +0 -1
  384. package/build-types/border-box-control/border-box-control-linked-button/hook.d.ts.map +1 -1
  385. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts +0 -1
  386. package/build-types/border-box-control/border-box-control-split-controls/hook.d.ts.map +1 -1
  387. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts +0 -1
  388. package/build-types/border-box-control/border-box-control-visualizer/hook.d.ts.map +1 -1
  389. package/build-types/border-box-control/utils.d.ts.map +1 -1
  390. package/build-types/border-control/border-control/hook.d.ts +0 -1
  391. package/build-types/border-control/border-control/hook.d.ts.map +1 -1
  392. package/build-types/border-control/border-control-dropdown/hook.d.ts +0 -1
  393. package/build-types/border-control/border-control-dropdown/hook.d.ts.map +1 -1
  394. package/build-types/border-control/border-control-style-picker/hook.d.ts +0 -1
  395. package/build-types/border-control/border-control-style-picker/hook.d.ts.map +1 -1
  396. package/build-types/button-group/index.d.ts +1 -1
  397. package/build-types/button-group/index.d.ts.map +1 -1
  398. package/build-types/card/card/hook.d.ts +0 -1
  399. package/build-types/card/card/hook.d.ts.map +1 -1
  400. package/build-types/card/card-body/hook.d.ts +0 -1
  401. package/build-types/card/card-body/hook.d.ts.map +1 -1
  402. package/build-types/card/card-divider/hook.d.ts +0 -1
  403. package/build-types/card/card-divider/hook.d.ts.map +1 -1
  404. package/build-types/card/card-footer/hook.d.ts +0 -1
  405. package/build-types/card/card-footer/hook.d.ts.map +1 -1
  406. package/build-types/card/card-header/hook.d.ts +0 -1
  407. package/build-types/card/card-header/hook.d.ts.map +1 -1
  408. package/build-types/card/card-media/hook.d.ts +0 -1
  409. package/build-types/card/card-media/hook.d.ts.map +1 -1
  410. package/build-types/checkbox-control/index.d.ts.map +1 -1
  411. package/build-types/checkbox-control/stories/index.d.ts.map +1 -1
  412. package/build-types/color-picker/styles.d.ts +7 -7
  413. package/build-types/confirm-dialog/component.d.ts.map +1 -1
  414. package/build-types/date-time/date/index.d.ts.map +1 -1
  415. package/build-types/date-time/date-time/index.d.ts.map +1 -1
  416. package/build-types/date-time/stories/date-time.d.ts.map +1 -1
  417. package/build-types/date-time/stories/date.d.ts.map +1 -1
  418. package/build-types/date-time/time/styles.d.ts +1 -1
  419. package/build-types/divider/styles.d.ts.map +1 -1
  420. package/build-types/dropdown-menu/index.d.ts.map +1 -1
  421. package/build-types/elevation/hook.d.ts +0 -1
  422. package/build-types/elevation/hook.d.ts.map +1 -1
  423. package/build-types/external-link/index.d.ts +17 -0
  424. package/build-types/external-link/index.d.ts.map +1 -0
  425. package/build-types/external-link/stories/index.d.ts +12 -0
  426. package/build-types/external-link/stories/index.d.ts.map +1 -0
  427. package/build-types/external-link/styles/external-link-styles.d.ts +10 -0
  428. package/build-types/external-link/styles/external-link-styles.d.ts.map +1 -0
  429. package/build-types/external-link/types.d.ts +15 -0
  430. package/build-types/external-link/types.d.ts.map +1 -0
  431. package/build-types/flex/flex/hook.d.ts +0 -1
  432. package/build-types/flex/flex/hook.d.ts.map +1 -1
  433. package/build-types/flex/flex-block/hook.d.ts +0 -1
  434. package/build-types/flex/flex-block/hook.d.ts.map +1 -1
  435. package/build-types/flex/flex-item/hook.d.ts +0 -1
  436. package/build-types/flex/flex-item/hook.d.ts.map +1 -1
  437. package/build-types/form-token-field/index.d.ts +15 -0
  438. package/build-types/form-token-field/index.d.ts.map +1 -0
  439. package/build-types/form-token-field/stories/index.d.ts +13 -0
  440. package/build-types/form-token-field/stories/index.d.ts.map +1 -0
  441. package/build-types/form-token-field/suggestions-list.d.ts +10 -0
  442. package/build-types/form-token-field/suggestions-list.d.ts.map +1 -0
  443. package/build-types/form-token-field/test/lib/fixtures.d.ts +26 -0
  444. package/build-types/form-token-field/test/lib/fixtures.d.ts.map +1 -0
  445. package/build-types/form-token-field/test/lib/token-field-wrapper.d.ts +18 -0
  446. package/build-types/form-token-field/test/lib/token-field-wrapper.d.ts.map +1 -0
  447. package/build-types/form-token-field/token-input.d.ts +12 -0
  448. package/build-types/form-token-field/token-input.d.ts.map +1 -0
  449. package/build-types/form-token-field/token.d.ts +4 -0
  450. package/build-types/form-token-field/token.d.ts.map +1 -0
  451. package/build-types/form-token-field/types.d.ts +176 -0
  452. package/build-types/form-token-field/types.d.ts.map +1 -0
  453. package/build-types/grid/hook.d.ts +0 -1
  454. package/build-types/grid/hook.d.ts.map +1 -1
  455. package/build-types/h-stack/hook.d.ts +0 -1
  456. package/build-types/h-stack/hook.d.ts.map +1 -1
  457. package/build-types/heading/hook.d.ts +0 -1
  458. package/build-types/heading/hook.d.ts.map +1 -1
  459. package/build-types/higher-order/with-focus-outside/index.d.ts +1 -1
  460. package/build-types/input-control/index.d.ts +1 -1
  461. package/build-types/input-control/index.d.ts.map +1 -1
  462. package/build-types/input-control/input-field.d.ts +1 -1
  463. package/build-types/input-control/input-field.d.ts.map +1 -1
  464. package/build-types/input-control/reducer/reducer.d.ts.map +1 -1
  465. package/build-types/input-control/stories/index.d.ts +5 -5
  466. package/build-types/input-control/stories/index.d.ts.map +1 -1
  467. package/build-types/item-group/item/hook.d.ts +0 -1
  468. package/build-types/item-group/item/hook.d.ts.map +1 -1
  469. package/build-types/item-group/item-group/hook.d.ts +0 -1
  470. package/build-types/item-group/item-group/hook.d.ts.map +1 -1
  471. package/build-types/navigator/navigator-back-button/hook.d.ts +0 -1
  472. package/build-types/navigator/navigator-back-button/hook.d.ts.map +1 -1
  473. package/build-types/navigator/navigator-button/hook.d.ts +0 -1
  474. package/build-types/navigator/navigator-button/hook.d.ts.map +1 -1
  475. package/build-types/navigator/navigator-provider/component.d.ts.map +1 -1
  476. package/build-types/number-control/styles/number-control-styles.d.ts +1 -1
  477. package/build-types/radio-control/index.d.ts +31 -0
  478. package/build-types/radio-control/index.d.ts.map +1 -0
  479. package/build-types/radio-control/stories/index.d.ts +12 -0
  480. package/build-types/radio-control/stories/index.d.ts.map +1 -0
  481. package/build-types/radio-control/types.d.ts +29 -0
  482. package/build-types/radio-control/types.d.ts.map +1 -0
  483. package/build-types/range-control/index.d.ts +5 -5
  484. package/build-types/range-control/index.d.ts.map +1 -1
  485. package/build-types/range-control/input-range.d.ts +4 -4
  486. package/build-types/range-control/input-range.d.ts.map +1 -1
  487. package/build-types/range-control/utils.d.ts.map +1 -1
  488. package/build-types/resizable-box/resize-tooltip/index.d.ts.map +1 -1
  489. package/build-types/resizable-box/resize-tooltip/utils.d.ts.map +1 -1
  490. package/build-types/scrollable/hook.d.ts +0 -1
  491. package/build-types/scrollable/hook.d.ts.map +1 -1
  492. package/build-types/select-control/index.d.ts +1 -1
  493. package/build-types/select-control/index.d.ts.map +1 -1
  494. package/build-types/select-control/stories/index.d.ts +3 -3
  495. package/build-types/select-control/stories/index.d.ts.map +1 -1
  496. package/build-types/slot-fill/fill.d.ts.map +1 -1
  497. package/build-types/slot-fill/slot.d.ts.map +1 -1
  498. package/build-types/spacer/hook.d.ts +0 -1
  499. package/build-types/spacer/hook.d.ts.map +1 -1
  500. package/build-types/surface/hook.d.ts +0 -1
  501. package/build-types/surface/hook.d.ts.map +1 -1
  502. package/build-types/text/hook.d.ts +0 -1
  503. package/build-types/text/hook.d.ts.map +1 -1
  504. package/build-types/text/utils.d.ts.map +1 -1
  505. package/build-types/text-control/index.d.ts +1 -1
  506. package/build-types/text-control/index.d.ts.map +1 -1
  507. package/build-types/text-control/stories/index.d.ts.map +1 -1
  508. package/build-types/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.d.ts.map +1 -1
  509. package/build-types/tools-panel/tools-panel/hook.d.ts +0 -1
  510. package/build-types/tools-panel/tools-panel/hook.d.ts.map +1 -1
  511. package/build-types/tools-panel/tools-panel-header/hook.d.ts +0 -1
  512. package/build-types/tools-panel/tools-panel-header/hook.d.ts.map +1 -1
  513. package/build-types/tools-panel/tools-panel-item/hook.d.ts +0 -1
  514. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  515. package/build-types/tooltip/index.d.ts.map +1 -1
  516. package/build-types/tree-select/index.d.ts +53 -0
  517. package/build-types/tree-select/index.d.ts.map +1 -0
  518. package/build-types/tree-select/stories/index.d.ts +12 -0
  519. package/build-types/tree-select/stories/index.d.ts.map +1 -0
  520. package/build-types/tree-select/types.d.ts +30 -0
  521. package/build-types/tree-select/types.d.ts.map +1 -0
  522. package/build-types/truncate/hook.d.ts +0 -1
  523. package/build-types/truncate/hook.d.ts.map +1 -1
  524. package/build-types/ui/context/wordpress-component.d.ts.map +1 -1
  525. package/build-types/ui/control-group/hook.d.ts +0 -1
  526. package/build-types/ui/control-group/hook.d.ts.map +1 -1
  527. package/build-types/ui/control-label/hook.d.ts +0 -1
  528. package/build-types/ui/control-label/hook.d.ts.map +1 -1
  529. package/build-types/ui/form-group/use-form-group.d.ts +0 -2
  530. package/build-types/ui/form-group/use-form-group.d.ts.map +1 -1
  531. package/build-types/unit-control/index.d.ts +1 -1
  532. package/build-types/unit-control/index.d.ts.map +1 -1
  533. package/build-types/unit-control/stories/index.d.ts.map +1 -1
  534. package/build-types/utils/unit-values.d.ts.map +1 -1
  535. package/build-types/utils/values.d.ts.map +1 -1
  536. package/build-types/v-stack/hook.d.ts +0 -1
  537. package/build-types/v-stack/hook.d.ts.map +1 -1
  538. package/build-types/z-stack/component.d.ts +18 -28
  539. package/build-types/z-stack/component.d.ts.map +1 -1
  540. package/build-types/z-stack/stories/index.d.ts +6 -0
  541. package/build-types/z-stack/stories/index.d.ts.map +1 -0
  542. package/build-types/z-stack/types.d.ts +33 -0
  543. package/build-types/z-stack/types.d.ts.map +1 -0
  544. package/package.json +17 -17
  545. package/src/alignment-matrix-control/index.js +2 -1
  546. package/src/angle-picker-control/index.js +1 -1
  547. package/src/base-control/stories/index.tsx +2 -3
  548. package/src/border-box-control/border-box-control-linked-button/component.tsx +2 -5
  549. package/src/border-box-control/utils.ts +5 -2
  550. package/src/border-control/border-control/hook.ts +2 -3
  551. package/src/box-control/all-input-control.js +2 -4
  552. package/src/box-control/axial-input-controls.js +4 -6
  553. package/src/box-control/index.js +2 -5
  554. package/src/box-control/input-controls.js +33 -36
  555. package/src/box-control/unit-control.js +2 -1
  556. package/src/button/index.native.js +1 -2
  557. package/src/card/stories/index.js +10 -5
  558. package/src/checkbox-control/index.tsx +2 -3
  559. package/src/checkbox-control/stories/index.tsx +2 -3
  560. package/src/checkbox-control/test/index.tsx +2 -1
  561. package/src/color-picker/index.native.js +7 -4
  562. package/src/combobox-control/index.js +4 -2
  563. package/src/confirm-dialog/component.tsx +7 -8
  564. package/src/custom-gradient-bar/constants.js +2 -2
  565. package/src/custom-gradient-bar/control-points.js +20 -16
  566. package/src/custom-gradient-bar/index.js +11 -11
  567. package/src/custom-gradient-bar/test/utils.js +79 -0
  568. package/src/custom-gradient-bar/utils.js +6 -18
  569. package/src/custom-gradient-picker/style.scss +1 -3
  570. package/src/custom-gradient-picker/utils.js +4 -3
  571. package/src/custom-select-control/index.js +2 -1
  572. package/src/custom-select-control/stories/index.js +1 -2
  573. package/src/date-time/date/index.tsx +2 -2
  574. package/src/date-time/date/style.scss +10 -0
  575. package/src/date-time/date/test/index.tsx +1 -1
  576. package/src/date-time/date-time/index.tsx +6 -8
  577. package/src/date-time/stories/date-time.tsx +4 -6
  578. package/src/date-time/stories/date.tsx +2 -3
  579. package/src/date-time/time/test/index.tsx +12 -12
  580. package/src/dimension-control/index.js +1 -2
  581. package/src/divider/styles.ts +2 -3
  582. package/src/draggable/index.js +3 -3
  583. package/src/draggable/index.native.js +12 -4
  584. package/src/drop-zone/provider.js +1 -2
  585. package/src/dropdown/index.js +2 -2
  586. package/src/dropdown-menu/index.js +11 -1
  587. package/src/dropdown-menu/index.native.js +11 -1
  588. package/src/external-link/README.md +18 -0
  589. package/src/external-link/{index.js → index.tsx} +26 -6
  590. package/src/external-link/stories/index.tsx +36 -0
  591. package/src/external-link/styles/{external-link-styles.js → external-link-styles.ts} +0 -0
  592. package/src/external-link/types.ts +15 -0
  593. package/src/flex/flex/hook.js +4 -1
  594. package/src/focal-point-picker/controls.js +1 -5
  595. package/src/focal-point-picker/index.js +2 -8
  596. package/src/focal-point-picker/media.js +2 -5
  597. package/src/font-size-picker/index.js +3 -1
  598. package/src/form-toggle/index.js +2 -1
  599. package/src/form-toggle/test/index.js +1 -2
  600. package/src/form-token-field/index.tsx +694 -0
  601. package/src/form-token-field/stories/index.tsx +103 -0
  602. package/src/form-token-field/style.scss +2 -1
  603. package/src/form-token-field/{suggestions-list.js → suggestions-list.tsx} +45 -29
  604. package/src/form-token-field/test/index.js +64 -31
  605. package/src/form-token-field/test/lib/{token-field-wrapper.js → token-field-wrapper.tsx} +24 -9
  606. package/src/form-token-field/token-input.tsx +76 -0
  607. package/src/form-token-field/{token.js → token.tsx} +4 -2
  608. package/src/form-token-field/types.ts +178 -0
  609. package/src/gradient-picker/index.js +4 -3
  610. package/src/heading/hook.ts +5 -4
  611. package/src/higher-order/navigate-regions/index.js +7 -5
  612. package/src/higher-order/with-filters/test/index.js +43 -36
  613. package/src/higher-order/with-focus-return/index.js +14 -13
  614. package/src/higher-order/with-spoken-messages/index.js +8 -7
  615. package/src/higher-order/with-spoken-messages/test/index.js +1 -1
  616. package/src/icon/index.tsx +2 -2
  617. package/src/input-control/index.tsx +2 -1
  618. package/src/input-control/input-field.tsx +2 -1
  619. package/src/input-control/reducer/reducer.ts +23 -21
  620. package/src/input-control/utils.ts +1 -1
  621. package/src/item-group/stories/index.js +2 -1
  622. package/src/menu-item/test/index.js +2 -1
  623. package/src/menu-items-choice/index.js +2 -5
  624. package/src/mobile/bottom-sheet/bottom-sheet-context.native.js +2 -4
  625. package/src/mobile/bottom-sheet/cell.native.js +2 -3
  626. package/src/mobile/bottom-sheet/cycle-picker-cell.native.js +3 -5
  627. package/src/mobile/bottom-sheet/index.native.js +14 -17
  628. package/src/mobile/bottom-sheet/picker-cell.native.js +2 -7
  629. package/src/mobile/bottom-sheet/stepper-cell/index.native.js +4 -6
  630. package/src/mobile/color-settings/index.native.js +2 -4
  631. package/src/mobile/global-styles-context/index.native.js +8 -7
  632. package/src/mobile/gradient/index.native.js +12 -9
  633. package/src/mobile/gradient/test/index.native.js +1 -3
  634. package/src/mobile/html-text-input/index.native.js +2 -3
  635. package/src/mobile/inserter-button/index.native.js +2 -6
  636. package/src/mobile/link-settings/image-link-destinations-screen.native.js +6 -2
  637. package/src/mobile/media-edit/index.native.js +2 -3
  638. package/src/mobile/segmented-control/index.native.js +4 -5
  639. package/src/mobile/utils/test/index.native.js +3 -12
  640. package/src/modal/index.js +1 -1
  641. package/src/navigable-container/container.js +3 -2
  642. package/src/navigable-container/test/menu.js +1 -2
  643. package/src/navigable-container/test/tabbable.js +1 -2
  644. package/src/navigation/context.js +2 -5
  645. package/src/navigation/index.js +2 -1
  646. package/src/navigation/item/index.js +2 -1
  647. package/src/navigation/stories/controlled-state.js +1 -1
  648. package/src/navigation/stories/more-examples.js +2 -3
  649. package/src/navigation/test/index.js +252 -52
  650. package/src/navigator/navigator-back-button/hook.ts +14 -12
  651. package/src/navigator/navigator-button/hook.ts +14 -13
  652. package/src/navigator/navigator-provider/component.tsx +2 -6
  653. package/src/navigator/navigator-screen/component.tsx +3 -3
  654. package/src/notice/index.js +2 -1
  655. package/src/notice/list.js +3 -1
  656. package/src/panel/body.js +2 -1
  657. package/src/placeholder/README.md +7 -6
  658. package/src/placeholder/index.js +27 -10
  659. package/src/placeholder/style.scss +23 -0
  660. package/src/radio-control/README.md +17 -23
  661. package/src/radio-control/index.tsx +107 -0
  662. package/src/radio-control/stories/index.tsx +72 -0
  663. package/src/radio-control/types.ts +32 -0
  664. package/src/range-control/index.js +4 -2
  665. package/src/range-control/input-range.js +2 -5
  666. package/src/range-control/utils.js +3 -1
  667. package/src/resizable-box/resize-tooltip/index.tsx +2 -1
  668. package/src/resizable-box/resize-tooltip/utils.ts +1 -5
  669. package/src/responsive-wrapper/index.js +2 -4
  670. package/src/sandbox/test/index.js +4 -6
  671. package/src/select-control/index.tsx +3 -1
  672. package/src/select-control/stories/index.tsx +3 -4
  673. package/src/slot-fill/fill.js +1 -5
  674. package/src/slot-fill/slot.js +12 -2
  675. package/src/snackbar/index.js +1 -1
  676. package/src/snackbar/list.js +2 -1
  677. package/src/tab-panel/index.js +3 -1
  678. package/src/text/hook.js +4 -1
  679. package/src/text/utils.js +2 -3
  680. package/src/text-control/stories/index.tsx +4 -6
  681. package/src/toggle-control/index.js +1 -2
  682. package/src/toggle-control/index.native.js +2 -6
  683. package/src/toggle-group-control/toggle-group-control/toggle-group-control-backdrop.tsx +2 -4
  684. package/src/toolbar/index.js +1 -2
  685. package/src/tools-panel/tools-panel/hook.ts +2 -4
  686. package/src/tools-panel/tools-panel-header/hook.ts +2 -5
  687. package/src/tooltip/index.js +1 -0
  688. package/src/tree-grid/roving-tab-index-item.js +2 -4
  689. package/src/tree-grid/test/index.js +2 -3
  690. package/src/tree-select/README.md +2 -2
  691. package/src/tree-select/index.tsx +99 -0
  692. package/src/tree-select/stories/index.tsx +80 -0
  693. package/src/tree-select/types.ts +35 -0
  694. package/src/ui/context/wordpress-component.ts +4 -5
  695. package/src/ui/form-group/form-group-content.js +4 -4
  696. package/src/unit-control/index.tsx +7 -9
  697. package/src/unit-control/stories/index.tsx +8 -12
  698. package/src/unit-control/test/index.tsx +4 -7
  699. package/src/utils/hooks/stories/use-cx.js +8 -7
  700. package/src/utils/hooks/test/use-controlled-state.js +2 -1
  701. package/src/utils/unit-values.ts +2 -1
  702. package/src/utils/values.js +2 -3
  703. package/src/z-stack/README.md +14 -3
  704. package/src/z-stack/component.tsx +24 -29
  705. package/src/z-stack/stories/index.tsx +76 -0
  706. package/src/z-stack/types.ts +33 -0
  707. package/tsconfig.json +5 -0
  708. package/tsconfig.tsbuildinfo +1 -1
  709. package/src/external-link/stories/index.js +0 -23
  710. package/src/form-token-field/index.js +0 -725
  711. package/src/form-token-field/stories/index.js +0 -102
  712. package/src/form-token-field/token-input.js +0 -81
  713. package/src/radio-control/index.js +0 -69
  714. package/src/radio-control/stories/index.js +0 -41
  715. package/src/tree-select/index.js +0 -48
  716. package/src/tree-select/stories/index.js +0 -80
  717. package/src/z-stack/stories/index.js +0 -70
@@ -1,17 +1,19 @@
1
+ import _extends from "@babel/runtime/helpers/esm/extends";
1
2
  import { createElement } from "@wordpress/element";
2
3
 
3
4
  /**
4
5
  * External dependencies
5
6
  */
6
- import { last, take, clone, uniq, map, difference, each, identity, some } from 'lodash';
7
+ import { last, clone, uniq, map, difference, identity, some } from 'lodash';
7
8
  import classnames from 'classnames';
9
+
8
10
  /**
9
11
  * WordPress dependencies
10
12
  */
11
-
13
+ import { useEffect, useRef, useState } from '@wordpress/element';
12
14
  import { __, _n, sprintf } from '@wordpress/i18n';
13
- import { Component } from '@wordpress/element';
14
- import { withInstanceId } from '@wordpress/compose';
15
+ import { useDebounce, useInstanceId, usePrevious } from '@wordpress/compose';
16
+ import { speak } from '@wordpress/a11y';
15
17
  import { BACKSPACE, ENTER, UP, DOWN, LEFT, RIGHT, SPACE, DELETE, ESCAPE } from '@wordpress/keycodes';
16
18
  import isShallowEqual from '@wordpress/is-shallow-equal';
17
19
  /**
@@ -21,155 +23,174 @@ import isShallowEqual from '@wordpress/is-shallow-equal';
21
23
  import Token from './token';
22
24
  import TokenInput from './token-input';
23
25
  import SuggestionsList from './suggestions-list';
24
- import withSpokenMessages from '../higher-order/with-spoken-messages';
25
- const initialState = {
26
- incompleteTokenValue: '',
27
- inputOffsetFromEnd: 0,
28
- isActive: false,
29
- isExpanded: false,
30
- selectedSuggestionIndex: -1,
31
- selectedSuggestionScroll: false
32
- };
33
-
34
- class FormTokenField extends Component {
35
- constructor() {
36
- super(...arguments);
37
- this.state = initialState;
38
- this.onKeyDown = this.onKeyDown.bind(this);
39
- this.onKeyPress = this.onKeyPress.bind(this);
40
- this.onFocus = this.onFocus.bind(this);
41
- this.onBlur = this.onBlur.bind(this);
42
- this.deleteTokenBeforeInput = this.deleteTokenBeforeInput.bind(this);
43
- this.deleteTokenAfterInput = this.deleteTokenAfterInput.bind(this);
44
- this.addCurrentToken = this.addCurrentToken.bind(this);
45
- this.onContainerTouched = this.onContainerTouched.bind(this);
46
- this.renderToken = this.renderToken.bind(this);
47
- this.onTokenClickRemove = this.onTokenClickRemove.bind(this);
48
- this.onSuggestionHovered = this.onSuggestionHovered.bind(this);
49
- this.onSuggestionSelected = this.onSuggestionSelected.bind(this);
50
- this.onInputChange = this.onInputChange.bind(this);
51
- this.bindInput = this.bindInput.bind(this);
52
- this.bindTokensAndInput = this.bindTokensAndInput.bind(this);
53
- this.updateSuggestions = this.updateSuggestions.bind(this);
54
- }
55
-
56
- componentDidUpdate(prevProps) {
26
+
27
+ /**
28
+ * A `FormTokenField` is a field similar to the tags and categories fields in the interim editor chrome,
29
+ * or the "to" field in Mail on OS X. Tokens can be entered by typing them or selecting them from a list of suggested tokens.
30
+ *
31
+ * Up to one hundred suggestions that match what the user has typed so far will be shown from which the user can pick from (auto-complete).
32
+ * Tokens are separated by the "," character. Suggestions can be selected with the up or down arrows and added with the tab or enter key.
33
+ *
34
+ * The `value` property is handled in a manner similar to controlled form components.
35
+ * See [Forms](http://facebook.github.io/react/docs/forms.html) in the React Documentation for more information.
36
+ */
37
+ export function FormTokenField(props) {
38
+ const {
39
+ autoCapitalize,
40
+ autoComplete,
41
+ maxLength,
42
+ placeholder,
43
+ label = __('Add item'),
44
+ className,
45
+ suggestions = [],
46
+ maxSuggestions = 100,
47
+ value = [],
48
+ displayTransform = identity,
49
+ saveTransform = token => token.trim(),
50
+ onChange = () => {},
51
+ onInputChange = () => {},
52
+ onFocus = undefined,
53
+ isBorderless = false,
54
+ disabled = false,
55
+ tokenizeOnSpace = false,
56
+ messages = {
57
+ added: __('Item added.'),
58
+ removed: __('Item removed.'),
59
+ remove: __('Remove item'),
60
+ __experimentalInvalid: __('Invalid item')
61
+ },
62
+ __experimentalExpandOnFocus = false,
63
+ __experimentalValidateInput = () => true,
64
+ __experimentalShowHowTo = true
65
+ } = props;
66
+ const instanceId = useInstanceId(FormTokenField); // We reset to these initial values again in the onBlur
67
+
68
+ const [incompleteTokenValue, setIncompleteTokenValue] = useState('');
69
+ const [inputOffsetFromEnd, setInputOffsetFromEnd] = useState(0);
70
+ const [isActive, setIsActive] = useState(false);
71
+ const [isExpanded, setIsExpanded] = useState(false);
72
+ const [selectedSuggestionIndex, setSelectedSuggestionIndex] = useState(-1);
73
+ const [selectedSuggestionScroll, setSelectedSuggestionScroll] = useState(false);
74
+ const prevSuggestions = usePrevious(suggestions);
75
+ const prevValue = usePrevious(value);
76
+ const input = useRef(null);
77
+ const tokensAndInput = useRef(null);
78
+ const debouncedSpeak = useDebounce(speak, 500);
79
+ useEffect(() => {
57
80
  // Make sure to focus the input when the isActive state is true.
58
- if (this.state.isActive && !this.input.hasFocus()) {
59
- this.input.focus();
81
+ if (isActive && !hasFocus()) {
82
+ focus();
60
83
  }
84
+ }, [isActive]);
85
+ useEffect(() => {
86
+ const suggestionsDidUpdate = !isShallowEqual(suggestions, prevSuggestions || []);
61
87
 
62
- const {
63
- suggestions,
64
- value
65
- } = this.props;
66
- const suggestionsDidUpdate = !isShallowEqual(suggestions, prevProps.suggestions);
88
+ if (suggestionsDidUpdate || value !== prevValue) {
89
+ updateSuggestions(suggestionsDidUpdate);
90
+ } // TODO: updateSuggestions() should first be refactored so its actual deps are clearer.
91
+ // eslint-disable-next-line react-hooks/exhaustive-deps
67
92
 
68
- if (suggestionsDidUpdate || value !== prevProps.value) {
69
- this.updateSuggestions(suggestionsDidUpdate);
70
- }
93
+ }, [suggestions, prevSuggestions, value, prevValue]);
94
+ useEffect(() => {
95
+ updateSuggestions(); // eslint-disable-next-line react-hooks/exhaustive-deps
96
+ }, [incompleteTokenValue]);
97
+
98
+ if (disabled && isActive) {
99
+ setIsActive(false);
100
+ setIncompleteTokenValue('');
71
101
  }
72
102
 
73
- static getDerivedStateFromProps(props, state) {
74
- if (!props.disabled || !state.isActive) {
75
- return null;
76
- }
103
+ function focus() {
104
+ var _input$current;
77
105
 
78
- return {
79
- isActive: false,
80
- incompleteTokenValue: ''
81
- };
106
+ (_input$current = input.current) === null || _input$current === void 0 ? void 0 : _input$current.focus();
82
107
  }
83
108
 
84
- bindInput(ref) {
85
- this.input = ref;
86
- }
109
+ function hasFocus() {
110
+ var _input$current2;
87
111
 
88
- bindTokensAndInput(ref) {
89
- this.tokensAndInput = ref;
112
+ return input.current === ((_input$current2 = input.current) === null || _input$current2 === void 0 ? void 0 : _input$current2.ownerDocument.activeElement);
90
113
  }
91
114
 
92
- onFocus(event) {
93
- const {
94
- __experimentalExpandOnFocus
95
- } = this.props; // If focus is on the input or on the container, set the isActive state to true.
96
-
97
- if (this.input.hasFocus() || event.target === this.tokensAndInput) {
98
- this.setState({
99
- isActive: true,
100
- isExpanded: !!__experimentalExpandOnFocus || this.state.isExpanded
101
- });
115
+ function onFocusHandler(event) {
116
+ // If focus is on the input or on the container, set the isActive state to true.
117
+ if (hasFocus() || event.target === tokensAndInput.current) {
118
+ setIsActive(true);
119
+ setIsExpanded(__experimentalExpandOnFocus || isExpanded);
102
120
  } else {
103
121
  /*
104
122
  * Otherwise, focus is on one of the token "remove" buttons and we
105
123
  * set the isActive state to false to prevent the input to be
106
124
  * re-focused, see componentDidUpdate().
107
125
  */
108
- this.setState({
109
- isActive: false
110
- });
126
+ setIsActive(false);
111
127
  }
112
128
 
113
- if ('function' === typeof this.props.onFocus) {
114
- this.props.onFocus(event);
129
+ if ('function' === typeof onFocus) {
130
+ onFocus(event);
115
131
  }
116
132
  }
117
133
 
118
- onBlur() {
119
- if (this.inputHasValidValue()) {
120
- this.setState({
121
- isActive: false
122
- });
134
+ function onBlur() {
135
+ if (inputHasValidValue()) {
136
+ setIsActive(false);
123
137
  } else {
124
- this.setState(initialState);
138
+ // Reset to initial state
139
+ setIncompleteTokenValue('');
140
+ setInputOffsetFromEnd(0);
141
+ setIsActive(false);
142
+ setIsExpanded(false);
143
+ setSelectedSuggestionIndex(-1);
144
+ setSelectedSuggestionScroll(false);
125
145
  }
126
146
  }
127
147
 
128
- onKeyDown(event) {
148
+ function onKeyDown(event) {
129
149
  let preventDefault = false;
130
150
 
131
151
  if (event.defaultPrevented) {
132
152
  return;
133
- }
153
+ } // TODO: replace to event.code;
154
+
134
155
 
135
156
  switch (event.keyCode) {
136
157
  case BACKSPACE:
137
- preventDefault = this.handleDeleteKey(this.deleteTokenBeforeInput);
158
+ preventDefault = handleDeleteKey(deleteTokenBeforeInput);
138
159
  break;
139
160
 
140
161
  case ENTER:
141
- preventDefault = this.addCurrentToken();
162
+ preventDefault = addCurrentToken();
142
163
  break;
143
164
 
144
165
  case LEFT:
145
- preventDefault = this.handleLeftArrowKey();
166
+ preventDefault = handleLeftArrowKey();
146
167
  break;
147
168
 
148
169
  case UP:
149
- preventDefault = this.handleUpArrowKey();
170
+ preventDefault = handleUpArrowKey();
150
171
  break;
151
172
 
152
173
  case RIGHT:
153
- preventDefault = this.handleRightArrowKey();
174
+ preventDefault = handleRightArrowKey();
154
175
  break;
155
176
 
156
177
  case DOWN:
157
- preventDefault = this.handleDownArrowKey();
178
+ preventDefault = handleDownArrowKey();
158
179
  break;
159
180
 
160
181
  case DELETE:
161
- preventDefault = this.handleDeleteKey(this.deleteTokenAfterInput);
182
+ preventDefault = handleDeleteKey(deleteTokenAfterInput);
162
183
  break;
163
184
 
164
185
  case SPACE:
165
- if (this.props.tokenizeOnSpace) {
166
- preventDefault = this.addCurrentToken();
186
+ if (tokenizeOnSpace) {
187
+ preventDefault = addCurrentToken();
167
188
  }
168
189
 
169
190
  break;
170
191
 
171
192
  case ESCAPE:
172
- preventDefault = this.handleEscapeKey(event);
193
+ preventDefault = handleEscapeKey(event);
173
194
  break;
174
195
 
175
196
  default:
@@ -181,13 +202,13 @@ class FormTokenField extends Component {
181
202
  }
182
203
  }
183
204
 
184
- onKeyPress(event) {
185
- let preventDefault = false;
205
+ function onKeyPress(event) {
206
+ let preventDefault = false; // TODO: replace to event.code;
186
207
 
187
208
  switch (event.charCode) {
188
209
  case 44:
189
210
  // Comma.
190
- preventDefault = this.handleCommaKey();
211
+ preventDefault = handleCommaKey();
191
212
  break;
192
213
 
193
214
  default:
@@ -199,212 +220,201 @@ class FormTokenField extends Component {
199
220
  }
200
221
  }
201
222
 
202
- onContainerTouched(event) {
223
+ function onContainerTouched(event) {
203
224
  // Prevent clicking/touching the tokensAndInput container from blurring
204
225
  // the input and adding the current token.
205
- if (event.target === this.tokensAndInput && this.state.isActive) {
226
+ if (event.target === tokensAndInput.current && isActive) {
206
227
  event.preventDefault();
207
228
  }
208
229
  }
209
230
 
210
- onTokenClickRemove(event) {
211
- this.deleteToken(event.value);
212
- this.input.focus();
231
+ function onTokenClickRemove(event) {
232
+ deleteToken(event.value);
233
+ focus();
213
234
  }
214
235
 
215
- onSuggestionHovered(suggestion) {
216
- const index = this.getMatchingSuggestions().indexOf(suggestion);
236
+ function onSuggestionHovered(suggestion) {
237
+ const index = getMatchingSuggestions().indexOf(suggestion);
217
238
 
218
239
  if (index >= 0) {
219
- this.setState({
220
- selectedSuggestionIndex: index,
221
- selectedSuggestionScroll: false
222
- });
240
+ setSelectedSuggestionIndex(index);
241
+ setSelectedSuggestionScroll(false);
223
242
  }
224
243
  }
225
244
 
226
- onSuggestionSelected(suggestion) {
227
- this.addNewToken(suggestion);
245
+ function onSuggestionSelected(suggestion) {
246
+ addNewToken(suggestion);
228
247
  }
229
248
 
230
- onInputChange(event) {
249
+ function onInputChangeHandler(event) {
231
250
  const text = event.value;
232
- const separator = this.props.tokenizeOnSpace ? /[ ,\t]+/ : /[,\t]+/;
251
+ const separator = tokenizeOnSpace ? /[ ,\t]+/ : /[,\t]+/;
233
252
  const items = text.split(separator);
234
253
  const tokenValue = last(items) || '';
235
254
 
236
255
  if (items.length > 1) {
237
- this.addNewTokens(items.slice(0, -1));
256
+ addNewTokens(items.slice(0, -1));
238
257
  }
239
258
 
240
- this.setState({
241
- incompleteTokenValue: tokenValue
242
- }, this.updateSuggestions);
243
- this.props.onInputChange(tokenValue);
259
+ setIncompleteTokenValue(tokenValue);
260
+ onInputChange(tokenValue);
244
261
  }
245
262
 
246
- handleDeleteKey(deleteToken) {
263
+ function handleDeleteKey(_deleteToken) {
247
264
  let preventDefault = false;
248
265
 
249
- if (this.input.hasFocus() && this.isInputEmpty()) {
250
- deleteToken();
266
+ if (hasFocus() && isInputEmpty()) {
267
+ _deleteToken();
268
+
251
269
  preventDefault = true;
252
270
  }
253
271
 
254
272
  return preventDefault;
255
273
  }
256
274
 
257
- handleLeftArrowKey() {
275
+ function handleLeftArrowKey() {
258
276
  let preventDefault = false;
259
277
 
260
- if (this.isInputEmpty()) {
261
- this.moveInputBeforePreviousToken();
278
+ if (isInputEmpty()) {
279
+ moveInputBeforePreviousToken();
262
280
  preventDefault = true;
263
281
  }
264
282
 
265
283
  return preventDefault;
266
284
  }
267
285
 
268
- handleRightArrowKey() {
286
+ function handleRightArrowKey() {
269
287
  let preventDefault = false;
270
288
 
271
- if (this.isInputEmpty()) {
272
- this.moveInputAfterNextToken();
289
+ if (isInputEmpty()) {
290
+ moveInputAfterNextToken();
273
291
  preventDefault = true;
274
292
  }
275
293
 
276
294
  return preventDefault;
277
295
  }
278
296
 
279
- handleUpArrowKey() {
280
- this.setState((state, props) => ({
281
- selectedSuggestionIndex: (state.selectedSuggestionIndex === 0 ? this.getMatchingSuggestions(state.incompleteTokenValue, props.suggestions, props.value, props.maxSuggestions, props.saveTransform).length : state.selectedSuggestionIndex) - 1,
282
- selectedSuggestionScroll: true
283
- }));
297
+ function handleUpArrowKey() {
298
+ setSelectedSuggestionIndex(index => {
299
+ return (index === 0 ? getMatchingSuggestions(incompleteTokenValue, suggestions, value, maxSuggestions, saveTransform).length : index) - 1;
300
+ });
301
+ setSelectedSuggestionScroll(true);
284
302
  return true; // PreventDefault.
285
303
  }
286
304
 
287
- handleDownArrowKey() {
288
- this.setState((state, props) => ({
289
- selectedSuggestionIndex: (state.selectedSuggestionIndex + 1) % this.getMatchingSuggestions(state.incompleteTokenValue, props.suggestions, props.value, props.maxSuggestions, props.saveTransform).length,
290
- selectedSuggestionScroll: true
291
- }));
305
+ function handleDownArrowKey() {
306
+ setSelectedSuggestionIndex(index => {
307
+ return (index + 1) % getMatchingSuggestions(incompleteTokenValue, suggestions, value, maxSuggestions, saveTransform).length;
308
+ });
309
+ setSelectedSuggestionScroll(true);
292
310
  return true; // PreventDefault.
293
311
  }
294
312
 
295
- handleEscapeKey(event) {
296
- this.setState({
297
- incompleteTokenValue: event.target.value,
298
- isExpanded: false,
299
- selectedSuggestionIndex: -1,
300
- selectedSuggestionScroll: false
301
- });
313
+ function handleEscapeKey(event) {
314
+ if (event.target instanceof HTMLInputElement) {
315
+ setIncompleteTokenValue(event.target.value);
316
+ setIsExpanded(false);
317
+ setSelectedSuggestionIndex(-1);
318
+ setSelectedSuggestionScroll(false);
319
+ }
320
+
302
321
  return true; // PreventDefault.
303
322
  }
304
323
 
305
- handleCommaKey() {
306
- if (this.inputHasValidValue()) {
307
- this.addNewToken(this.state.incompleteTokenValue);
324
+ function handleCommaKey() {
325
+ if (inputHasValidValue()) {
326
+ addNewToken(incompleteTokenValue);
308
327
  }
309
328
 
310
329
  return true; // PreventDefault.
311
330
  }
312
331
 
313
- moveInputToIndex(index) {
314
- this.setState((state, props) => ({
315
- inputOffsetFromEnd: props.value.length - Math.max(index, -1) - 1
316
- }));
332
+ function moveInputToIndex(index) {
333
+ setInputOffsetFromEnd(value.length - Math.max(index, -1) - 1);
317
334
  }
318
335
 
319
- moveInputBeforePreviousToken() {
320
- this.setState((state, props) => ({
321
- inputOffsetFromEnd: Math.min(state.inputOffsetFromEnd + 1, props.value.length)
322
- }));
336
+ function moveInputBeforePreviousToken() {
337
+ setInputOffsetFromEnd(prevInputOffsetFromEnd => {
338
+ return Math.min(prevInputOffsetFromEnd + 1, value.length);
339
+ });
323
340
  }
324
341
 
325
- moveInputAfterNextToken() {
326
- this.setState(state => ({
327
- inputOffsetFromEnd: Math.max(state.inputOffsetFromEnd - 1, 0)
328
- }));
342
+ function moveInputAfterNextToken() {
343
+ setInputOffsetFromEnd(prevInputOffsetFromEnd => {
344
+ return Math.max(prevInputOffsetFromEnd - 1, 0);
345
+ });
329
346
  }
330
347
 
331
- deleteTokenBeforeInput() {
332
- const index = this.getIndexOfInput() - 1;
348
+ function deleteTokenBeforeInput() {
349
+ const index = getIndexOfInput() - 1;
333
350
 
334
351
  if (index > -1) {
335
- this.deleteToken(this.props.value[index]);
352
+ deleteToken(value[index]);
336
353
  }
337
354
  }
338
355
 
339
- deleteTokenAfterInput() {
340
- const index = this.getIndexOfInput();
356
+ function deleteTokenAfterInput() {
357
+ const index = getIndexOfInput();
341
358
 
342
- if (index < this.props.value.length) {
343
- this.deleteToken(this.props.value[index]); // Update input offset since it's the offset from the last token.
359
+ if (index < value.length) {
360
+ deleteToken(value[index]); // Update input offset since it's the offset from the last token.
344
361
 
345
- this.moveInputToIndex(index);
362
+ moveInputToIndex(index);
346
363
  }
347
364
  }
348
365
 
349
- addCurrentToken() {
366
+ function addCurrentToken() {
350
367
  let preventDefault = false;
351
- const selectedSuggestion = this.getSelectedSuggestion();
368
+ const selectedSuggestion = getSelectedSuggestion();
352
369
 
353
370
  if (selectedSuggestion) {
354
- this.addNewToken(selectedSuggestion);
371
+ addNewToken(selectedSuggestion);
355
372
  preventDefault = true;
356
- } else if (this.inputHasValidValue()) {
357
- this.addNewToken(this.state.incompleteTokenValue);
373
+ } else if (inputHasValidValue()) {
374
+ addNewToken(incompleteTokenValue);
358
375
  preventDefault = true;
359
376
  }
360
377
 
361
378
  return preventDefault;
362
379
  }
363
380
 
364
- addNewTokens(tokens) {
365
- const tokensToAdd = uniq(tokens.map(this.props.saveTransform).filter(Boolean).filter(token => !this.valueContainsToken(token)));
381
+ function addNewTokens(tokens) {
382
+ const tokensToAdd = uniq(tokens.map(saveTransform).filter(Boolean).filter(token => !valueContainsToken(token)));
366
383
 
367
384
  if (tokensToAdd.length > 0) {
368
- const newValue = clone(this.props.value);
369
- newValue.splice.apply(newValue, [this.getIndexOfInput(), 0].concat(tokensToAdd));
370
- this.props.onChange(newValue);
385
+ const newValue = clone(value);
386
+ newValue.splice(getIndexOfInput(), 0, ...tokensToAdd);
387
+ onChange(newValue);
371
388
  }
372
389
  }
373
390
 
374
- addNewToken(token) {
375
- const {
376
- __experimentalExpandOnFocus,
377
- __experimentalValidateInput
378
- } = this.props;
379
-
391
+ function addNewToken(token) {
380
392
  if (!__experimentalValidateInput(token)) {
381
- this.props.speak(this.props.messages.__experimentalInvalid, 'assertive');
393
+ speak(messages.__experimentalInvalid, 'assertive');
382
394
  return;
383
395
  }
384
396
 
385
- this.addNewTokens([token]);
386
- this.props.speak(this.props.messages.added, 'assertive');
387
- this.setState({
388
- incompleteTokenValue: '',
389
- selectedSuggestionIndex: -1,
390
- selectedSuggestionScroll: false,
391
- isExpanded: !__experimentalExpandOnFocus
392
- });
397
+ addNewTokens([token]);
398
+ speak(messages.added, 'assertive');
399
+ setIncompleteTokenValue('');
400
+ setSelectedSuggestionIndex(-1);
401
+ setSelectedSuggestionScroll(false);
402
+ setIsExpanded(!__experimentalExpandOnFocus);
393
403
 
394
- if (this.state.isActive) {
395
- this.input.focus();
404
+ if (isActive) {
405
+ focus();
396
406
  }
397
407
  }
398
408
 
399
- deleteToken(token) {
400
- const newTokens = this.props.value.filter(item => {
401
- return this.getTokenValue(item) !== this.getTokenValue(token);
409
+ function deleteToken(token) {
410
+ const newTokens = value.filter(item => {
411
+ return getTokenValue(item) !== getTokenValue(token);
402
412
  });
403
- this.props.onChange(newTokens);
404
- this.props.speak(this.props.messages.removed, 'assertive');
413
+ onChange(newTokens);
414
+ speak(messages.removed, 'assertive');
405
415
  }
406
416
 
407
- getTokenValue(token) {
417
+ function getTokenValue(token) {
408
418
  if ('object' === typeof token) {
409
419
  return token.value;
410
420
  }
@@ -412,24 +422,39 @@ class FormTokenField extends Component {
412
422
  return token;
413
423
  }
414
424
 
415
- getMatchingSuggestions() {
416
- let searchValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.state.incompleteTokenValue;
417
- let suggestions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.props.suggestions;
418
- let value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.props.value;
419
- let maxSuggestions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : this.props.maxSuggestions;
420
- let saveTransform = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : this.props.saveTransform;
421
- let match = saveTransform(searchValue);
425
+ function getMatchingSuggestions() {
426
+ let searchValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : incompleteTokenValue;
427
+
428
+ let _suggestions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : suggestions;
429
+
430
+ let _value = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : value;
431
+
432
+ let _maxSuggestions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : maxSuggestions;
433
+
434
+ let _saveTransform = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : saveTransform;
435
+
436
+ let match = _saveTransform(searchValue);
437
+
422
438
  const startsWithMatch = [];
423
439
  const containsMatch = [];
424
440
 
441
+ const normalizedValue = _value.map(item => {
442
+ if (typeof item === 'string') {
443
+ return item;
444
+ }
445
+
446
+ return item.value;
447
+ });
448
+
425
449
  if (match.length === 0) {
426
- suggestions = difference(suggestions, value);
450
+ _suggestions = difference(_suggestions, normalizedValue);
427
451
  } else {
428
452
  match = match.toLocaleLowerCase();
429
- each(suggestions, suggestion => {
453
+
454
+ _suggestions.forEach(suggestion => {
430
455
  const index = suggestion.toLocaleLowerCase().indexOf(match);
431
456
 
432
- if (value.indexOf(suggestion) === -1) {
457
+ if (normalizedValue.indexOf(suggestion) === -1) {
433
458
  if (index === 0) {
434
459
  startsWithMatch.push(suggestion);
435
460
  } else if (index > 0) {
@@ -437,62 +462,52 @@ class FormTokenField extends Component {
437
462
  }
438
463
  }
439
464
  });
440
- suggestions = startsWithMatch.concat(containsMatch);
465
+
466
+ _suggestions = startsWithMatch.concat(containsMatch);
441
467
  }
442
468
 
443
- return take(suggestions, maxSuggestions);
469
+ return _suggestions.slice(0, _maxSuggestions);
444
470
  }
445
471
 
446
- getSelectedSuggestion() {
447
- if (this.state.selectedSuggestionIndex !== -1) {
448
- return this.getMatchingSuggestions()[this.state.selectedSuggestionIndex];
472
+ function getSelectedSuggestion() {
473
+ if (selectedSuggestionIndex !== -1) {
474
+ return getMatchingSuggestions()[selectedSuggestionIndex];
449
475
  }
476
+
477
+ return undefined;
450
478
  }
451
479
 
452
- valueContainsToken(token) {
453
- return some(this.props.value, item => {
454
- return this.getTokenValue(token) === this.getTokenValue(item);
480
+ function valueContainsToken(token) {
481
+ return some(value, item => {
482
+ return getTokenValue(token) === getTokenValue(item);
455
483
  });
456
484
  }
457
485
 
458
- getIndexOfInput() {
459
- return this.props.value.length - this.state.inputOffsetFromEnd;
486
+ function getIndexOfInput() {
487
+ return value.length - inputOffsetFromEnd;
460
488
  }
461
489
 
462
- isInputEmpty() {
463
- return this.state.incompleteTokenValue.length === 0;
490
+ function isInputEmpty() {
491
+ return incompleteTokenValue.length === 0;
464
492
  }
465
493
 
466
- inputHasValidValue() {
467
- return this.props.saveTransform(this.state.incompleteTokenValue).length > 0;
494
+ function inputHasValidValue() {
495
+ return saveTransform(incompleteTokenValue).length > 0;
468
496
  }
469
497
 
470
- updateSuggestions() {
498
+ function updateSuggestions() {
471
499
  let resetSelectedSuggestion = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
472
- const {
473
- __experimentalExpandOnFocus
474
- } = this.props;
475
- const {
476
- incompleteTokenValue
477
- } = this.state;
478
500
  const inputHasMinimumChars = incompleteTokenValue.trim().length > 1;
479
- const matchingSuggestions = this.getMatchingSuggestions(incompleteTokenValue);
501
+ const matchingSuggestions = getMatchingSuggestions(incompleteTokenValue);
480
502
  const hasMatchingSuggestions = matchingSuggestions.length > 0;
481
- const newState = {
482
- isExpanded: __experimentalExpandOnFocus || inputHasMinimumChars && hasMatchingSuggestions
483
- };
503
+ setIsExpanded(__experimentalExpandOnFocus || inputHasMinimumChars && hasMatchingSuggestions);
484
504
 
485
505
  if (resetSelectedSuggestion) {
486
- newState.selectedSuggestionIndex = -1;
487
- newState.selectedSuggestionScroll = false;
506
+ setSelectedSuggestionIndex(-1);
507
+ setSelectedSuggestionScroll(false);
488
508
  }
489
509
 
490
- this.setState(newState);
491
-
492
510
  if (inputHasMinimumChars) {
493
- const {
494
- debouncedSpeak
495
- } = this.props;
496
511
  const message = hasMatchingSuggestions ? sprintf(
497
512
  /* translators: %d: number of results. */
498
513
  _n('%d result found, use up and down arrow keys to navigate.', '%d results found, use up and down arrow keys to navigate.', matchingSuggestions.length), matchingSuggestions.length) : __('No results.');
@@ -500,147 +515,100 @@ class FormTokenField extends Component {
500
515
  }
501
516
  }
502
517
 
503
- renderTokensAndInput() {
504
- const components = map(this.props.value, this.renderToken);
505
- components.splice(this.getIndexOfInput(), 0, this.renderInput());
518
+ function renderTokensAndInput() {
519
+ const components = map(value, renderToken);
520
+ components.splice(getIndexOfInput(), 0, renderInput());
506
521
  return components;
507
522
  }
508
523
 
509
- renderToken(token, index, tokens) {
510
- const value = this.getTokenValue(token);
511
- const status = token.status ? token.status : undefined;
524
+ function renderToken(token, index, tokens) {
525
+ const _value = getTokenValue(token);
526
+
527
+ const status = typeof token !== 'string' ? token.status : undefined;
512
528
  const termPosition = index + 1;
513
529
  const termsCount = tokens.length;
514
530
  return createElement(Token, {
515
- key: 'token-' + value,
516
- value: value,
531
+ key: 'token-' + _value,
532
+ value: _value,
517
533
  status: status,
518
- title: token.title,
519
- displayTransform: this.props.displayTransform,
520
- onClickRemove: this.onTokenClickRemove,
521
- isBorderless: token.isBorderless || this.props.isBorderless,
522
- onMouseEnter: token.onMouseEnter,
523
- onMouseLeave: token.onMouseLeave,
524
- disabled: 'error' !== status && this.props.disabled,
525
- messages: this.props.messages,
534
+ title: typeof token !== 'string' ? token.title : undefined,
535
+ displayTransform: displayTransform,
536
+ onClickRemove: onTokenClickRemove,
537
+ isBorderless: typeof token !== 'string' && token.isBorderless || isBorderless,
538
+ onMouseEnter: typeof token !== 'string' ? token.onMouseEnter : undefined,
539
+ onMouseLeave: typeof token !== 'string' ? token.onMouseLeave : undefined,
540
+ disabled: 'error' !== status && disabled,
541
+ messages: messages,
526
542
  termsCount: termsCount,
527
543
  termPosition: termPosition
528
544
  });
529
545
  }
530
546
 
531
- renderInput() {
532
- const {
533
- autoCapitalize,
534
- autoComplete,
535
- maxLength,
536
- placeholder,
537
- value,
538
- instanceId
539
- } = this.props;
540
- let props = {
547
+ function renderInput() {
548
+ const inputProps = {
541
549
  instanceId,
542
550
  autoCapitalize,
543
551
  autoComplete,
544
552
  placeholder: value.length === 0 ? placeholder : '',
545
- ref: this.bindInput,
546
553
  key: 'input',
547
- disabled: this.props.disabled,
548
- value: this.state.incompleteTokenValue,
549
- onBlur: this.onBlur,
550
- isExpanded: this.state.isExpanded,
551
- selectedSuggestionIndex: this.state.selectedSuggestionIndex
552
- };
553
-
554
- if (!(maxLength && value.length >= maxLength)) {
555
- props = { ...props,
556
- onChange: this.onInputChange
557
- };
558
- }
559
-
560
- return createElement(TokenInput, props);
561
- }
562
-
563
- render() {
564
- const {
565
554
  disabled,
566
- label = __('Add item'),
567
- instanceId,
568
- className,
569
- __experimentalShowHowTo
570
- } = this.props;
571
- const {
572
- isExpanded
573
- } = this.state;
574
- const classes = classnames(className, 'components-form-token-field__input-container', {
575
- 'is-active': this.state.isActive,
576
- 'is-disabled': disabled
577
- });
578
- let tokenFieldProps = {
579
- className: 'components-form-token-field',
580
- tabIndex: '-1'
555
+ value: incompleteTokenValue,
556
+ onBlur,
557
+ isExpanded,
558
+ selectedSuggestionIndex
581
559
  };
582
- const matchingSuggestions = this.getMatchingSuggestions();
583
-
584
- if (!disabled) {
585
- tokenFieldProps = Object.assign({}, tokenFieldProps, {
586
- onKeyDown: this.onKeyDown,
587
- onKeyPress: this.onKeyPress,
588
- onFocus: this.onFocus
589
- });
590
- } // Disable reason: There is no appropriate role which describes the
591
- // input container intended accessible usability.
592
- // TODO: Refactor click detection to use blur to stop propagation.
593
-
594
- /* eslint-disable jsx-a11y/no-static-element-interactions */
595
-
596
-
597
- return createElement("div", tokenFieldProps, createElement("label", {
598
- htmlFor: `components-form-token-input-${instanceId}`,
599
- className: "components-form-token-field__label"
600
- }, label), createElement("div", {
601
- ref: this.bindTokensAndInput,
602
- className: classes,
603
- tabIndex: "-1",
604
- onMouseDown: this.onContainerTouched,
605
- onTouchStart: this.onContainerTouched
606
- }, this.renderTokensAndInput(), isExpanded && createElement(SuggestionsList, {
607
- instanceId: instanceId,
608
- match: this.props.saveTransform(this.state.incompleteTokenValue),
609
- displayTransform: this.props.displayTransform,
610
- suggestions: matchingSuggestions,
611
- selectedIndex: this.state.selectedSuggestionIndex,
612
- scrollIntoView: this.state.selectedSuggestionScroll,
613
- onHover: this.onSuggestionHovered,
614
- onSelect: this.onSuggestionSelected
615
- })), __experimentalShowHowTo && createElement("p", {
616
- id: `components-form-token-suggestions-howto-${instanceId}`,
617
- className: "components-form-token-field__help"
618
- }, this.props.tokenizeOnSpace ? __('Separate with commas, spaces, or the Enter key.') : __('Separate with commas or the Enter key.')));
619
- /* eslint-enable jsx-a11y/no-static-element-interactions */
560
+ return createElement(TokenInput, _extends({}, inputProps, {
561
+ onChange: !(maxLength && value.length >= maxLength) ? onInputChangeHandler : undefined,
562
+ ref: input
563
+ }));
620
564
  }
621
565
 
566
+ const classes = classnames(className, 'components-form-token-field__input-container', {
567
+ 'is-active': isActive,
568
+ 'is-disabled': disabled
569
+ });
570
+ let tokenFieldProps = {
571
+ className: 'components-form-token-field',
572
+ tabIndex: -1
573
+ };
574
+ const matchingSuggestions = getMatchingSuggestions();
575
+
576
+ if (!disabled) {
577
+ tokenFieldProps = Object.assign({}, tokenFieldProps, {
578
+ onKeyDown,
579
+ onKeyPress,
580
+ onFocus: onFocusHandler
581
+ });
582
+ } // Disable reason: There is no appropriate role which describes the
583
+ // input container intended accessible usability.
584
+ // TODO: Refactor click detection to use blur to stop propagation.
585
+
586
+ /* eslint-disable jsx-a11y/no-static-element-interactions */
587
+
588
+
589
+ return createElement("div", tokenFieldProps, createElement("label", {
590
+ htmlFor: `components-form-token-input-${instanceId}`,
591
+ className: "components-form-token-field__label"
592
+ }, label), createElement("div", {
593
+ ref: tokensAndInput,
594
+ className: classes,
595
+ tabIndex: -1,
596
+ onMouseDown: onContainerTouched,
597
+ onTouchStart: onContainerTouched
598
+ }, renderTokensAndInput(), isExpanded && createElement(SuggestionsList, {
599
+ instanceId: instanceId,
600
+ match: saveTransform(incompleteTokenValue),
601
+ displayTransform: displayTransform,
602
+ suggestions: matchingSuggestions,
603
+ selectedIndex: selectedSuggestionIndex,
604
+ scrollIntoView: selectedSuggestionScroll,
605
+ onHover: onSuggestionHovered,
606
+ onSelect: onSuggestionSelected
607
+ })), __experimentalShowHowTo && createElement("p", {
608
+ id: `components-form-token-suggestions-howto-${instanceId}`,
609
+ className: "components-form-token-field__help"
610
+ }, tokenizeOnSpace ? __('Separate with commas, spaces, or the Enter key.') : __('Separate with commas or the Enter key.')));
611
+ /* eslint-enable jsx-a11y/no-static-element-interactions */
622
612
  }
623
-
624
- FormTokenField.defaultProps = {
625
- suggestions: Object.freeze([]),
626
- maxSuggestions: 100,
627
- value: Object.freeze([]),
628
- displayTransform: identity,
629
- saveTransform: token => token.trim(),
630
- onChange: () => {},
631
- onInputChange: () => {},
632
- isBorderless: false,
633
- disabled: false,
634
- tokenizeOnSpace: false,
635
- messages: {
636
- added: __('Item added.'),
637
- removed: __('Item removed.'),
638
- remove: __('Remove item'),
639
- __experimentalInvalid: __('Invalid item')
640
- },
641
- __experimentalExpandOnFocus: false,
642
- __experimentalValidateInput: () => true,
643
- __experimentalShowHowTo: true
644
- };
645
- export default withSpokenMessages(withInstanceId(FormTokenField));
613
+ export default FormTokenField;
646
614
  //# sourceMappingURL=index.js.map