@wordpress/components 25.9.1 → 25.11.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 (369) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/build/alignment-matrix-control/cell.js +8 -5
  3. package/build/alignment-matrix-control/cell.js.map +1 -1
  4. package/build/alignment-matrix-control/index.js +27 -43
  5. package/build/alignment-matrix-control/index.js.map +1 -1
  6. package/build/alignment-matrix-control/utils.js +29 -9
  7. package/build/alignment-matrix-control/utils.js.map +1 -1
  8. package/build/autocomplete/index.js +104 -52
  9. package/build/autocomplete/index.js.map +1 -1
  10. package/build/circular-option-picker/circular-option-picker-option.js +20 -39
  11. package/build/circular-option-picker/circular-option-picker-option.js.map +1 -1
  12. package/build/circular-option-picker/circular-option-picker.js +11 -32
  13. package/build/circular-option-picker/circular-option-picker.js.map +1 -1
  14. package/build/circular-option-picker/types.js.map +1 -1
  15. package/build/color-palette/index.js +7 -2
  16. package/build/color-palette/index.js.map +1 -1
  17. package/build/color-picker/component.js +12 -2
  18. package/build/color-picker/component.js.map +1 -1
  19. package/build/color-picker/picker.js +77 -1
  20. package/build/color-picker/picker.js.map +1 -1
  21. package/build/color-picker/styles.js +8 -8
  22. package/build/color-picker/styles.js.map +1 -1
  23. package/build/color-picker/types.js.map +1 -1
  24. package/build/composite/v2.js +43 -0
  25. package/build/composite/v2.js.map +1 -0
  26. package/build/confirm-dialog/component.js +74 -8
  27. package/build/confirm-dialog/component.js.map +1 -1
  28. package/build/confirm-dialog/types.js.map +1 -1
  29. package/build/custom-gradient-picker/gradient-bar/control-points.js +13 -4
  30. package/build/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  31. package/build/dropdown-menu-v2-ariakit/index.js +217 -0
  32. package/build/dropdown-menu-v2-ariakit/index.js.map +1 -0
  33. package/build/dropdown-menu-v2-ariakit/styles.js +157 -0
  34. package/build/dropdown-menu-v2-ariakit/styles.js.map +1 -0
  35. package/build/dropdown-menu-v2-ariakit/types.js +6 -0
  36. package/build/dropdown-menu-v2-ariakit/types.js.map +1 -0
  37. package/build/font-size-picker/utils.js +1 -1
  38. package/build/font-size-picker/utils.js.map +1 -1
  39. package/build/input-control/styles/input-control-styles.js +23 -23
  40. package/build/input-control/styles/input-control-styles.js.map +1 -1
  41. package/build/mobile/global-styles-context/utils.native.js +1 -1
  42. package/build/mobile/global-styles-context/utils.native.js.map +1 -1
  43. package/build/modal/index.js +45 -16
  44. package/build/modal/index.js.map +1 -1
  45. package/build/palette-edit/index.js +4 -0
  46. package/build/palette-edit/index.js.map +1 -1
  47. package/build/popover/index.js +34 -6
  48. package/build/popover/index.js.map +1 -1
  49. package/build/private-apis.js +18 -2
  50. package/build/private-apis.js.map +1 -1
  51. package/build/progress-bar/styles.js +5 -5
  52. package/build/progress-bar/styles.js.map +1 -1
  53. package/build/sandbox/index.js +1 -1
  54. package/build/sandbox/index.js.map +1 -1
  55. package/build/sandbox/index.native.js +1 -1
  56. package/build/sandbox/index.native.js.map +1 -1
  57. package/build/select-control/styles/select-control-styles.js +8 -8
  58. package/build/select-control/styles/select-control-styles.js.map +1 -1
  59. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js +1 -1
  60. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  61. package/build/tabs/context.js +16 -0
  62. package/build/tabs/context.js.map +1 -0
  63. package/build/tabs/index.js +147 -0
  64. package/build/tabs/index.js.map +1 -0
  65. package/build/tabs/styles.js +38 -0
  66. package/build/tabs/styles.js.map +1 -0
  67. package/build/tabs/tab.js +46 -0
  68. package/build/tabs/tab.js.map +1 -0
  69. package/build/tabs/tablist.js +47 -0
  70. package/build/tabs/tablist.js.map +1 -0
  71. package/build/tabs/tabpanel.js +48 -0
  72. package/build/tabs/tabpanel.js.map +1 -0
  73. package/build/tabs/types.js +6 -0
  74. package/build/tabs/types.js.map +1 -0
  75. package/build/text/component.js +7 -6
  76. package/build/text/component.js.map +1 -1
  77. package/build/text/hook.js +6 -15
  78. package/build/text/hook.js.map +1 -1
  79. package/build/text/index.js.map +1 -1
  80. package/build/text/styles.js +7 -7
  81. package/build/text/styles.js.map +1 -1
  82. package/build/text/types.js.map +1 -1
  83. package/build/text/utils.js +17 -33
  84. package/build/text/utils.js.map +1 -1
  85. package/build/toggle-group-control/toggle-group-control-option-base/component.js +1 -0
  86. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  87. package/build/toolbar/toolbar/index.js +17 -10
  88. package/build/toolbar/toolbar/index.js.map +1 -1
  89. package/build/toolbar/toolbar/types.js.map +1 -1
  90. package/build/tools-panel/tools-panel-item/hook.js +2 -2
  91. package/build/tools-panel/tools-panel-item/hook.js.map +1 -1
  92. package/build/tools-panel/types.js.map +1 -1
  93. package/build/tooltip/index.js +2 -2
  94. package/build/tooltip/index.js.map +1 -1
  95. package/build/unit-control/utils.js +108 -0
  96. package/build/unit-control/utils.js.map +1 -1
  97. package/build/utils/unit-values.js +1 -1
  98. package/build/utils/unit-values.js.map +1 -1
  99. package/build-module/alignment-matrix-control/cell.js +7 -4
  100. package/build-module/alignment-matrix-control/cell.js.map +1 -1
  101. package/build-module/alignment-matrix-control/index.js +27 -43
  102. package/build-module/alignment-matrix-control/index.js.map +1 -1
  103. package/build-module/alignment-matrix-control/utils.js +29 -8
  104. package/build-module/alignment-matrix-control/utils.js.map +1 -1
  105. package/build-module/autocomplete/index.js +104 -52
  106. package/build-module/autocomplete/index.js.map +1 -1
  107. package/build-module/circular-option-picker/circular-option-picker-option.js +20 -39
  108. package/build-module/circular-option-picker/circular-option-picker-option.js.map +1 -1
  109. package/build-module/circular-option-picker/circular-option-picker.js +10 -31
  110. package/build-module/circular-option-picker/circular-option-picker.js.map +1 -1
  111. package/build-module/circular-option-picker/types.js.map +1 -1
  112. package/build-module/color-palette/index.js +7 -2
  113. package/build-module/color-palette/index.js.map +1 -1
  114. package/build-module/color-picker/component.js +13 -3
  115. package/build-module/color-picker/component.js.map +1 -1
  116. package/build-module/color-picker/picker.js +78 -2
  117. package/build-module/color-picker/picker.js.map +1 -1
  118. package/build-module/color-picker/styles.js +8 -8
  119. package/build-module/color-picker/styles.js.map +1 -1
  120. package/build-module/color-picker/types.js.map +1 -1
  121. package/build-module/composite/v2.js +15 -0
  122. package/build-module/composite/v2.js.map +1 -0
  123. package/build-module/confirm-dialog/component.js +72 -7
  124. package/build-module/confirm-dialog/component.js.map +1 -1
  125. package/build-module/confirm-dialog/types.js.map +1 -1
  126. package/build-module/custom-gradient-picker/gradient-bar/control-points.js +13 -4
  127. package/build-module/custom-gradient-picker/gradient-bar/control-points.js.map +1 -1
  128. package/build-module/dropdown-menu-v2-ariakit/index.js +199 -0
  129. package/build-module/dropdown-menu-v2-ariakit/index.js.map +1 -0
  130. package/build-module/dropdown-menu-v2-ariakit/styles.js +136 -0
  131. package/build-module/dropdown-menu-v2-ariakit/styles.js.map +1 -0
  132. package/build-module/dropdown-menu-v2-ariakit/types.js +2 -0
  133. package/build-module/dropdown-menu-v2-ariakit/types.js.map +1 -0
  134. package/build-module/font-size-picker/utils.js +1 -1
  135. package/build-module/font-size-picker/utils.js.map +1 -1
  136. package/build-module/input-control/styles/input-control-styles.js +23 -23
  137. package/build-module/input-control/styles/input-control-styles.js.map +1 -1
  138. package/build-module/mobile/global-styles-context/utils.native.js +2 -2
  139. package/build-module/mobile/global-styles-context/utils.native.js.map +1 -1
  140. package/build-module/modal/index.js +47 -18
  141. package/build-module/modal/index.js.map +1 -1
  142. package/build-module/palette-edit/index.js +4 -0
  143. package/build-module/palette-edit/index.js.map +1 -1
  144. package/build-module/popover/index.js +34 -6
  145. package/build-module/popover/index.js.map +1 -1
  146. package/build-module/private-apis.js +18 -2
  147. package/build-module/private-apis.js.map +1 -1
  148. package/build-module/progress-bar/styles.js +5 -5
  149. package/build-module/progress-bar/styles.js.map +1 -1
  150. package/build-module/sandbox/index.js +1 -1
  151. package/build-module/sandbox/index.js.map +1 -1
  152. package/build-module/sandbox/index.native.js +1 -1
  153. package/build-module/sandbox/index.native.js.map +1 -1
  154. package/build-module/select-control/styles/select-control-styles.js +8 -8
  155. package/build-module/select-control/styles/select-control-styles.js.map +1 -1
  156. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js +1 -1
  157. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  158. package/build-module/tabs/context.js +12 -0
  159. package/build-module/tabs/context.js.map +1 -0
  160. package/build-module/tabs/index.js +142 -0
  161. package/build-module/tabs/index.js.map +1 -0
  162. package/build-module/tabs/styles.js +36 -0
  163. package/build-module/tabs/styles.js.map +1 -0
  164. package/build-module/tabs/tab.js +43 -0
  165. package/build-module/tabs/tab.js.map +1 -0
  166. package/build-module/tabs/tablist.js +41 -0
  167. package/build-module/tabs/tablist.js.map +1 -0
  168. package/build-module/tabs/tabpanel.js +43 -0
  169. package/build-module/tabs/tabpanel.js.map +1 -0
  170. package/build-module/tabs/types.js +2 -0
  171. package/build-module/tabs/types.js.map +1 -0
  172. package/build-module/text/component.js +6 -6
  173. package/build-module/text/component.js.map +1 -1
  174. package/build-module/text/hook.js +11 -19
  175. package/build-module/text/hook.js.map +1 -1
  176. package/build-module/text/index.js.map +1 -1
  177. package/build-module/text/styles.js +7 -7
  178. package/build-module/text/styles.js.map +1 -1
  179. package/build-module/text/types.js.map +1 -1
  180. package/build-module/text/utils.js +17 -10
  181. package/build-module/text/utils.js.map +1 -1
  182. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +1 -0
  183. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  184. package/build-module/toolbar/toolbar/index.js +18 -11
  185. package/build-module/toolbar/toolbar/index.js.map +1 -1
  186. package/build-module/toolbar/toolbar/types.js.map +1 -1
  187. package/build-module/tools-panel/tools-panel-item/hook.js +2 -2
  188. package/build-module/tools-panel/tools-panel-item/hook.js.map +1 -1
  189. package/build-module/tools-panel/types.js.map +1 -1
  190. package/build-module/tooltip/index.js +2 -2
  191. package/build-module/tooltip/index.js.map +1 -1
  192. package/build-module/unit-control/utils.js +108 -0
  193. package/build-module/unit-control/utils.js.map +1 -1
  194. package/build-module/utils/unit-values.js +1 -1
  195. package/build-module/utils/unit-values.js.map +1 -1
  196. package/build-style/style-rtl.css +17 -5
  197. package/build-style/style.css +17 -5
  198. package/build-types/alignment-matrix-control/cell.d.ts +1 -1
  199. package/build-types/alignment-matrix-control/cell.d.ts.map +1 -1
  200. package/build-types/alignment-matrix-control/index.d.ts.map +1 -1
  201. package/build-types/alignment-matrix-control/stories/index.story.d.ts.map +1 -1
  202. package/build-types/alignment-matrix-control/utils.d.ts +9 -9
  203. package/build-types/alignment-matrix-control/utils.d.ts.map +1 -1
  204. package/build-types/autocomplete/index.d.ts.map +1 -1
  205. package/build-types/circular-option-picker/circular-option-picker-option.d.ts.map +1 -1
  206. package/build-types/circular-option-picker/circular-option-picker.d.ts.map +1 -1
  207. package/build-types/circular-option-picker/types.d.ts +4 -6
  208. package/build-types/circular-option-picker/types.d.ts.map +1 -1
  209. package/build-types/color-palette/index.d.ts.map +1 -1
  210. package/build-types/color-picker/component.d.ts.map +1 -1
  211. package/build-types/color-picker/picker.d.ts +1 -1
  212. package/build-types/color-picker/picker.d.ts.map +1 -1
  213. package/build-types/color-picker/styles.d.ts.map +1 -1
  214. package/build-types/color-picker/types.d.ts +3 -0
  215. package/build-types/color-picker/types.d.ts.map +1 -1
  216. package/build-types/composite/v2.d.ts +12 -0
  217. package/build-types/composite/v2.d.ts.map +1 -0
  218. package/build-types/confirm-dialog/component.d.ts +70 -29
  219. package/build-types/confirm-dialog/component.d.ts.map +1 -1
  220. package/build-types/confirm-dialog/stories/index.story.d.ts +11 -0
  221. package/build-types/confirm-dialog/stories/index.story.d.ts.map +1 -0
  222. package/build-types/confirm-dialog/test/index.d.ts +2 -0
  223. package/build-types/confirm-dialog/test/index.d.ts.map +1 -0
  224. package/build-types/confirm-dialog/types.d.ts +32 -10
  225. package/build-types/confirm-dialog/types.d.ts.map +1 -1
  226. package/build-types/custom-gradient-picker/gradient-bar/control-points.d.ts.map +1 -1
  227. package/build-types/dropdown-menu-v2-ariakit/index.d.ts +11 -0
  228. package/build-types/dropdown-menu-v2-ariakit/index.d.ts.map +1 -0
  229. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts +16 -0
  230. package/build-types/dropdown-menu-v2-ariakit/stories/index.story.d.ts.map +1 -0
  231. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts +88 -0
  232. package/build-types/dropdown-menu-v2-ariakit/styles.d.ts.map +1 -0
  233. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts +2 -0
  234. package/build-types/dropdown-menu-v2-ariakit/test/index.d.ts.map +1 -0
  235. package/build-types/dropdown-menu-v2-ariakit/types.d.ts +174 -0
  236. package/build-types/dropdown-menu-v2-ariakit/types.d.ts.map +1 -0
  237. package/build-types/font-size-picker/utils.d.ts.map +1 -1
  238. package/build-types/heading/stories/index.story.d.ts.map +1 -1
  239. package/build-types/modal/index.d.ts.map +1 -1
  240. package/build-types/palette-edit/index.d.ts.map +1 -1
  241. package/build-types/popover/index.d.ts +1 -1
  242. package/build-types/popover/index.d.ts.map +1 -1
  243. package/build-types/popover/stories/e2e/index.story.d.ts +1 -1
  244. package/build-types/private-apis.d.ts.map +1 -1
  245. package/build-types/progress-bar/styles.d.ts.map +1 -1
  246. package/build-types/sandbox/index.d.ts.map +1 -1
  247. package/build-types/tabs/context.d.ts +8 -0
  248. package/build-types/tabs/context.d.ts.map +1 -0
  249. package/build-types/tabs/index.d.ts +13 -0
  250. package/build-types/tabs/index.d.ts.map +1 -0
  251. package/build-types/tabs/stories/index.story.d.ts +20 -0
  252. package/build-types/tabs/stories/index.story.d.ts.map +1 -0
  253. package/build-types/tabs/styles.d.ts +17 -0
  254. package/build-types/tabs/styles.d.ts.map +1 -0
  255. package/build-types/tabs/tab.d.ts +10 -0
  256. package/build-types/tabs/tab.d.ts.map +1 -0
  257. package/build-types/tabs/tablist.d.ts +7 -0
  258. package/build-types/tabs/tablist.d.ts.map +1 -0
  259. package/build-types/tabs/tabpanel.d.ts +7 -0
  260. package/build-types/tabs/tabpanel.d.ts.map +1 -0
  261. package/build-types/tabs/test/index.d.ts +2 -0
  262. package/build-types/tabs/test/index.d.ts.map +1 -0
  263. package/build-types/tabs/types.d.ts +134 -0
  264. package/build-types/tabs/types.d.ts.map +1 -0
  265. package/build-types/text/component.d.ts +4 -2
  266. package/build-types/text/component.d.ts.map +1 -1
  267. package/build-types/text/hook.d.ts +171 -165
  268. package/build-types/text/hook.d.ts.map +1 -1
  269. package/build-types/text/index.d.ts +2 -2
  270. package/build-types/text/index.d.ts.map +1 -1
  271. package/build-types/text/stories/index.story.d.ts +21 -0
  272. package/build-types/text/stories/index.story.d.ts.map +1 -0
  273. package/build-types/text/styles.d.ts +7 -7
  274. package/build-types/text/styles.d.ts.map +1 -1
  275. package/build-types/text/types.d.ts +1 -1
  276. package/build-types/text/types.d.ts.map +1 -1
  277. package/build-types/text/utils.d.ts +56 -61
  278. package/build-types/text/utils.d.ts.map +1 -1
  279. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  280. package/build-types/toolbar/stories/index.story.d.ts +5 -0
  281. package/build-types/toolbar/stories/index.story.d.ts.map +1 -1
  282. package/build-types/toolbar/toolbar/index.d.ts.map +1 -1
  283. package/build-types/toolbar/toolbar/types.d.ts +10 -0
  284. package/build-types/toolbar/toolbar/types.d.ts.map +1 -1
  285. package/build-types/tools-panel/tools-panel-item/hook.d.ts.map +1 -1
  286. package/build-types/tools-panel/types.d.ts +2 -0
  287. package/build-types/tools-panel/types.d.ts.map +1 -1
  288. package/build-types/tooltip/index.d.ts.map +1 -1
  289. package/build-types/unit-control/utils.d.ts.map +1 -1
  290. package/package.json +21 -20
  291. package/src/alignment-matrix-control/cell.tsx +6 -2
  292. package/src/alignment-matrix-control/index.tsx +31 -54
  293. package/src/alignment-matrix-control/stories/index.story.tsx +3 -7
  294. package/src/alignment-matrix-control/test/index.tsx +117 -18
  295. package/src/alignment-matrix-control/utils.tsx +33 -9
  296. package/src/autocomplete/index.tsx +136 -77
  297. package/src/button/style.scss +1 -2
  298. package/src/circular-option-picker/circular-option-picker-option.tsx +24 -38
  299. package/src/circular-option-picker/circular-option-picker.tsx +11 -28
  300. package/src/circular-option-picker/types.ts +6 -5
  301. package/src/color-palette/index.tsx +6 -1
  302. package/src/color-picker/component.tsx +25 -3
  303. package/src/color-picker/picker.tsx +96 -2
  304. package/src/color-picker/styles.ts +0 -1
  305. package/src/color-picker/types.ts +3 -0
  306. package/src/composite/v2.ts +22 -0
  307. package/src/confirm-dialog/README.md +1 -1
  308. package/src/confirm-dialog/component.tsx +79 -13
  309. package/src/confirm-dialog/stories/{index.story.js → index.story.tsx} +26 -24
  310. package/src/confirm-dialog/test/{index.js → index.tsx} +3 -3
  311. package/src/confirm-dialog/types.ts +32 -12
  312. package/src/custom-gradient-picker/gradient-bar/control-points.tsx +32 -25
  313. package/src/dimension-control/test/__snapshots__/index.test.js.snap +8 -8
  314. package/src/dropdown-menu-v2-ariakit/README.md +324 -0
  315. package/src/dropdown-menu-v2-ariakit/index.tsx +318 -0
  316. package/src/dropdown-menu-v2-ariakit/stories/index.story.tsx +506 -0
  317. package/src/dropdown-menu-v2-ariakit/styles.ts +297 -0
  318. package/src/dropdown-menu-v2-ariakit/test/index.tsx +1139 -0
  319. package/src/dropdown-menu-v2-ariakit/types.ts +186 -0
  320. package/src/font-size-picker/utils.ts +2 -1
  321. package/src/heading/stories/index.story.tsx +2 -4
  322. package/src/input-control/styles/input-control-styles.tsx +2 -2
  323. package/src/mobile/global-styles-context/utils.native.js +2 -2
  324. package/src/modal/index.tsx +58 -22
  325. package/src/modal/test/index.tsx +29 -0
  326. package/src/notice/style.scss +0 -1
  327. package/src/palette-edit/index.tsx +4 -0
  328. package/src/popover/index.tsx +99 -57
  329. package/src/popover/style.scss +9 -0
  330. package/src/private-apis.ts +31 -1
  331. package/src/progress-bar/styles.ts +19 -4
  332. package/src/sandbox/index.native.js +1 -1
  333. package/src/sandbox/index.tsx +3 -1
  334. package/src/select-control/styles/select-control-styles.ts +2 -2
  335. package/src/slot-fill/bubbles-virtually/slot-fill-provider.tsx +1 -1
  336. package/src/tabs/README.md +242 -0
  337. package/src/tabs/context.ts +13 -0
  338. package/src/tabs/index.tsx +167 -0
  339. package/src/tabs/stories/index.story.tsx +352 -0
  340. package/src/tabs/styles.ts +103 -0
  341. package/src/tabs/tab.tsx +39 -0
  342. package/src/tabs/tablist.tsx +40 -0
  343. package/src/tabs/tabpanel.tsx +42 -0
  344. package/src/tabs/test/index.tsx +1133 -0
  345. package/src/tabs/types.ts +142 -0
  346. package/src/text/README.md +2 -2
  347. package/src/text/{component.js → component.tsx} +10 -6
  348. package/src/text/{hook.js → hook.ts} +12 -15
  349. package/src/text/stories/index.story.tsx +80 -0
  350. package/src/text/types.ts +1 -6
  351. package/src/text/{utils.js → utils.ts} +40 -14
  352. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +16 -0
  353. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +1 -0
  354. package/src/toolbar/stories/index.story.tsx +15 -0
  355. package/src/toolbar/test/index.tsx +8 -0
  356. package/src/toolbar/toolbar/README.md +9 -0
  357. package/src/toolbar/toolbar/index.tsx +21 -12
  358. package/src/toolbar/toolbar/style.scss +9 -0
  359. package/src/toolbar/toolbar/types.ts +10 -0
  360. package/src/tools-panel/tools-panel/README.md +3 -0
  361. package/src/tools-panel/tools-panel-item/hook.ts +4 -6
  362. package/src/tools-panel/types.ts +2 -0
  363. package/src/tooltip/index.tsx +2 -3
  364. package/src/unit-control/utils.ts +124 -0
  365. package/src/utils/unit-values.ts +1 -1
  366. package/tsconfig.tsbuildinfo +1 -1
  367. package/src/text/stories/index.story.js +0 -53
  368. /package/src/text/{index.js → index.ts} +0 -0
  369. /package/src/text/{styles.js → styles.ts} +0 -0
@@ -9,22 +9,15 @@ import classnames from 'classnames';
9
9
  */
10
10
  import { __, isRTL } from '@wordpress/i18n';
11
11
  import { useInstanceId } from '@wordpress/compose';
12
- import { useState, useEffect } from '@wordpress/element';
13
12
 
14
13
  /**
15
14
  * Internal dependencies
16
15
  */
17
16
  import Cell from './cell';
18
- import { Composite, CompositeGroup, useCompositeState } from '../composite';
17
+ import { Composite, CompositeRow, useCompositeStore } from '../composite/v2';
19
18
  import { Root, Row } from './styles/alignment-matrix-control-styles';
20
19
  import AlignmentMatrixControlIcon from './icon';
21
- import { GRID, getItemId } from './utils';
22
- const noop = () => {};
23
- function useBaseId(id) {
24
- const instanceId = useInstanceId(AlignmentMatrixControl, 'alignment-matrix-control');
25
- return id || instanceId;
26
- }
27
-
20
+ import { GRID, getItemId, getItemValue } from './utils';
28
21
  /**
29
22
  *
30
23
  * AlignmentMatrixControl components enable adjustments to horizontal and vertical alignments for UI.
@@ -51,54 +44,45 @@ export function AlignmentMatrixControl({
51
44
  label = __('Alignment Matrix Control'),
52
45
  defaultValue = 'center center',
53
46
  value,
54
- onChange = noop,
47
+ onChange,
55
48
  width = 92,
56
49
  ...props
57
50
  }) {
58
- const [immutableDefaultValue] = useState(value !== null && value !== void 0 ? value : defaultValue);
59
- const baseId = useBaseId(id);
60
- const initialCurrentId = getItemId(baseId, immutableDefaultValue);
61
- const composite = useCompositeState({
62
- baseId,
63
- currentId: initialCurrentId,
51
+ const baseId = useInstanceId(AlignmentMatrixControl, 'alignment-matrix-control', id);
52
+ const compositeStore = useCompositeStore({
53
+ defaultActiveId: getItemId(baseId, defaultValue),
54
+ activeId: getItemId(baseId, value),
55
+ setActiveId: nextActiveId => {
56
+ const nextValue = getItemValue(baseId, nextActiveId);
57
+ if (nextValue) onChange?.(nextValue);
58
+ },
64
59
  rtl: isRTL()
65
60
  });
66
- const handleOnChange = nextValue => {
67
- onChange(nextValue);
68
- };
69
- const {
70
- setCurrentId
71
- } = composite;
72
- useEffect(() => {
73
- if (typeof value !== 'undefined') {
74
- setCurrentId(getItemId(baseId, value));
75
- }
76
- }, [value, setCurrentId, baseId]);
61
+ const activeId = compositeStore.useState('activeId');
77
62
  const classes = classnames('component-alignment-matrix-control', className);
78
63
  return createElement(Composite, {
79
- ...props,
80
- ...composite,
81
- "aria-label": label,
82
- as: Root,
83
- className: classes,
84
- role: "grid",
85
- size: width
86
- }, GRID.map((cells, index) => createElement(CompositeGroup, {
87
- ...composite,
88
- as: Row,
89
- role: "row",
64
+ store: compositeStore,
65
+ render: createElement(Root, {
66
+ ...props,
67
+ "aria-label": label,
68
+ className: classes,
69
+ id: baseId,
70
+ role: "grid",
71
+ size: width
72
+ })
73
+ }, GRID.map((cells, index) => createElement(CompositeRow, {
74
+ render: createElement(Row, {
75
+ role: "row"
76
+ }),
90
77
  key: index
91
78
  }, cells.map(cell => {
92
79
  const cellId = getItemId(baseId, cell);
93
- const isActive = composite.currentId === cellId;
80
+ const isActive = cellId === activeId;
94
81
  return createElement(Cell, {
95
- ...composite,
96
82
  id: cellId,
97
83
  isActive: isActive,
98
84
  key: cell,
99
- value: cell,
100
- onFocus: () => handleOnChange(cell),
101
- tabIndex: isActive ? 0 : -1
85
+ value: cell
102
86
  });
103
87
  }))));
104
88
  }
@@ -1 +1 @@
1
- {"version":3,"names":["classnames","__","isRTL","useInstanceId","useState","useEffect","Cell","Composite","CompositeGroup","useCompositeState","Root","Row","AlignmentMatrixControlIcon","GRID","getItemId","noop","useBaseId","id","instanceId","AlignmentMatrixControl","className","label","defaultValue","value","onChange","width","props","immutableDefaultValue","baseId","initialCurrentId","composite","currentId","rtl","handleOnChange","nextValue","setCurrentId","classes","createElement","as","role","size","map","cells","index","key","cell","cellId","isActive","onFocus","tabIndex","Icon"],"sources":["@wordpress/components/src/alignment-matrix-control/index.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { __, isRTL } from '@wordpress/i18n';\nimport { useInstanceId } from '@wordpress/compose';\nimport { useState, useEffect } from '@wordpress/element';\n\n/**\n * Internal dependencies\n */\nimport Cell from './cell';\nimport { Composite, CompositeGroup, useCompositeState } from '../composite';\nimport { Root, Row } from './styles/alignment-matrix-control-styles';\nimport AlignmentMatrixControlIcon from './icon';\nimport { GRID, getItemId } from './utils';\nimport type { WordPressComponentProps } from '../context';\nimport type {\n\tAlignmentMatrixControlProps,\n\tAlignmentMatrixControlValue,\n} from './types';\n\nconst noop = () => {};\n\nfunction useBaseId( id?: string ) {\n\tconst instanceId = useInstanceId(\n\t\tAlignmentMatrixControl,\n\t\t'alignment-matrix-control'\n\t);\n\n\treturn id || instanceId;\n}\n\n/**\n *\n * AlignmentMatrixControl components enable adjustments to horizontal and vertical alignments for UI.\n *\n * ```jsx\n * import { __experimentalAlignmentMatrixControl as AlignmentMatrixControl } from '@wordpress/components';\n * import { useState } from '@wordpress/element';\n *\n * const Example = () => {\n * \tconst [ alignment, setAlignment ] = useState( 'center center' );\n *\n * \treturn (\n * \t\t<AlignmentMatrixControl\n * \t\t\tvalue={ alignment }\n * \t\t\tonChange={ setAlignment }\n * \t\t/>\n * \t);\n * };\n * ```\n */\nexport function AlignmentMatrixControl( {\n\tclassName,\n\tid,\n\tlabel = __( 'Alignment Matrix Control' ),\n\tdefaultValue = 'center center',\n\tvalue,\n\tonChange = noop,\n\twidth = 92,\n\t...props\n}: WordPressComponentProps< AlignmentMatrixControlProps, 'div', false > ) {\n\tconst [ immutableDefaultValue ] = useState( value ?? defaultValue );\n\tconst baseId = useBaseId( id );\n\tconst initialCurrentId = getItemId( baseId, immutableDefaultValue );\n\n\tconst composite = useCompositeState( {\n\t\tbaseId,\n\t\tcurrentId: initialCurrentId,\n\t\trtl: isRTL(),\n\t} );\n\n\tconst handleOnChange = ( nextValue: AlignmentMatrixControlValue ) => {\n\t\tonChange( nextValue );\n\t};\n\n\tconst { setCurrentId } = composite;\n\n\tuseEffect( () => {\n\t\tif ( typeof value !== 'undefined' ) {\n\t\t\tsetCurrentId( getItemId( baseId, value ) );\n\t\t}\n\t}, [ value, setCurrentId, baseId ] );\n\n\tconst classes = classnames(\n\t\t'component-alignment-matrix-control',\n\t\tclassName\n\t);\n\n\treturn (\n\t\t<Composite\n\t\t\t{ ...props }\n\t\t\t{ ...composite }\n\t\t\taria-label={ label }\n\t\t\tas={ Root }\n\t\t\tclassName={ classes }\n\t\t\trole=\"grid\"\n\t\t\tsize={ width }\n\t\t>\n\t\t\t{ GRID.map( ( cells, index ) => (\n\t\t\t\t<CompositeGroup\n\t\t\t\t\t{ ...composite }\n\t\t\t\t\tas={ Row }\n\t\t\t\t\trole=\"row\"\n\t\t\t\t\tkey={ index }\n\t\t\t\t>\n\t\t\t\t\t{ cells.map( ( cell ) => {\n\t\t\t\t\t\tconst cellId = getItemId( baseId, cell );\n\t\t\t\t\t\tconst isActive = composite.currentId === cellId;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Cell\n\t\t\t\t\t\t\t\t{ ...composite }\n\t\t\t\t\t\t\t\tid={ cellId }\n\t\t\t\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\t\t\t\tkey={ cell }\n\t\t\t\t\t\t\t\tvalue={ cell }\n\t\t\t\t\t\t\t\tonFocus={ () => handleOnChange( cell ) }\n\t\t\t\t\t\t\t\ttabIndex={ isActive ? 0 : -1 }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</CompositeGroup>\n\t\t\t) ) }\n\t\t</Composite>\n\t);\n}\n\nAlignmentMatrixControl.Icon = AlignmentMatrixControlIcon;\n\nexport default AlignmentMatrixControl;\n"],"mappings":"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"}
1
+ {"version":3,"names":["classnames","__","isRTL","useInstanceId","Cell","Composite","CompositeRow","useCompositeStore","Root","Row","AlignmentMatrixControlIcon","GRID","getItemId","getItemValue","AlignmentMatrixControl","className","id","label","defaultValue","value","onChange","width","props","baseId","compositeStore","defaultActiveId","activeId","setActiveId","nextActiveId","nextValue","rtl","useState","classes","createElement","store","render","role","size","map","cells","index","key","cell","cellId","isActive","Icon"],"sources":["@wordpress/components/src/alignment-matrix-control/index.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport { __, isRTL } from '@wordpress/i18n';\nimport { useInstanceId } from '@wordpress/compose';\n\n/**\n * Internal dependencies\n */\nimport Cell from './cell';\nimport { Composite, CompositeRow, useCompositeStore } from '../composite/v2';\nimport { Root, Row } from './styles/alignment-matrix-control-styles';\nimport AlignmentMatrixControlIcon from './icon';\nimport { GRID, getItemId, getItemValue } from './utils';\nimport type { WordPressComponentProps } from '../context';\nimport type { AlignmentMatrixControlProps } from './types';\n\n/**\n *\n * AlignmentMatrixControl components enable adjustments to horizontal and vertical alignments for UI.\n *\n * ```jsx\n * import { __experimentalAlignmentMatrixControl as AlignmentMatrixControl } from '@wordpress/components';\n * import { useState } from '@wordpress/element';\n *\n * const Example = () => {\n * \tconst [ alignment, setAlignment ] = useState( 'center center' );\n *\n * \treturn (\n * \t\t<AlignmentMatrixControl\n * \t\t\tvalue={ alignment }\n * \t\t\tonChange={ setAlignment }\n * \t\t/>\n * \t);\n * };\n * ```\n */\nexport function AlignmentMatrixControl( {\n\tclassName,\n\tid,\n\tlabel = __( 'Alignment Matrix Control' ),\n\tdefaultValue = 'center center',\n\tvalue,\n\tonChange,\n\twidth = 92,\n\t...props\n}: WordPressComponentProps< AlignmentMatrixControlProps, 'div', false > ) {\n\tconst baseId = useInstanceId(\n\t\tAlignmentMatrixControl,\n\t\t'alignment-matrix-control',\n\t\tid\n\t);\n\n\tconst compositeStore = useCompositeStore( {\n\t\tdefaultActiveId: getItemId( baseId, defaultValue ),\n\t\tactiveId: getItemId( baseId, value ),\n\t\tsetActiveId: ( nextActiveId ) => {\n\t\t\tconst nextValue = getItemValue( baseId, nextActiveId );\n\t\t\tif ( nextValue ) onChange?.( nextValue );\n\t\t},\n\t\trtl: isRTL(),\n\t} );\n\n\tconst activeId = compositeStore.useState( 'activeId' );\n\n\tconst classes = classnames(\n\t\t'component-alignment-matrix-control',\n\t\tclassName\n\t);\n\n\treturn (\n\t\t<Composite\n\t\t\tstore={ compositeStore }\n\t\t\trender={\n\t\t\t\t<Root\n\t\t\t\t\t{ ...props }\n\t\t\t\t\taria-label={ label }\n\t\t\t\t\tclassName={ classes }\n\t\t\t\t\tid={ baseId }\n\t\t\t\t\trole=\"grid\"\n\t\t\t\t\tsize={ width }\n\t\t\t\t/>\n\t\t\t}\n\t\t>\n\t\t\t{ GRID.map( ( cells, index ) => (\n\t\t\t\t<CompositeRow render={ <Row role=\"row\" /> } key={ index }>\n\t\t\t\t\t{ cells.map( ( cell ) => {\n\t\t\t\t\t\tconst cellId = getItemId( baseId, cell );\n\t\t\t\t\t\tconst isActive = cellId === activeId;\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<Cell\n\t\t\t\t\t\t\t\tid={ cellId }\n\t\t\t\t\t\t\t\tisActive={ isActive }\n\t\t\t\t\t\t\t\tkey={ cell }\n\t\t\t\t\t\t\t\tvalue={ cell }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t);\n\t\t\t\t\t} ) }\n\t\t\t\t</CompositeRow>\n\t\t\t) ) }\n\t\t</Composite>\n\t);\n}\n\nAlignmentMatrixControl.Icon = AlignmentMatrixControlIcon;\n\nexport default AlignmentMatrixControl;\n"],"mappings":";AAAA;AACA;AACA;AACA,OAAOA,UAAU,MAAM,YAAY;;AAEnC;AACA;AACA;AACA,SAASC,EAAE,EAAEC,KAAK,QAAQ,iBAAiB;AAC3C,SAASC,aAAa,QAAQ,oBAAoB;;AAElD;AACA;AACA;AACA,OAAOC,IAAI,MAAM,QAAQ;AACzB,SAASC,SAAS,EAAEC,YAAY,EAAEC,iBAAiB,QAAQ,iBAAiB;AAC5E,SAASC,IAAI,EAAEC,GAAG,QAAQ,0CAA0C;AACpE,OAAOC,0BAA0B,MAAM,QAAQ;AAC/C,SAASC,IAAI,EAAEC,SAAS,EAAEC,YAAY,QAAQ,SAAS;AAIvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,sBAAsBA,CAAE;EACvCC,SAAS;EACTC,EAAE;EACFC,KAAK,GAAGhB,EAAE,CAAE,0BAA2B,CAAC;EACxCiB,YAAY,GAAG,eAAe;EAC9BC,KAAK;EACLC,QAAQ;EACRC,KAAK,GAAG,EAAE;EACV,GAAGC;AACkE,CAAC,EAAG;EACzE,MAAMC,MAAM,GAAGpB,aAAa,CAC3BW,sBAAsB,EACtB,0BAA0B,EAC1BE,EACD,CAAC;EAED,MAAMQ,cAAc,GAAGjB,iBAAiB,CAAE;IACzCkB,eAAe,EAAEb,SAAS,CAAEW,MAAM,EAAEL,YAAa,CAAC;IAClDQ,QAAQ,EAAEd,SAAS,CAAEW,MAAM,EAAEJ,KAAM,CAAC;IACpCQ,WAAW,EAAIC,YAAY,IAAM;MAChC,MAAMC,SAAS,GAAGhB,YAAY,CAAEU,MAAM,EAAEK,YAAa,CAAC;MACtD,IAAKC,SAAS,EAAGT,QAAQ,GAAIS,SAAU,CAAC;IACzC,CAAC;IACDC,GAAG,EAAE5B,KAAK,CAAC;EACZ,CAAE,CAAC;EAEH,MAAMwB,QAAQ,GAAGF,cAAc,CAACO,QAAQ,CAAE,UAAW,CAAC;EAEtD,MAAMC,OAAO,GAAGhC,UAAU,CACzB,oCAAoC,EACpCe,SACD,CAAC;EAED,OACCkB,aAAA,CAAC5B,SAAS;IACT6B,KAAK,EAAGV,cAAgB;IACxBW,MAAM,EACLF,aAAA,CAACzB,IAAI;MAAA,GACCc,KAAK;MACV,cAAaL,KAAO;MACpBF,SAAS,EAAGiB,OAAS;MACrBhB,EAAE,EAAGO,MAAQ;MACba,IAAI,EAAC,MAAM;MACXC,IAAI,EAAGhB;IAAO,CACd;EACD,GAECV,IAAI,CAAC2B,GAAG,CAAE,CAAEC,KAAK,EAAEC,KAAK,KACzBP,aAAA,CAAC3B,YAAY;IAAC6B,MAAM,EAAGF,aAAA,CAACxB,GAAG;MAAC2B,IAAI,EAAC;IAAK,CAAE,CAAG;IAACK,GAAG,EAAGD;EAAO,GACtDD,KAAK,CAACD,GAAG,CAAII,IAAI,IAAM;IACxB,MAAMC,MAAM,GAAG/B,SAAS,CAAEW,MAAM,EAAEmB,IAAK,CAAC;IACxC,MAAME,QAAQ,GAAGD,MAAM,KAAKjB,QAAQ;IAEpC,OACCO,aAAA,CAAC7B,IAAI;MACJY,EAAE,EAAG2B,MAAQ;MACbC,QAAQ,EAAGA,QAAU;MACrBH,GAAG,EAAGC,IAAM;MACZvB,KAAK,EAAGuB;IAAM,CACd,CAAC;EAEJ,CAAE,CACW,CACb,CACQ,CAAC;AAEd;AAEA5B,sBAAsB,CAAC+B,IAAI,GAAGnC,0BAA0B;AAExD,eAAeI,sBAAsB"}
@@ -2,6 +2,7 @@
2
2
  * WordPress dependencies
3
3
  */
4
4
  import { __ } from '@wordpress/i18n';
5
+
5
6
  /**
6
7
  * Internal dependencies
7
8
  */
@@ -26,15 +27,20 @@ export const ALIGNMENT_LABEL = {
26
27
  export const ALIGNMENTS = GRID.flat();
27
28
 
28
29
  /**
29
- * Parses and transforms an incoming value to better match the alignment values
30
+ * Normalizes and transforms an incoming value to better match the alignment values
30
31
  *
31
32
  * @param value An alignment value to parse.
32
33
  *
33
34
  * @return The parsed value.
34
35
  */
35
- export function transformValue(value) {
36
- const nextValue = value === 'center' ? 'center center' : value;
37
- return nextValue.replace('-', ' ');
36
+ function normalize(value) {
37
+ const normalized = value === 'center' ? 'center center' : value;
38
+
39
+ // Strictly speaking, this could be `string | null | undefined`,
40
+ // but will be validated shortly, so we're typecasting to an
41
+ // `AlignmentMatrixControlValue` to keep TypeScript happy.
42
+ const transformed = normalized?.replace('-', ' ');
43
+ return ALIGNMENTS.includes(transformed) ? transformed : undefined;
38
44
  }
39
45
 
40
46
  /**
@@ -46,8 +52,22 @@ export function transformValue(value) {
46
52
  * @return The item id.
47
53
  */
48
54
  export function getItemId(prefixId, value) {
49
- const valueId = transformValue(value).replace(' ', '-');
50
- return `${prefixId}-${valueId}`;
55
+ const normalized = normalize(value);
56
+ if (!normalized) return;
57
+ const id = normalized.replace(' ', '-');
58
+ return `${prefixId}-${id}`;
59
+ }
60
+
61
+ /**
62
+ * Extracts an item value from its ID
63
+ *
64
+ * @param prefixId An ID prefix to remove
65
+ * @param id An item ID
66
+ * @return The item value
67
+ */
68
+ export function getItemValue(prefixId, id) {
69
+ const value = id?.replace(prefixId + '-', '');
70
+ return normalize(value);
51
71
  }
52
72
 
53
73
  /**
@@ -58,8 +78,9 @@ export function getItemId(prefixId, value) {
58
78
  * @return The index of a matching alignment.
59
79
  */
60
80
  export function getAlignmentIndex(alignment = 'center') {
61
- const item = transformValue(alignment);
62
- const index = ALIGNMENTS.indexOf(item);
81
+ const normalized = normalize(alignment);
82
+ if (!normalized) return undefined;
83
+ const index = ALIGNMENTS.indexOf(normalized);
63
84
  return index > -1 ? index : undefined;
64
85
  }
65
86
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["__","GRID","ALIGNMENT_LABEL","center","ALIGNMENTS","flat","transformValue","value","nextValue","replace","getItemId","prefixId","valueId","getAlignmentIndex","alignment","item","index","indexOf","undefined"],"sources":["@wordpress/components/src/alignment-matrix-control/utils.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\n/**\n * Internal dependencies\n */\nimport type { AlignmentMatrixControlValue } from './types';\n\nexport const GRID: AlignmentMatrixControlValue[][] = [\n\t[ 'top left', 'top center', 'top right' ],\n\t[ 'center left', 'center center', 'center right' ],\n\t[ 'bottom left', 'bottom center', 'bottom right' ],\n];\n\n// Stored as map as i18n __() only accepts strings (not variables)\nexport const ALIGNMENT_LABEL: Record< AlignmentMatrixControlValue, string > = {\n\t'top left': __( 'Top Left' ),\n\t'top center': __( 'Top Center' ),\n\t'top right': __( 'Top Right' ),\n\t'center left': __( 'Center Left' ),\n\t'center center': __( 'Center' ),\n\tcenter: __( 'Center' ),\n\t'center right': __( 'Center Right' ),\n\t'bottom left': __( 'Bottom Left' ),\n\t'bottom center': __( 'Bottom Center' ),\n\t'bottom right': __( 'Bottom Right' ),\n};\n\n// Transforms GRID into a flat Array of values.\nexport const ALIGNMENTS = GRID.flat();\n\n/**\n * Parses and transforms an incoming value to better match the alignment values\n *\n * @param value An alignment value to parse.\n *\n * @return The parsed value.\n */\nexport function transformValue( value: AlignmentMatrixControlValue ) {\n\tconst nextValue = value === 'center' ? 'center center' : value;\n\n\treturn nextValue.replace( '-', ' ' ) as AlignmentMatrixControlValue;\n}\n\n/**\n * Creates an item ID based on a prefix ID and an alignment value.\n *\n * @param prefixId An ID to prefix.\n * @param value An alignment value.\n *\n * @return The item id.\n */\nexport function getItemId(\n\tprefixId: string,\n\tvalue: AlignmentMatrixControlValue\n) {\n\tconst valueId = transformValue( value ).replace( ' ', '-' );\n\n\treturn `${ prefixId }-${ valueId }`;\n}\n\n/**\n * Retrieves the alignment index from a value.\n *\n * @param alignment Value to check.\n *\n * @return The index of a matching alignment.\n */\nexport function getAlignmentIndex(\n\talignment: AlignmentMatrixControlValue = 'center'\n) {\n\tconst item = transformValue( alignment );\n\tconst index = ALIGNMENTS.indexOf( item );\n\n\treturn index > -1 ? index : undefined;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,EAAE,QAAQ,iBAAiB;AACpC;AACA;AACA;;AAGA,OAAO,MAAMC,IAAqC,GAAG,CACpD,CAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAE,EACzC,CAAE,aAAa,EAAE,eAAe,EAAE,cAAc,CAAE,EAClD,CAAE,aAAa,EAAE,eAAe,EAAE,cAAc,CAAE,CAClD;;AAED;AACA,OAAO,MAAMC,eAA8D,GAAG;EAC7E,UAAU,EAAEF,EAAE,CAAE,UAAW,CAAC;EAC5B,YAAY,EAAEA,EAAE,CAAE,YAAa,CAAC;EAChC,WAAW,EAAEA,EAAE,CAAE,WAAY,CAAC;EAC9B,aAAa,EAAEA,EAAE,CAAE,aAAc,CAAC;EAClC,eAAe,EAAEA,EAAE,CAAE,QAAS,CAAC;EAC/BG,MAAM,EAAEH,EAAE,CAAE,QAAS,CAAC;EACtB,cAAc,EAAEA,EAAE,CAAE,cAAe,CAAC;EACpC,aAAa,EAAEA,EAAE,CAAE,aAAc,CAAC;EAClC,eAAe,EAAEA,EAAE,CAAE,eAAgB,CAAC;EACtC,cAAc,EAAEA,EAAE,CAAE,cAAe;AACpC,CAAC;;AAED;AACA,OAAO,MAAMI,UAAU,GAAGH,IAAI,CAACI,IAAI,CAAC,CAAC;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAAEC,KAAkC,EAAG;EACpE,MAAMC,SAAS,GAAGD,KAAK,KAAK,QAAQ,GAAG,eAAe,GAAGA,KAAK;EAE9D,OAAOC,SAAS,CAACC,OAAO,CAAE,GAAG,EAAE,GAAI,CAAC;AACrC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CACxBC,QAAgB,EAChBJ,KAAkC,EACjC;EACD,MAAMK,OAAO,GAAGN,cAAc,CAAEC,KAAM,CAAC,CAACE,OAAO,CAAE,GAAG,EAAE,GAAI,CAAC;EAE3D,OAAQ,GAAGE,QAAU,IAAIC,OAAS,EAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAChCC,SAAsC,GAAG,QAAQ,EAChD;EACD,MAAMC,IAAI,GAAGT,cAAc,CAAEQ,SAAU,CAAC;EACxC,MAAME,KAAK,GAAGZ,UAAU,CAACa,OAAO,CAAEF,IAAK,CAAC;EAExC,OAAOC,KAAK,GAAG,CAAC,CAAC,GAAGA,KAAK,GAAGE,SAAS;AACtC"}
1
+ {"version":3,"names":["__","GRID","ALIGNMENT_LABEL","center","ALIGNMENTS","flat","normalize","value","normalized","transformed","replace","includes","undefined","getItemId","prefixId","id","getItemValue","getAlignmentIndex","alignment","index","indexOf"],"sources":["@wordpress/components/src/alignment-matrix-control/utils.tsx"],"sourcesContent":["/**\n * WordPress dependencies\n */\nimport { __ } from '@wordpress/i18n';\n\n/**\n * Internal dependencies\n */\nimport type { AlignmentMatrixControlValue } from './types';\n\nexport const GRID: AlignmentMatrixControlValue[][] = [\n\t[ 'top left', 'top center', 'top right' ],\n\t[ 'center left', 'center center', 'center right' ],\n\t[ 'bottom left', 'bottom center', 'bottom right' ],\n];\n\n// Stored as map as i18n __() only accepts strings (not variables)\nexport const ALIGNMENT_LABEL: Record< AlignmentMatrixControlValue, string > = {\n\t'top left': __( 'Top Left' ),\n\t'top center': __( 'Top Center' ),\n\t'top right': __( 'Top Right' ),\n\t'center left': __( 'Center Left' ),\n\t'center center': __( 'Center' ),\n\tcenter: __( 'Center' ),\n\t'center right': __( 'Center Right' ),\n\t'bottom left': __( 'Bottom Left' ),\n\t'bottom center': __( 'Bottom Center' ),\n\t'bottom right': __( 'Bottom Right' ),\n};\n\n// Transforms GRID into a flat Array of values.\nexport const ALIGNMENTS = GRID.flat();\n\n/**\n * Normalizes and transforms an incoming value to better match the alignment values\n *\n * @param value An alignment value to parse.\n *\n * @return The parsed value.\n */\nfunction normalize( value?: string | null ) {\n\tconst normalized = value === 'center' ? 'center center' : value;\n\n\t// Strictly speaking, this could be `string | null | undefined`,\n\t// but will be validated shortly, so we're typecasting to an\n\t// `AlignmentMatrixControlValue` to keep TypeScript happy.\n\tconst transformed = normalized?.replace(\n\t\t'-',\n\t\t' '\n\t) as AlignmentMatrixControlValue;\n\n\treturn ALIGNMENTS.includes( transformed ) ? transformed : undefined;\n}\n\n/**\n * Creates an item ID based on a prefix ID and an alignment value.\n *\n * @param prefixId An ID to prefix.\n * @param value An alignment value.\n *\n * @return The item id.\n */\nexport function getItemId(\n\tprefixId: string,\n\tvalue?: AlignmentMatrixControlValue\n) {\n\tconst normalized = normalize( value );\n\tif ( ! normalized ) return;\n\n\tconst id = normalized.replace( ' ', '-' );\n\treturn `${ prefixId }-${ id }`;\n}\n\n/**\n * Extracts an item value from its ID\n *\n * @param prefixId An ID prefix to remove\n * @param id An item ID\n * @return The item value\n */\nexport function getItemValue( prefixId: string, id?: string | null ) {\n\tconst value = id?.replace( prefixId + '-', '' );\n\treturn normalize( value );\n}\n\n/**\n * Retrieves the alignment index from a value.\n *\n * @param alignment Value to check.\n *\n * @return The index of a matching alignment.\n */\nexport function getAlignmentIndex(\n\talignment: AlignmentMatrixControlValue = 'center'\n) {\n\tconst normalized = normalize( alignment );\n\tif ( ! normalized ) return undefined;\n\n\tconst index = ALIGNMENTS.indexOf( normalized );\n\treturn index > -1 ? index : undefined;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA,SAASA,EAAE,QAAQ,iBAAiB;;AAEpC;AACA;AACA;;AAGA,OAAO,MAAMC,IAAqC,GAAG,CACpD,CAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAE,EACzC,CAAE,aAAa,EAAE,eAAe,EAAE,cAAc,CAAE,EAClD,CAAE,aAAa,EAAE,eAAe,EAAE,cAAc,CAAE,CAClD;;AAED;AACA,OAAO,MAAMC,eAA8D,GAAG;EAC7E,UAAU,EAAEF,EAAE,CAAE,UAAW,CAAC;EAC5B,YAAY,EAAEA,EAAE,CAAE,YAAa,CAAC;EAChC,WAAW,EAAEA,EAAE,CAAE,WAAY,CAAC;EAC9B,aAAa,EAAEA,EAAE,CAAE,aAAc,CAAC;EAClC,eAAe,EAAEA,EAAE,CAAE,QAAS,CAAC;EAC/BG,MAAM,EAAEH,EAAE,CAAE,QAAS,CAAC;EACtB,cAAc,EAAEA,EAAE,CAAE,cAAe,CAAC;EACpC,aAAa,EAAEA,EAAE,CAAE,aAAc,CAAC;EAClC,eAAe,EAAEA,EAAE,CAAE,eAAgB,CAAC;EACtC,cAAc,EAAEA,EAAE,CAAE,cAAe;AACpC,CAAC;;AAED;AACA,OAAO,MAAMI,UAAU,GAAGH,IAAI,CAACI,IAAI,CAAC,CAAC;;AAErC;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASC,SAASA,CAAEC,KAAqB,EAAG;EAC3C,MAAMC,UAAU,GAAGD,KAAK,KAAK,QAAQ,GAAG,eAAe,GAAGA,KAAK;;EAE/D;EACA;EACA;EACA,MAAME,WAAW,GAAGD,UAAU,EAAEE,OAAO,CACtC,GAAG,EACH,GACD,CAAgC;EAEhC,OAAON,UAAU,CAACO,QAAQ,CAAEF,WAAY,CAAC,GAAGA,WAAW,GAAGG,SAAS;AACpE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,SAASA,CACxBC,QAAgB,EAChBP,KAAmC,EAClC;EACD,MAAMC,UAAU,GAAGF,SAAS,CAAEC,KAAM,CAAC;EACrC,IAAK,CAAEC,UAAU,EAAG;EAEpB,MAAMO,EAAE,GAAGP,UAAU,CAACE,OAAO,CAAE,GAAG,EAAE,GAAI,CAAC;EACzC,OAAQ,GAAGI,QAAU,IAAIC,EAAI,EAAC;AAC/B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,YAAYA,CAAEF,QAAgB,EAAEC,EAAkB,EAAG;EACpE,MAAMR,KAAK,GAAGQ,EAAE,EAAEL,OAAO,CAAEI,QAAQ,GAAG,GAAG,EAAE,EAAG,CAAC;EAC/C,OAAOR,SAAS,CAAEC,KAAM,CAAC;AAC1B;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASU,iBAAiBA,CAChCC,SAAsC,GAAG,QAAQ,EAChD;EACD,MAAMV,UAAU,GAAGF,SAAS,CAAEY,SAAU,CAAC;EACzC,IAAK,CAAEV,UAAU,EAAG,OAAOI,SAAS;EAEpC,MAAMO,KAAK,GAAGf,UAAU,CAACgB,OAAO,CAAEZ,UAAW,CAAC;EAC9C,OAAOW,KAAK,GAAG,CAAC,CAAC,GAAGA,KAAK,GAAGP,SAAS;AACtC"}
@@ -10,12 +10,41 @@ import removeAccents from 'remove-accents';
10
10
  import { renderToString, useEffect, useState, useRef, useMemo } from '@wordpress/element';
11
11
  import { useInstanceId, useMergeRefs, useRefEffect } from '@wordpress/compose';
12
12
  import { create, slice, insert, isCollapsed, getTextContent } from '@wordpress/rich-text';
13
+ import { speak } from '@wordpress/a11y';
14
+ import { isAppleOS } from '@wordpress/keycodes';
13
15
 
14
16
  /**
15
17
  * Internal dependencies
16
18
  */
17
19
  import { getAutoCompleterUI } from './autocompleter-ui';
18
20
  import { escapeRegExp } from '../utils/strings';
21
+ const getNodeText = node => {
22
+ if (node === null) {
23
+ return '';
24
+ }
25
+ switch (typeof node) {
26
+ case 'string':
27
+ case 'number':
28
+ return node.toString();
29
+ break;
30
+ case 'boolean':
31
+ return '';
32
+ break;
33
+ case 'object':
34
+ {
35
+ if (node instanceof Array) {
36
+ return node.map(getNodeText).join('');
37
+ }
38
+ if ('props' in node) {
39
+ return getNodeText(node.props.children);
40
+ }
41
+ break;
42
+ }
43
+ default:
44
+ return '';
45
+ }
46
+ return '';
47
+ };
19
48
  const EMPTY_FILTERED_OPTIONS = [];
20
49
  export function useAutocomplete({
21
50
  record,
@@ -108,11 +137,24 @@ export function useAutocomplete({
108
137
  }
109
138
  switch (event.key) {
110
139
  case 'ArrowUp':
111
- setSelectedIndex((selectedIndex === 0 ? filteredOptions.length : selectedIndex) - 1);
112
- break;
140
+ {
141
+ const newIndex = (selectedIndex === 0 ? filteredOptions.length : selectedIndex) - 1;
142
+ setSelectedIndex(newIndex);
143
+ // See the related PR as to why this is necessary: https://github.com/WordPress/gutenberg/pull/54902.
144
+ if (isAppleOS()) {
145
+ speak(getNodeText(filteredOptions[newIndex].label), 'assertive');
146
+ }
147
+ break;
148
+ }
113
149
  case 'ArrowDown':
114
- setSelectedIndex((selectedIndex + 1) % filteredOptions.length);
115
- break;
150
+ {
151
+ const newIndex = (selectedIndex + 1) % filteredOptions.length;
152
+ setSelectedIndex(newIndex);
153
+ if (isAppleOS()) {
154
+ speak(getNodeText(filteredOptions[newIndex].label), 'assertive');
155
+ }
156
+ break;
157
+ }
116
158
  case 'Escape':
117
159
  setAutocompleter(null);
118
160
  setAutocompleterUI(null);
@@ -148,58 +190,68 @@ export function useAutocomplete({
148
190
  if (autocompleter) reset();
149
191
  return;
150
192
  }
151
- const completer = completers?.find(({
152
- triggerPrefix,
153
- allowContext
154
- }) => {
155
- const index = textContent.lastIndexOf(triggerPrefix);
156
- if (index === -1) {
157
- return false;
158
- }
159
- const textWithoutTrigger = textContent.slice(index + triggerPrefix.length);
160
- const tooDistantFromTrigger = textWithoutTrigger.length > 50; // 50 chars seems to be a good limit.
161
- // This is a final barrier to prevent the effect from completing with
162
- // an extremely long string, which causes the editor to slow-down
163
- // significantly. This could happen, for example, if `matchingWhileBackspacing`
164
- // is true and one of the "words" end up being too long. If that's the case,
165
- // it will be caught by this guard.
166
- if (tooDistantFromTrigger) return false;
167
- const mismatch = filteredOptions.length === 0;
168
- const wordsFromTrigger = textWithoutTrigger.split(/\s/);
169
- // We need to allow the effect to run when not backspacing and if there
170
- // was a mismatch. i.e when typing a trigger + the match string or when
171
- // clicking in an existing trigger word on the page. We do that if we
172
- // detect that we have one word from trigger in the current textual context.
173
- //
174
- // Ex.: "Some text @a" <-- "@a" will be detected as the trigger word and
175
- // allow the effect to run. It will run until there's a mismatch.
176
- const hasOneTriggerWord = wordsFromTrigger.length === 1;
177
- // This is used to allow the effect to run when backspacing and if
178
- // "touching" a word that "belongs" to a trigger. We consider a "trigger
179
- // word" any word up to the limit of 3 from the trigger character.
180
- // Anything beyond that is ignored if there's a mismatch. This allows
181
- // us to "escape" a mismatch when backspacing, but still imposing some
182
- // sane limits.
183
- //
184
- // Ex: "Some text @marcelo sekkkk" <--- "kkkk" caused a mismatch, but
185
- // if the user presses backspace here, it will show the completion popup again.
186
- const matchingWhileBackspacing = backspacing.current && textWithoutTrigger.split(/\s/).length <= 3;
187
- if (mismatch && !(matchingWhileBackspacing || hasOneTriggerWord)) {
188
- return false;
189
- }
190
- const textAfterSelection = getTextContent(slice(record, undefined, getTextContent(record).length));
191
- if (allowContext && !allowContext(textContent.slice(0, index), textAfterSelection)) {
192
- return false;
193
- }
194
- if (/^\s/.test(textWithoutTrigger) || /\s\s+$/.test(textWithoutTrigger)) {
195
- return false;
196
- }
197
- return /[\u0000-\uFFFF]*$/.test(textWithoutTrigger);
198
- });
193
+
194
+ // Find the completer with the highest triggerPrefix index in the
195
+ // textContent.
196
+ const completer = completers.reduce((lastTrigger, currentCompleter) => {
197
+ const triggerIndex = textContent.lastIndexOf(currentCompleter.triggerPrefix);
198
+ const lastTriggerIndex = lastTrigger !== null ? textContent.lastIndexOf(lastTrigger.triggerPrefix) : -1;
199
+ return triggerIndex > lastTriggerIndex ? currentCompleter : lastTrigger;
200
+ }, null);
199
201
  if (!completer) {
200
202
  if (autocompleter) reset();
201
203
  return;
202
204
  }
205
+ const {
206
+ allowContext,
207
+ triggerPrefix
208
+ } = completer;
209
+ const triggerIndex = textContent.lastIndexOf(triggerPrefix);
210
+ const textWithoutTrigger = textContent.slice(triggerIndex + triggerPrefix.length);
211
+ const tooDistantFromTrigger = textWithoutTrigger.length > 50; // 50 chars seems to be a good limit.
212
+ // This is a final barrier to prevent the effect from completing with
213
+ // an extremely long string, which causes the editor to slow-down
214
+ // significantly. This could happen, for example, if `matchingWhileBackspacing`
215
+ // is true and one of the "words" end up being too long. If that's the case,
216
+ // it will be caught by this guard.
217
+ if (tooDistantFromTrigger) return;
218
+ const mismatch = filteredOptions.length === 0;
219
+ const wordsFromTrigger = textWithoutTrigger.split(/\s/);
220
+ // We need to allow the effect to run when not backspacing and if there
221
+ // was a mismatch. i.e when typing a trigger + the match string or when
222
+ // clicking in an existing trigger word on the page. We do that if we
223
+ // detect that we have one word from trigger in the current textual context.
224
+ //
225
+ // Ex.: "Some text @a" <-- "@a" will be detected as the trigger word and
226
+ // allow the effect to run. It will run until there's a mismatch.
227
+ const hasOneTriggerWord = wordsFromTrigger.length === 1;
228
+ // This is used to allow the effect to run when backspacing and if
229
+ // "touching" a word that "belongs" to a trigger. We consider a "trigger
230
+ // word" any word up to the limit of 3 from the trigger character.
231
+ // Anything beyond that is ignored if there's a mismatch. This allows
232
+ // us to "escape" a mismatch when backspacing, but still imposing some
233
+ // sane limits.
234
+ //
235
+ // Ex: "Some text @marcelo sekkkk" <--- "kkkk" caused a mismatch, but
236
+ // if the user presses backspace here, it will show the completion popup again.
237
+ const matchingWhileBackspacing = backspacing.current && wordsFromTrigger.length <= 3;
238
+ if (mismatch && !(matchingWhileBackspacing || hasOneTriggerWord)) {
239
+ if (autocompleter) reset();
240
+ return;
241
+ }
242
+ const textAfterSelection = getTextContent(slice(record, undefined, getTextContent(record).length));
243
+ if (allowContext && !allowContext(textContent.slice(0, triggerIndex), textAfterSelection)) {
244
+ if (autocompleter) reset();
245
+ return;
246
+ }
247
+ if (/^\s/.test(textWithoutTrigger) || /\s\s+$/.test(textWithoutTrigger)) {
248
+ if (autocompleter) reset();
249
+ return;
250
+ }
251
+ if (!/[\u0000-\uFFFF]*$/.test(textWithoutTrigger)) {
252
+ if (autocompleter) reset();
253
+ return;
254
+ }
203
255
  const safeTrigger = escapeRegExp(completer.triggerPrefix);
204
256
  const text = removeAccents(textContent);
205
257
  const match = text.slice(text.lastIndexOf(completer.triggerPrefix)).match(new RegExp(`${safeTrigger}([\u0000-\uFFFF]*)$`));
@@ -1 +1 @@
1
- {"version":3,"names":["removeAccents","renderToString","useEffect","useState","useRef","useMemo","useInstanceId","useMergeRefs","useRefEffect","create","slice","insert","isCollapsed","getTextContent","getAutoCompleterUI","escapeRegExp","EMPTY_FILTERED_OPTIONS","useAutocomplete","record","onChange","onReplace","completers","contentRef","instanceId","selectedIndex","setSelectedIndex","filteredOptions","setFilteredOptions","filterValue","setFilterValue","autocompleter","setAutocompleter","AutocompleterUI","setAutocompleterUI","backspacing","insertCompletion","replacement","end","start","triggerPrefix","length","toInsert","html","select","option","getOptionCompletion","isDisabled","completion","value","isCompletionObject","obj","action","undefined","completionObject","reset","onChangeOptions","options","handleKeyDown","event","current","key","defaultPrevented","isComposing","keyCode","preventDefault","textContent","completer","find","allowContext","index","lastIndexOf","textWithoutTrigger","tooDistantFromTrigger","mismatch","wordsFromTrigger","split","hasOneTriggerWord","matchingWhileBackspacing","textAfterSelection","test","safeTrigger","text","match","RegExp","query","selectedKey","className","isExpanded","listBoxId","activeId","hasSelection","onKeyDown","popover","createElement","onSelect","useLastDifferentValue","history","Set","add","size","delete","Array","from","useAutocompleteProps","ref","onKeyDownRef","previousRecord","mergedRefs","element","_onKeyDown","addEventListener","removeEventListener","didUserInput","children","Autocomplete","isSelected","props","Fragment"],"sources":["@wordpress/components/src/autocomplete/index.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport removeAccents from 'remove-accents';\n\n/**\n * WordPress dependencies\n */\nimport {\n\trenderToString,\n\tuseEffect,\n\tuseState,\n\tuseRef,\n\tuseMemo,\n} from '@wordpress/element';\nimport { __, _n } from '@wordpress/i18n';\nimport { useInstanceId, useMergeRefs, useRefEffect } from '@wordpress/compose';\nimport {\n\tcreate,\n\tslice,\n\tinsert,\n\tisCollapsed,\n\tgetTextContent,\n} from '@wordpress/rich-text';\n\n/**\n * Internal dependencies\n */\nimport { getAutoCompleterUI } from './autocompleter-ui';\nimport { escapeRegExp } from '../utils/strings';\nimport type {\n\tAutocompleteProps,\n\tAutocompleterUIProps,\n\tInsertOption,\n\tKeyedOption,\n\tOptionCompletion,\n\tReplaceOption,\n\tUseAutocompleteProps,\n\tWPCompleter,\n} from './types';\n\nconst EMPTY_FILTERED_OPTIONS: KeyedOption[] = [];\n\nexport function useAutocomplete( {\n\trecord,\n\tonChange,\n\tonReplace,\n\tcompleters,\n\tcontentRef,\n}: UseAutocompleteProps ) {\n\tconst instanceId = useInstanceId( useAutocomplete );\n\tconst [ selectedIndex, setSelectedIndex ] = useState( 0 );\n\n\tconst [ filteredOptions, setFilteredOptions ] = useState<\n\t\tArray< KeyedOption >\n\t>( EMPTY_FILTERED_OPTIONS );\n\tconst [ filterValue, setFilterValue ] =\n\t\tuseState< AutocompleterUIProps[ 'filterValue' ] >( '' );\n\tconst [ autocompleter, setAutocompleter ] = useState< WPCompleter | null >(\n\t\tnull\n\t);\n\tconst [ AutocompleterUI, setAutocompleterUI ] = useState<\n\t\t( ( props: AutocompleterUIProps ) => JSX.Element | null ) | null\n\t>( null );\n\n\tconst backspacing = useRef( false );\n\n\tfunction insertCompletion( replacement: React.ReactNode ) {\n\t\tif ( autocompleter === null ) {\n\t\t\treturn;\n\t\t}\n\t\tconst end = record.start;\n\t\tconst start =\n\t\t\tend - autocompleter.triggerPrefix.length - filterValue.length;\n\t\tconst toInsert = create( { html: renderToString( replacement ) } );\n\n\t\tonChange( insert( record, toInsert, start, end ) );\n\t}\n\n\tfunction select( option: KeyedOption ) {\n\t\tconst { getOptionCompletion } = autocompleter || {};\n\n\t\tif ( option.isDisabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( getOptionCompletion ) {\n\t\t\tconst completion = getOptionCompletion( option.value, filterValue );\n\n\t\t\tconst isCompletionObject = (\n\t\t\t\tobj: OptionCompletion\n\t\t\t): obj is InsertOption | ReplaceOption => {\n\t\t\t\treturn (\n\t\t\t\t\tobj !== null &&\n\t\t\t\t\ttypeof obj === 'object' &&\n\t\t\t\t\t'action' in obj &&\n\t\t\t\t\tobj.action !== undefined &&\n\t\t\t\t\t'value' in obj &&\n\t\t\t\t\tobj.value !== undefined\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst completionObject = isCompletionObject( completion )\n\t\t\t\t? completion\n\t\t\t\t: ( {\n\t\t\t\t\t\taction: 'insert-at-caret',\n\t\t\t\t\t\tvalue: completion,\n\t\t\t\t } as InsertOption );\n\n\t\t\tif ( 'replace' === completionObject.action ) {\n\t\t\t\tonReplace( [ completionObject.value ] );\n\t\t\t\t// When replacing, the component will unmount, so don't reset\n\t\t\t\t// state (below) on an unmounted component.\n\t\t\t\treturn;\n\t\t\t} else if ( 'insert-at-caret' === completionObject.action ) {\n\t\t\t\tinsertCompletion( completionObject.value );\n\t\t\t}\n\t\t}\n\n\t\t// Reset autocomplete state after insertion rather than before\n\t\t// so insertion events don't cause the completion menu to redisplay.\n\t\treset();\n\t}\n\n\tfunction reset() {\n\t\tsetSelectedIndex( 0 );\n\t\tsetFilteredOptions( EMPTY_FILTERED_OPTIONS );\n\t\tsetFilterValue( '' );\n\t\tsetAutocompleter( null );\n\t\tsetAutocompleterUI( null );\n\t}\n\n\t/**\n\t * Load options for an autocompleter.\n\t *\n\t * @param {Array} options\n\t */\n\tfunction onChangeOptions( options: Array< KeyedOption > ) {\n\t\tsetSelectedIndex(\n\t\t\toptions.length === filteredOptions.length ? selectedIndex : 0\n\t\t);\n\t\tsetFilteredOptions( options );\n\t}\n\n\tfunction handleKeyDown( event: KeyboardEvent ) {\n\t\tbackspacing.current = event.key === 'Backspace';\n\n\t\tif ( ! autocompleter ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( filteredOptions.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tevent.defaultPrevented ||\n\t\t\t// Ignore keydowns from IMEs\n\t\t\tevent.isComposing ||\n\t\t\t// Workaround for Mac Safari where the final Enter/Backspace of an IME composition\n\t\t\t// is `isComposing=false`, even though it's technically still part of the composition.\n\t\t\t// These can only be detected by keyCode.\n\t\t\tevent.keyCode === 229\n\t\t) {\n\t\t\treturn;\n\t\t}\n\t\tswitch ( event.key ) {\n\t\t\tcase 'ArrowUp':\n\t\t\t\tsetSelectedIndex(\n\t\t\t\t\t( selectedIndex === 0\n\t\t\t\t\t\t? filteredOptions.length\n\t\t\t\t\t\t: selectedIndex ) - 1\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowDown':\n\t\t\t\tsetSelectedIndex(\n\t\t\t\t\t( selectedIndex + 1 ) % filteredOptions.length\n\t\t\t\t);\n\t\t\t\tbreak;\n\n\t\t\tcase 'Escape':\n\t\t\t\tsetAutocompleter( null );\n\t\t\t\tsetAutocompleterUI( null );\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\t\tselect( filteredOptions[ selectedIndex ] );\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowRight':\n\t\t\t\treset();\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\t// Any handled key should prevent original behavior. This relies on\n\t\t// the early return in the default case.\n\t\tevent.preventDefault();\n\t}\n\n\t// textContent is a primitive (string), memoizing is not strictly necessary\n\t// but this is a preemptive performance improvement, since the autocompleter\n\t// is a potential bottleneck for the editor type metric.\n\tconst textContent = useMemo( () => {\n\t\tif ( isCollapsed( record ) ) {\n\t\t\treturn getTextContent( slice( record, 0 ) );\n\t\t}\n\t\treturn '';\n\t}, [ record ] );\n\n\tuseEffect( () => {\n\t\tif ( ! textContent ) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tconst completer = completers?.find(\n\t\t\t( { triggerPrefix, allowContext } ) => {\n\t\t\t\tconst index = textContent.lastIndexOf( triggerPrefix );\n\n\t\t\t\tif ( index === -1 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst textWithoutTrigger = textContent.slice(\n\t\t\t\t\tindex + triggerPrefix.length\n\t\t\t\t);\n\n\t\t\t\tconst tooDistantFromTrigger = textWithoutTrigger.length > 50; // 50 chars seems to be a good limit.\n\t\t\t\t// This is a final barrier to prevent the effect from completing with\n\t\t\t\t// an extremely long string, which causes the editor to slow-down\n\t\t\t\t// significantly. This could happen, for example, if `matchingWhileBackspacing`\n\t\t\t\t// is true and one of the \"words\" end up being too long. If that's the case,\n\t\t\t\t// it will be caught by this guard.\n\t\t\t\tif ( tooDistantFromTrigger ) return false;\n\n\t\t\t\tconst mismatch = filteredOptions.length === 0;\n\t\t\t\tconst wordsFromTrigger = textWithoutTrigger.split( /\\s/ );\n\t\t\t\t// We need to allow the effect to run when not backspacing and if there\n\t\t\t\t// was a mismatch. i.e when typing a trigger + the match string or when\n\t\t\t\t// clicking in an existing trigger word on the page. We do that if we\n\t\t\t\t// detect that we have one word from trigger in the current textual context.\n\t\t\t\t//\n\t\t\t\t// Ex.: \"Some text @a\" <-- \"@a\" will be detected as the trigger word and\n\t\t\t\t// allow the effect to run. It will run until there's a mismatch.\n\t\t\t\tconst hasOneTriggerWord = wordsFromTrigger.length === 1;\n\t\t\t\t// This is used to allow the effect to run when backspacing and if\n\t\t\t\t// \"touching\" a word that \"belongs\" to a trigger. We consider a \"trigger\n\t\t\t\t// word\" any word up to the limit of 3 from the trigger character.\n\t\t\t\t// Anything beyond that is ignored if there's a mismatch. This allows\n\t\t\t\t// us to \"escape\" a mismatch when backspacing, but still imposing some\n\t\t\t\t// sane limits.\n\t\t\t\t//\n\t\t\t\t// Ex: \"Some text @marcelo sekkkk\" <--- \"kkkk\" caused a mismatch, but\n\t\t\t\t// if the user presses backspace here, it will show the completion popup again.\n\t\t\t\tconst matchingWhileBackspacing =\n\t\t\t\t\tbackspacing.current &&\n\t\t\t\t\ttextWithoutTrigger.split( /\\s/ ).length <= 3;\n\n\t\t\t\tif (\n\t\t\t\t\tmismatch &&\n\t\t\t\t\t! ( matchingWhileBackspacing || hasOneTriggerWord )\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tconst textAfterSelection = getTextContent(\n\t\t\t\t\tslice( record, undefined, getTextContent( record ).length )\n\t\t\t\t);\n\n\t\t\t\tif (\n\t\t\t\t\tallowContext &&\n\t\t\t\t\t! allowContext(\n\t\t\t\t\t\ttextContent.slice( 0, index ),\n\t\t\t\t\t\ttextAfterSelection\n\t\t\t\t\t)\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t/^\\s/.test( textWithoutTrigger ) ||\n\t\t\t\t\t/\\s\\s+$/.test( textWithoutTrigger )\n\t\t\t\t) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn /[\\u0000-\\uFFFF]*$/.test( textWithoutTrigger );\n\t\t\t}\n\t\t);\n\n\t\tif ( ! completer ) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tconst safeTrigger = escapeRegExp( completer.triggerPrefix );\n\t\tconst text = removeAccents( textContent );\n\t\tconst match = text\n\t\t\t.slice( text.lastIndexOf( completer.triggerPrefix ) )\n\t\t\t.match( new RegExp( `${ safeTrigger }([\\u0000-\\uFFFF]*)$` ) );\n\t\tconst query = match && match[ 1 ];\n\n\t\tsetAutocompleter( completer );\n\t\tsetAutocompleterUI( () =>\n\t\t\tcompleter !== autocompleter\n\t\t\t\t? getAutoCompleterUI( completer )\n\t\t\t\t: AutocompleterUI\n\t\t);\n\t\tsetFilterValue( query === null ? '' : query );\n\t\t// Temporarily disabling exhaustive-deps to avoid introducing unexpected side effecst.\n\t\t// See https://github.com/WordPress/gutenberg/pull/41820\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [ textContent ] );\n\n\tconst { key: selectedKey = '' } = filteredOptions[ selectedIndex ] || {};\n\tconst { className } = autocompleter || {};\n\tconst isExpanded = !! autocompleter && filteredOptions.length > 0;\n\tconst listBoxId = isExpanded\n\t\t? `components-autocomplete-listbox-${ instanceId }`\n\t\t: undefined;\n\tconst activeId = isExpanded\n\t\t? `components-autocomplete-item-${ instanceId }-${ selectedKey }`\n\t\t: null;\n\tconst hasSelection = record.start !== undefined;\n\n\treturn {\n\t\tlistBoxId,\n\t\tactiveId,\n\t\tonKeyDown: handleKeyDown,\n\t\tpopover: hasSelection && AutocompleterUI && (\n\t\t\t<AutocompleterUI\n\t\t\t\tclassName={ className }\n\t\t\t\tfilterValue={ filterValue }\n\t\t\t\tinstanceId={ instanceId }\n\t\t\t\tlistBoxId={ listBoxId }\n\t\t\t\tselectedIndex={ selectedIndex }\n\t\t\t\tonChangeOptions={ onChangeOptions }\n\t\t\t\tonSelect={ select }\n\t\t\t\tvalue={ record }\n\t\t\t\tcontentRef={ contentRef }\n\t\t\t\treset={ reset }\n\t\t\t/>\n\t\t),\n\t};\n}\n\nfunction useLastDifferentValue( value: UseAutocompleteProps[ 'record' ] ) {\n\tconst history = useRef< Set< typeof value > >( new Set() );\n\n\thistory.current.add( value );\n\n\t// Keep the history size to 2.\n\tif ( history.current.size > 2 ) {\n\t\thistory.current.delete( Array.from( history.current )[ 0 ] );\n\t}\n\n\treturn Array.from( history.current )[ 0 ];\n}\n\nexport function useAutocompleteProps( options: UseAutocompleteProps ) {\n\tconst ref = useRef< HTMLElement >( null );\n\tconst onKeyDownRef = useRef< ( event: KeyboardEvent ) => void >();\n\tconst { record } = options;\n\tconst previousRecord = useLastDifferentValue( record );\n\tconst { popover, listBoxId, activeId, onKeyDown } = useAutocomplete( {\n\t\t...options,\n\t\tcontentRef: ref,\n\t} );\n\tonKeyDownRef.current = onKeyDown;\n\n\tconst mergedRefs = useMergeRefs( [\n\t\tref,\n\t\tuseRefEffect( ( element: HTMLElement ) => {\n\t\t\tfunction _onKeyDown( event: KeyboardEvent ) {\n\t\t\t\tonKeyDownRef.current?.( event );\n\t\t\t}\n\t\t\telement.addEventListener( 'keydown', _onKeyDown );\n\t\t\treturn () => {\n\t\t\t\telement.removeEventListener( 'keydown', _onKeyDown );\n\t\t\t};\n\t\t}, [] ),\n\t] );\n\n\t// We only want to show the popover if the user has typed something.\n\tconst didUserInput = record.text !== previousRecord?.text;\n\n\tif ( ! didUserInput ) {\n\t\treturn { ref: mergedRefs };\n\t}\n\n\treturn {\n\t\tref: mergedRefs,\n\t\tchildren: popover,\n\t\t'aria-autocomplete': listBoxId ? 'list' : undefined,\n\t\t'aria-owns': listBoxId,\n\t\t'aria-activedescendant': activeId,\n\t};\n}\n\nexport default function Autocomplete( {\n\tchildren,\n\tisSelected,\n\t...options\n}: AutocompleteProps ) {\n\tconst { popover, ...props } = useAutocomplete( options );\n\treturn (\n\t\t<>\n\t\t\t{ children( props ) }\n\t\t\t{ isSelected && popover }\n\t\t</>\n\t);\n}\n"],"mappings":"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"}
1
+ {"version":3,"names":["removeAccents","renderToString","useEffect","useState","useRef","useMemo","useInstanceId","useMergeRefs","useRefEffect","create","slice","insert","isCollapsed","getTextContent","speak","isAppleOS","getAutoCompleterUI","escapeRegExp","getNodeText","node","toString","Array","map","join","props","children","EMPTY_FILTERED_OPTIONS","useAutocomplete","record","onChange","onReplace","completers","contentRef","instanceId","selectedIndex","setSelectedIndex","filteredOptions","setFilteredOptions","filterValue","setFilterValue","autocompleter","setAutocompleter","AutocompleterUI","setAutocompleterUI","backspacing","insertCompletion","replacement","end","start","triggerPrefix","length","toInsert","html","select","option","getOptionCompletion","isDisabled","completion","value","isCompletionObject","obj","action","undefined","completionObject","reset","onChangeOptions","options","handleKeyDown","event","current","key","defaultPrevented","isComposing","keyCode","newIndex","label","preventDefault","textContent","completer","reduce","lastTrigger","currentCompleter","triggerIndex","lastIndexOf","lastTriggerIndex","allowContext","textWithoutTrigger","tooDistantFromTrigger","mismatch","wordsFromTrigger","split","hasOneTriggerWord","matchingWhileBackspacing","textAfterSelection","test","safeTrigger","text","match","RegExp","query","selectedKey","className","isExpanded","listBoxId","activeId","hasSelection","onKeyDown","popover","createElement","onSelect","useLastDifferentValue","history","Set","add","size","delete","from","useAutocompleteProps","ref","onKeyDownRef","previousRecord","mergedRefs","element","_onKeyDown","addEventListener","removeEventListener","didUserInput","Autocomplete","isSelected","Fragment"],"sources":["@wordpress/components/src/autocomplete/index.tsx"],"sourcesContent":["/**\n * External dependencies\n */\nimport removeAccents from 'remove-accents';\n\n/**\n * WordPress dependencies\n */\nimport {\n\trenderToString,\n\tuseEffect,\n\tuseState,\n\tuseRef,\n\tuseMemo,\n} from '@wordpress/element';\nimport { __, _n } from '@wordpress/i18n';\nimport { useInstanceId, useMergeRefs, useRefEffect } from '@wordpress/compose';\nimport {\n\tcreate,\n\tslice,\n\tinsert,\n\tisCollapsed,\n\tgetTextContent,\n} from '@wordpress/rich-text';\nimport { speak } from '@wordpress/a11y';\nimport { isAppleOS } from '@wordpress/keycodes';\n\n/**\n * Internal dependencies\n */\nimport { getAutoCompleterUI } from './autocompleter-ui';\nimport { escapeRegExp } from '../utils/strings';\nimport type {\n\tAutocompleteProps,\n\tAutocompleterUIProps,\n\tInsertOption,\n\tKeyedOption,\n\tOptionCompletion,\n\tReplaceOption,\n\tUseAutocompleteProps,\n\tWPCompleter,\n} from './types';\n\nconst getNodeText = ( node: React.ReactNode ): string => {\n\tif ( node === null ) {\n\t\treturn '';\n\t}\n\n\tswitch ( typeof node ) {\n\t\tcase 'string':\n\t\tcase 'number':\n\t\t\treturn node.toString();\n\t\t\tbreak;\n\t\tcase 'boolean':\n\t\t\treturn '';\n\t\t\tbreak;\n\t\tcase 'object': {\n\t\t\tif ( node instanceof Array ) {\n\t\t\t\treturn node.map( getNodeText ).join( '' );\n\t\t\t}\n\t\t\tif ( 'props' in node ) {\n\t\t\t\treturn getNodeText( node.props.children );\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\treturn '';\n\t}\n\n\treturn '';\n};\n\nconst EMPTY_FILTERED_OPTIONS: KeyedOption[] = [];\n\nexport function useAutocomplete( {\n\trecord,\n\tonChange,\n\tonReplace,\n\tcompleters,\n\tcontentRef,\n}: UseAutocompleteProps ) {\n\tconst instanceId = useInstanceId( useAutocomplete );\n\tconst [ selectedIndex, setSelectedIndex ] = useState( 0 );\n\n\tconst [ filteredOptions, setFilteredOptions ] = useState<\n\t\tArray< KeyedOption >\n\t>( EMPTY_FILTERED_OPTIONS );\n\tconst [ filterValue, setFilterValue ] =\n\t\tuseState< AutocompleterUIProps[ 'filterValue' ] >( '' );\n\tconst [ autocompleter, setAutocompleter ] = useState< WPCompleter | null >(\n\t\tnull\n\t);\n\tconst [ AutocompleterUI, setAutocompleterUI ] = useState<\n\t\t( ( props: AutocompleterUIProps ) => JSX.Element | null ) | null\n\t>( null );\n\n\tconst backspacing = useRef( false );\n\n\tfunction insertCompletion( replacement: React.ReactNode ) {\n\t\tif ( autocompleter === null ) {\n\t\t\treturn;\n\t\t}\n\t\tconst end = record.start;\n\t\tconst start =\n\t\t\tend - autocompleter.triggerPrefix.length - filterValue.length;\n\t\tconst toInsert = create( { html: renderToString( replacement ) } );\n\n\t\tonChange( insert( record, toInsert, start, end ) );\n\t}\n\n\tfunction select( option: KeyedOption ) {\n\t\tconst { getOptionCompletion } = autocompleter || {};\n\n\t\tif ( option.isDisabled ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( getOptionCompletion ) {\n\t\t\tconst completion = getOptionCompletion( option.value, filterValue );\n\n\t\t\tconst isCompletionObject = (\n\t\t\t\tobj: OptionCompletion\n\t\t\t): obj is InsertOption | ReplaceOption => {\n\t\t\t\treturn (\n\t\t\t\t\tobj !== null &&\n\t\t\t\t\ttypeof obj === 'object' &&\n\t\t\t\t\t'action' in obj &&\n\t\t\t\t\tobj.action !== undefined &&\n\t\t\t\t\t'value' in obj &&\n\t\t\t\t\tobj.value !== undefined\n\t\t\t\t);\n\t\t\t};\n\n\t\t\tconst completionObject = isCompletionObject( completion )\n\t\t\t\t? completion\n\t\t\t\t: ( {\n\t\t\t\t\t\taction: 'insert-at-caret',\n\t\t\t\t\t\tvalue: completion,\n\t\t\t\t } as InsertOption );\n\n\t\t\tif ( 'replace' === completionObject.action ) {\n\t\t\t\tonReplace( [ completionObject.value ] );\n\t\t\t\t// When replacing, the component will unmount, so don't reset\n\t\t\t\t// state (below) on an unmounted component.\n\t\t\t\treturn;\n\t\t\t} else if ( 'insert-at-caret' === completionObject.action ) {\n\t\t\t\tinsertCompletion( completionObject.value );\n\t\t\t}\n\t\t}\n\n\t\t// Reset autocomplete state after insertion rather than before\n\t\t// so insertion events don't cause the completion menu to redisplay.\n\t\treset();\n\t}\n\n\tfunction reset() {\n\t\tsetSelectedIndex( 0 );\n\t\tsetFilteredOptions( EMPTY_FILTERED_OPTIONS );\n\t\tsetFilterValue( '' );\n\t\tsetAutocompleter( null );\n\t\tsetAutocompleterUI( null );\n\t}\n\n\t/**\n\t * Load options for an autocompleter.\n\t *\n\t * @param {Array} options\n\t */\n\tfunction onChangeOptions( options: Array< KeyedOption > ) {\n\t\tsetSelectedIndex(\n\t\t\toptions.length === filteredOptions.length ? selectedIndex : 0\n\t\t);\n\t\tsetFilteredOptions( options );\n\t}\n\n\tfunction handleKeyDown( event: KeyboardEvent ) {\n\t\tbackspacing.current = event.key === 'Backspace';\n\n\t\tif ( ! autocompleter ) {\n\t\t\treturn;\n\t\t}\n\t\tif ( filteredOptions.length === 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\tevent.defaultPrevented ||\n\t\t\t// Ignore keydowns from IMEs\n\t\t\tevent.isComposing ||\n\t\t\t// Workaround for Mac Safari where the final Enter/Backspace of an IME composition\n\t\t\t// is `isComposing=false`, even though it's technically still part of the composition.\n\t\t\t// These can only be detected by keyCode.\n\t\t\tevent.keyCode === 229\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tswitch ( event.key ) {\n\t\t\tcase 'ArrowUp': {\n\t\t\t\tconst newIndex =\n\t\t\t\t\t( selectedIndex === 0\n\t\t\t\t\t\t? filteredOptions.length\n\t\t\t\t\t\t: selectedIndex ) - 1;\n\t\t\t\tsetSelectedIndex( newIndex );\n\t\t\t\t// See the related PR as to why this is necessary: https://github.com/WordPress/gutenberg/pull/54902.\n\t\t\t\tif ( isAppleOS() ) {\n\t\t\t\t\tspeak(\n\t\t\t\t\t\tgetNodeText( filteredOptions[ newIndex ].label ),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'ArrowDown': {\n\t\t\t\tconst newIndex = ( selectedIndex + 1 ) % filteredOptions.length;\n\t\t\t\tsetSelectedIndex( newIndex );\n\t\t\t\tif ( isAppleOS() ) {\n\t\t\t\t\tspeak(\n\t\t\t\t\t\tgetNodeText( filteredOptions[ newIndex ].label ),\n\t\t\t\t\t\t'assertive'\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'Escape':\n\t\t\t\tsetAutocompleter( null );\n\t\t\t\tsetAutocompleterUI( null );\n\t\t\t\tevent.preventDefault();\n\t\t\t\tbreak;\n\n\t\t\tcase 'Enter':\n\t\t\t\tselect( filteredOptions[ selectedIndex ] );\n\t\t\t\tbreak;\n\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowRight':\n\t\t\t\treset();\n\t\t\t\treturn;\n\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\n\t\t// Any handled key should prevent original behavior. This relies on\n\t\t// the early return in the default case.\n\t\tevent.preventDefault();\n\t}\n\n\t// textContent is a primitive (string), memoizing is not strictly necessary\n\t// but this is a preemptive performance improvement, since the autocompleter\n\t// is a potential bottleneck for the editor type metric.\n\tconst textContent = useMemo( () => {\n\t\tif ( isCollapsed( record ) ) {\n\t\t\treturn getTextContent( slice( record, 0 ) );\n\t\t}\n\t\treturn '';\n\t}, [ record ] );\n\n\tuseEffect( () => {\n\t\tif ( ! textContent ) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\t// Find the completer with the highest triggerPrefix index in the\n\t\t// textContent.\n\t\tconst completer = completers.reduce< WPCompleter | null >(\n\t\t\t( lastTrigger, currentCompleter ) => {\n\t\t\t\tconst triggerIndex = textContent.lastIndexOf(\n\t\t\t\t\tcurrentCompleter.triggerPrefix\n\t\t\t\t);\n\t\t\t\tconst lastTriggerIndex =\n\t\t\t\t\tlastTrigger !== null\n\t\t\t\t\t\t? textContent.lastIndexOf( lastTrigger.triggerPrefix )\n\t\t\t\t\t\t: -1;\n\n\t\t\t\treturn triggerIndex > lastTriggerIndex\n\t\t\t\t\t? currentCompleter\n\t\t\t\t\t: lastTrigger;\n\t\t\t},\n\t\t\tnull\n\t\t);\n\n\t\tif ( ! completer ) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tconst { allowContext, triggerPrefix } = completer;\n\t\tconst triggerIndex = textContent.lastIndexOf( triggerPrefix );\n\t\tconst textWithoutTrigger = textContent.slice(\n\t\t\ttriggerIndex + triggerPrefix.length\n\t\t);\n\n\t\tconst tooDistantFromTrigger = textWithoutTrigger.length > 50; // 50 chars seems to be a good limit.\n\t\t// This is a final barrier to prevent the effect from completing with\n\t\t// an extremely long string, which causes the editor to slow-down\n\t\t// significantly. This could happen, for example, if `matchingWhileBackspacing`\n\t\t// is true and one of the \"words\" end up being too long. If that's the case,\n\t\t// it will be caught by this guard.\n\t\tif ( tooDistantFromTrigger ) return;\n\n\t\tconst mismatch = filteredOptions.length === 0;\n\t\tconst wordsFromTrigger = textWithoutTrigger.split( /\\s/ );\n\t\t// We need to allow the effect to run when not backspacing and if there\n\t\t// was a mismatch. i.e when typing a trigger + the match string or when\n\t\t// clicking in an existing trigger word on the page. We do that if we\n\t\t// detect that we have one word from trigger in the current textual context.\n\t\t//\n\t\t// Ex.: \"Some text @a\" <-- \"@a\" will be detected as the trigger word and\n\t\t// allow the effect to run. It will run until there's a mismatch.\n\t\tconst hasOneTriggerWord = wordsFromTrigger.length === 1;\n\t\t// This is used to allow the effect to run when backspacing and if\n\t\t// \"touching\" a word that \"belongs\" to a trigger. We consider a \"trigger\n\t\t// word\" any word up to the limit of 3 from the trigger character.\n\t\t// Anything beyond that is ignored if there's a mismatch. This allows\n\t\t// us to \"escape\" a mismatch when backspacing, but still imposing some\n\t\t// sane limits.\n\t\t//\n\t\t// Ex: \"Some text @marcelo sekkkk\" <--- \"kkkk\" caused a mismatch, but\n\t\t// if the user presses backspace here, it will show the completion popup again.\n\t\tconst matchingWhileBackspacing =\n\t\t\tbackspacing.current && wordsFromTrigger.length <= 3;\n\n\t\tif ( mismatch && ! ( matchingWhileBackspacing || hasOneTriggerWord ) ) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tconst textAfterSelection = getTextContent(\n\t\t\tslice( record, undefined, getTextContent( record ).length )\n\t\t);\n\n\t\tif (\n\t\t\tallowContext &&\n\t\t\t! allowContext(\n\t\t\t\ttextContent.slice( 0, triggerIndex ),\n\t\t\t\ttextAfterSelection\n\t\t\t)\n\t\t) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tif (\n\t\t\t/^\\s/.test( textWithoutTrigger ) ||\n\t\t\t/\\s\\s+$/.test( textWithoutTrigger )\n\t\t) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tif ( ! /[\\u0000-\\uFFFF]*$/.test( textWithoutTrigger ) ) {\n\t\t\tif ( autocompleter ) reset();\n\t\t\treturn;\n\t\t}\n\n\t\tconst safeTrigger = escapeRegExp( completer.triggerPrefix );\n\t\tconst text = removeAccents( textContent );\n\t\tconst match = text\n\t\t\t.slice( text.lastIndexOf( completer.triggerPrefix ) )\n\t\t\t.match( new RegExp( `${ safeTrigger }([\\u0000-\\uFFFF]*)$` ) );\n\t\tconst query = match && match[ 1 ];\n\n\t\tsetAutocompleter( completer );\n\t\tsetAutocompleterUI( () =>\n\t\t\tcompleter !== autocompleter\n\t\t\t\t? getAutoCompleterUI( completer )\n\t\t\t\t: AutocompleterUI\n\t\t);\n\t\tsetFilterValue( query === null ? '' : query );\n\t\t// Temporarily disabling exhaustive-deps to avoid introducing unexpected side effecst.\n\t\t// See https://github.com/WordPress/gutenberg/pull/41820\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [ textContent ] );\n\n\tconst { key: selectedKey = '' } = filteredOptions[ selectedIndex ] || {};\n\tconst { className } = autocompleter || {};\n\tconst isExpanded = !! autocompleter && filteredOptions.length > 0;\n\tconst listBoxId = isExpanded\n\t\t? `components-autocomplete-listbox-${ instanceId }`\n\t\t: undefined;\n\tconst activeId = isExpanded\n\t\t? `components-autocomplete-item-${ instanceId }-${ selectedKey }`\n\t\t: null;\n\tconst hasSelection = record.start !== undefined;\n\n\treturn {\n\t\tlistBoxId,\n\t\tactiveId,\n\t\tonKeyDown: handleKeyDown,\n\t\tpopover: hasSelection && AutocompleterUI && (\n\t\t\t<AutocompleterUI\n\t\t\t\tclassName={ className }\n\t\t\t\tfilterValue={ filterValue }\n\t\t\t\tinstanceId={ instanceId }\n\t\t\t\tlistBoxId={ listBoxId }\n\t\t\t\tselectedIndex={ selectedIndex }\n\t\t\t\tonChangeOptions={ onChangeOptions }\n\t\t\t\tonSelect={ select }\n\t\t\t\tvalue={ record }\n\t\t\t\tcontentRef={ contentRef }\n\t\t\t\treset={ reset }\n\t\t\t/>\n\t\t),\n\t};\n}\n\nfunction useLastDifferentValue( value: UseAutocompleteProps[ 'record' ] ) {\n\tconst history = useRef< Set< typeof value > >( new Set() );\n\n\thistory.current.add( value );\n\n\t// Keep the history size to 2.\n\tif ( history.current.size > 2 ) {\n\t\thistory.current.delete( Array.from( history.current )[ 0 ] );\n\t}\n\n\treturn Array.from( history.current )[ 0 ];\n}\n\nexport function useAutocompleteProps( options: UseAutocompleteProps ) {\n\tconst ref = useRef< HTMLElement >( null );\n\tconst onKeyDownRef = useRef< ( event: KeyboardEvent ) => void >();\n\tconst { record } = options;\n\tconst previousRecord = useLastDifferentValue( record );\n\tconst { popover, listBoxId, activeId, onKeyDown } = useAutocomplete( {\n\t\t...options,\n\t\tcontentRef: ref,\n\t} );\n\tonKeyDownRef.current = onKeyDown;\n\n\tconst mergedRefs = useMergeRefs( [\n\t\tref,\n\t\tuseRefEffect( ( element: HTMLElement ) => {\n\t\t\tfunction _onKeyDown( event: KeyboardEvent ) {\n\t\t\t\tonKeyDownRef.current?.( event );\n\t\t\t}\n\t\t\telement.addEventListener( 'keydown', _onKeyDown );\n\t\t\treturn () => {\n\t\t\t\telement.removeEventListener( 'keydown', _onKeyDown );\n\t\t\t};\n\t\t}, [] ),\n\t] );\n\n\t// We only want to show the popover if the user has typed something.\n\tconst didUserInput = record.text !== previousRecord?.text;\n\n\tif ( ! didUserInput ) {\n\t\treturn { ref: mergedRefs };\n\t}\n\n\treturn {\n\t\tref: mergedRefs,\n\t\tchildren: popover,\n\t\t'aria-autocomplete': listBoxId ? 'list' : undefined,\n\t\t'aria-owns': listBoxId,\n\t\t'aria-activedescendant': activeId,\n\t};\n}\n\nexport default function Autocomplete( {\n\tchildren,\n\tisSelected,\n\t...options\n}: AutocompleteProps ) {\n\tconst { popover, ...props } = useAutocomplete( options );\n\treturn (\n\t\t<>\n\t\t\t{ children( props ) }\n\t\t\t{ isSelected && popover }\n\t\t</>\n\t);\n}\n"],"mappings":"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"}