@wordpress/components 28.8.3 → 28.9.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 (329) hide show
  1. package/CHANGELOG.md +27 -3
  2. package/build/autocomplete/index.js +4 -1
  3. package/build/autocomplete/index.js.map +1 -1
  4. package/build/border-box-control/border-box-control/component.js +3 -14
  5. package/build/border-box-control/border-box-control/component.js.map +1 -1
  6. package/build/border-control/border-control/component.js +1 -2
  7. package/build/border-control/border-control/component.js.map +1 -1
  8. package/build/border-control/border-control-dropdown/component.js +2 -14
  9. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  10. package/build/border-control/styles.js +13 -13
  11. package/build/border-control/styles.js.map +1 -1
  12. package/build/border-control/types.js.map +1 -1
  13. package/build/box-control/index.js +4 -4
  14. package/build/box-control/index.js.map +1 -1
  15. package/build/box-control/types.js.map +1 -1
  16. package/build/composite/group-label.js +7 -1
  17. package/build/composite/group-label.js.map +1 -1
  18. package/build/composite/group.js +7 -1
  19. package/build/composite/group.js.map +1 -1
  20. package/build/composite/hover.js +8 -2
  21. package/build/composite/hover.js.map +1 -1
  22. package/build/composite/index.js +5 -1
  23. package/build/composite/index.js.map +1 -1
  24. package/build/composite/item.js +16 -1
  25. package/build/composite/item.js.map +1 -1
  26. package/build/composite/row.js +7 -1
  27. package/build/composite/row.js.map +1 -1
  28. package/build/composite/typeahead.js +8 -2
  29. package/build/composite/typeahead.js.map +1 -1
  30. package/build/date-time/date/index.js +4 -2
  31. package/build/date-time/date/index.js.map +1 -1
  32. package/build/index.js +36 -5
  33. package/build/index.js.map +1 -1
  34. package/build/navigator/index.js +128 -32
  35. package/build/navigator/index.js.map +1 -1
  36. package/build/navigator/legacy.js +179 -0
  37. package/build/navigator/legacy.js.map +1 -0
  38. package/build/navigator/{navigator-provider → navigator}/component.js +5 -40
  39. package/build/navigator/navigator/component.js.map +1 -0
  40. package/build/navigator/navigator-back-button/component.js +2 -38
  41. package/build/navigator/navigator-back-button/component.js.map +1 -1
  42. package/build/navigator/navigator-back-button/hook.js +1 -1
  43. package/build/navigator/navigator-back-button/hook.js.map +1 -1
  44. package/build/navigator/navigator-button/component.js +2 -37
  45. package/build/navigator/navigator-button/component.js.map +1 -1
  46. package/build/navigator/navigator-button/hook.js +1 -1
  47. package/build/navigator/navigator-button/hook.js.map +1 -1
  48. package/build/navigator/navigator-screen/component.js +40 -62
  49. package/build/navigator/navigator-screen/component.js.map +1 -1
  50. package/build/navigator/navigator-screen/use-screen-animate-presence.js +114 -0
  51. package/build/navigator/navigator-screen/use-screen-animate-presence.js.map +1 -0
  52. package/build/navigator/navigator-to-parent-button/component.js +3 -7
  53. package/build/navigator/navigator-to-parent-button/component.js.map +1 -1
  54. package/build/navigator/styles.js +78 -35
  55. package/build/navigator/styles.js.map +1 -1
  56. package/build/navigator/types.js.map +1 -1
  57. package/build/navigator/use-navigator.js +4 -1
  58. package/build/navigator/use-navigator.js.map +1 -1
  59. package/build/search-control/index.js +5 -2
  60. package/build/search-control/index.js.map +1 -1
  61. package/build/tabs/styles.js +3 -3
  62. package/build/tabs/styles.js.map +1 -1
  63. package/build/tabs/tablist.js +61 -28
  64. package/build/tabs/tablist.js.map +1 -1
  65. package/build/tabs/use-track-overflow.js +73 -0
  66. package/build/tabs/use-track-overflow.js.map +1 -0
  67. package/build/toggle-group-control/toggle-group-control/as-button-group.js +4 -2
  68. package/build/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -1
  69. package/build/toggle-group-control/toggle-group-control/as-radio-group.js +9 -3
  70. package/build/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -1
  71. package/build/toggle-group-control/toggle-group-control/component.js +73 -8
  72. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  73. package/build/toggle-group-control/toggle-group-control/styles.js +7 -7
  74. package/build/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  75. package/build/toggle-group-control/toggle-group-control-option-base/component.js +10 -19
  76. package/build/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  77. package/build/toggle-group-control/toggle-group-control-option-base/styles.js +8 -9
  78. package/build/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  79. package/build/toggle-group-control/types.js.map +1 -1
  80. package/build/utils/element-rect.js +22 -13
  81. package/build/utils/element-rect.js.map +1 -1
  82. package/build/utils/hooks/use-on-value-update.js +3 -7
  83. package/build/utils/hooks/use-on-value-update.js.map +1 -1
  84. package/build-module/autocomplete/index.js +4 -1
  85. package/build-module/autocomplete/index.js.map +1 -1
  86. package/build-module/border-box-control/border-box-control/component.js +3 -14
  87. package/build-module/border-box-control/border-box-control/component.js.map +1 -1
  88. package/build-module/border-control/border-control/component.js +1 -2
  89. package/build-module/border-control/border-control/component.js.map +1 -1
  90. package/build-module/border-control/border-control-dropdown/component.js +2 -14
  91. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  92. package/build-module/border-control/styles.js +13 -13
  93. package/build-module/border-control/styles.js.map +1 -1
  94. package/build-module/border-control/types.js.map +1 -1
  95. package/build-module/box-control/index.js +4 -4
  96. package/build-module/box-control/index.js.map +1 -1
  97. package/build-module/box-control/types.js.map +1 -1
  98. package/build-module/composite/group-label.js +7 -1
  99. package/build-module/composite/group-label.js.map +1 -1
  100. package/build-module/composite/group.js +7 -1
  101. package/build-module/composite/group.js.map +1 -1
  102. package/build-module/composite/hover.js +8 -2
  103. package/build-module/composite/hover.js.map +1 -1
  104. package/build-module/composite/index.js +5 -1
  105. package/build-module/composite/index.js.map +1 -1
  106. package/build-module/composite/item.js +16 -1
  107. package/build-module/composite/item.js.map +1 -1
  108. package/build-module/composite/row.js +7 -1
  109. package/build-module/composite/row.js.map +1 -1
  110. package/build-module/composite/typeahead.js +8 -2
  111. package/build-module/composite/typeahead.js.map +1 -1
  112. package/build-module/date-time/date/index.js +4 -2
  113. package/build-module/date-time/date/index.js.map +1 -1
  114. package/build-module/index.js +14 -4
  115. package/build-module/index.js.map +1 -1
  116. package/build-module/navigator/index.js +130 -5
  117. package/build-module/navigator/index.js.map +1 -1
  118. package/build-module/navigator/legacy.js +167 -0
  119. package/build-module/navigator/legacy.js.map +1 -0
  120. package/build-module/navigator/{navigator-provider → navigator}/component.js +4 -39
  121. package/build-module/navigator/navigator/component.js.map +1 -0
  122. package/build-module/navigator/navigator-back-button/component.js +1 -37
  123. package/build-module/navigator/navigator-back-button/component.js.map +1 -1
  124. package/build-module/navigator/navigator-back-button/hook.js +1 -1
  125. package/build-module/navigator/navigator-back-button/hook.js.map +1 -1
  126. package/build-module/navigator/navigator-button/component.js +1 -36
  127. package/build-module/navigator/navigator-button/component.js.map +1 -1
  128. package/build-module/navigator/navigator-button/hook.js +1 -1
  129. package/build-module/navigator/navigator-button/hook.js.map +1 -1
  130. package/build-module/navigator/navigator-screen/component.js +39 -61
  131. package/build-module/navigator/navigator-screen/component.js.map +1 -1
  132. package/build-module/navigator/navigator-screen/use-screen-animate-presence.js +106 -0
  133. package/build-module/navigator/navigator-screen/use-screen-animate-presence.js.map +1 -0
  134. package/build-module/navigator/navigator-to-parent-button/component.js +2 -6
  135. package/build-module/navigator/navigator-to-parent-button/component.js.map +1 -1
  136. package/build-module/navigator/styles.js +77 -33
  137. package/build-module/navigator/styles.js.map +1 -1
  138. package/build-module/navigator/types.js.map +1 -1
  139. package/build-module/navigator/use-navigator.js +4 -1
  140. package/build-module/navigator/use-navigator.js.map +1 -1
  141. package/build-module/search-control/index.js +5 -2
  142. package/build-module/search-control/index.js.map +1 -1
  143. package/build-module/tabs/styles.js +3 -3
  144. package/build-module/tabs/styles.js.map +1 -1
  145. package/build-module/tabs/tablist.js +62 -29
  146. package/build-module/tabs/tablist.js.map +1 -1
  147. package/build-module/tabs/use-track-overflow.js +67 -0
  148. package/build-module/tabs/use-track-overflow.js.map +1 -0
  149. package/build-module/toggle-group-control/toggle-group-control/as-button-group.js +4 -2
  150. package/build-module/toggle-group-control/toggle-group-control/as-button-group.js.map +1 -1
  151. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js +9 -3
  152. package/build-module/toggle-group-control/toggle-group-control/as-radio-group.js.map +1 -1
  153. package/build-module/toggle-group-control/toggle-group-control/component.js +76 -10
  154. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  155. package/build-module/toggle-group-control/toggle-group-control/styles.js +7 -7
  156. package/build-module/toggle-group-control/toggle-group-control/styles.js.map +1 -1
  157. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js +12 -22
  158. package/build-module/toggle-group-control/toggle-group-control-option-base/component.js.map +1 -1
  159. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js +7 -8
  160. package/build-module/toggle-group-control/toggle-group-control-option-base/styles.js.map +1 -1
  161. package/build-module/toggle-group-control/types.js.map +1 -1
  162. package/build-module/utils/element-rect.js +22 -12
  163. package/build-module/utils/element-rect.js.map +1 -1
  164. package/build-module/utils/hooks/use-on-value-update.js +3 -6
  165. package/build-module/utils/hooks/use-on-value-update.js.map +1 -1
  166. package/build-style/style-rtl.css +26 -13
  167. package/build-style/style.css +26 -13
  168. package/build-types/autocomplete/index.d.ts.map +1 -1
  169. package/build-types/border-box-control/border-box-control/component.d.ts +5 -15
  170. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  171. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts +2 -1
  172. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -1
  173. package/build-types/border-box-control/stories/index.story.d.ts +3 -2
  174. package/build-types/border-box-control/stories/index.story.d.ts.map +1 -1
  175. package/build-types/border-control/border-control/component.d.ts +3 -2
  176. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  177. package/build-types/border-control/border-control-dropdown/component.d.ts +2 -1
  178. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  179. package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -1
  180. package/build-types/border-control/stories/index.story.d.ts +15 -30
  181. package/build-types/border-control/stories/index.story.d.ts.map +1 -1
  182. package/build-types/border-control/styles.d.ts.map +1 -1
  183. package/build-types/border-control/types.d.ts +12 -7
  184. package/build-types/border-control/types.d.ts.map +1 -1
  185. package/build-types/box-control/index.d.ts +4 -4
  186. package/build-types/box-control/stories/index.story.d.ts.map +1 -1
  187. package/build-types/box-control/types.d.ts +3 -3
  188. package/build-types/composite/group-label.d.ts.map +1 -1
  189. package/build-types/composite/index.d.ts.map +1 -1
  190. package/build-types/composite/item.d.ts.map +1 -1
  191. package/build-types/composite/stories/index.story.d.ts +22 -0
  192. package/build-types/composite/stories/index.story.d.ts.map +1 -1
  193. package/build-types/composite/test/index.d.ts +2 -0
  194. package/build-types/composite/test/index.d.ts.map +1 -0
  195. package/build-types/date-time/date/index.d.ts.map +1 -1
  196. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  197. package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
  198. package/build-types/index.d.ts +23 -4
  199. package/build-types/index.d.ts.map +1 -1
  200. package/build-types/navigator/index.d.ts +171 -5
  201. package/build-types/navigator/index.d.ts.map +1 -1
  202. package/build-types/navigator/legacy.d.ts +226 -0
  203. package/build-types/navigator/legacy.d.ts.map +1 -0
  204. package/build-types/navigator/navigator/component.d.ts +3 -0
  205. package/build-types/navigator/navigator/component.d.ts.map +1 -0
  206. package/build-types/navigator/navigator-back-button/component.d.ts +0 -35
  207. package/build-types/navigator/navigator-back-button/component.d.ts.map +1 -1
  208. package/build-types/navigator/navigator-button/component.d.ts +0 -34
  209. package/build-types/navigator/navigator-button/component.d.ts.map +1 -1
  210. package/build-types/navigator/navigator-screen/component.d.ts +0 -35
  211. package/build-types/navigator/navigator-screen/component.d.ts.map +1 -1
  212. package/build-types/navigator/navigator-screen/use-screen-animate-presence.d.ts +16 -0
  213. package/build-types/navigator/navigator-screen/use-screen-animate-presence.d.ts.map +1 -0
  214. package/build-types/navigator/navigator-to-parent-button/component.d.ts +0 -4
  215. package/build-types/navigator/navigator-to-parent-button/component.d.ts.map +1 -1
  216. package/build-types/navigator/stories/index.story.d.ts +5 -5
  217. package/build-types/navigator/stories/index.story.d.ts.map +1 -1
  218. package/build-types/navigator/styles.d.ts +20 -7
  219. package/build-types/navigator/styles.d.ts.map +1 -1
  220. package/build-types/navigator/types.d.ts +19 -1
  221. package/build-types/navigator/types.d.ts.map +1 -1
  222. package/build-types/navigator/use-navigator.d.ts +4 -1
  223. package/build-types/navigator/use-navigator.d.ts.map +1 -1
  224. package/build-types/select-control/stories/index.story.d.ts +7 -0
  225. package/build-types/select-control/stories/index.story.d.ts.map +1 -1
  226. package/build-types/tabs/stories/index.story.d.ts +2 -1
  227. package/build-types/tabs/stories/index.story.d.ts.map +1 -1
  228. package/build-types/tabs/styles.d.ts.map +1 -1
  229. package/build-types/tabs/tablist.d.ts.map +1 -1
  230. package/build-types/tabs/use-track-overflow.d.ts +17 -0
  231. package/build-types/tabs/use-track-overflow.d.ts.map +1 -0
  232. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts +2 -2
  233. package/build-types/toggle-group-control/toggle-group-control/as-button-group.d.ts.map +1 -1
  234. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts +2 -2
  235. package/build-types/toggle-group-control/toggle-group-control/as-radio-group.d.ts.map +1 -1
  236. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  237. package/build-types/toggle-group-control/toggle-group-control/styles.d.ts.map +1 -1
  238. package/build-types/toggle-group-control/toggle-group-control-option-base/component.d.ts.map +1 -1
  239. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts +0 -1
  240. package/build-types/toggle-group-control/toggle-group-control-option-base/styles.d.ts.map +1 -1
  241. package/build-types/toggle-group-control/types.d.ts +2 -1
  242. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  243. package/build-types/utils/element-rect.d.ts +8 -0
  244. package/build-types/utils/element-rect.d.ts.map +1 -1
  245. package/build-types/utils/hooks/use-on-value-update.d.ts.map +1 -1
  246. package/package.json +19 -19
  247. package/src/autocomplete/index.tsx +4 -1
  248. package/src/border-box-control/border-box-control/README.md +22 -26
  249. package/src/border-box-control/border-box-control/component.tsx +3 -14
  250. package/src/border-box-control/stories/index.story.tsx +2 -1
  251. package/src/border-control/border-control/README.md +26 -36
  252. package/src/border-control/border-control/component.tsx +1 -2
  253. package/src/border-control/border-control-dropdown/component.tsx +1 -15
  254. package/src/border-control/stories/index.story.tsx +4 -10
  255. package/src/border-control/styles.ts +0 -1
  256. package/src/border-control/test/index.js +2 -15
  257. package/src/border-control/types.ts +12 -7
  258. package/src/box-control/README.md +9 -12
  259. package/src/box-control/index.tsx +4 -4
  260. package/src/box-control/stories/index.story.tsx +1 -1
  261. package/src/box-control/types.ts +3 -3
  262. package/src/composite/group-label.tsx +7 -5
  263. package/src/composite/group.tsx +7 -7
  264. package/src/composite/hover.tsx +7 -7
  265. package/src/composite/index.tsx +6 -1
  266. package/src/composite/item.tsx +19 -1
  267. package/src/composite/legacy/test/index.tsx +22 -21
  268. package/src/composite/row.tsx +7 -7
  269. package/src/composite/stories/index.story.tsx +42 -0
  270. package/src/composite/test/index.tsx +123 -0
  271. package/src/composite/typeahead.tsx +7 -7
  272. package/src/date-time/date/index.tsx +2 -0
  273. package/src/dropdown/stories/index.story.tsx +1 -0
  274. package/src/dropdown/style.scss +10 -13
  275. package/src/dropdown-menu/stories/index.story.tsx +3 -0
  276. package/src/index.ts +19 -1
  277. package/src/menu-group/style.scss +4 -1
  278. package/src/menu-items-choice/style.scss +2 -0
  279. package/src/navigator/README.md +176 -0
  280. package/src/navigator/index.tsx +131 -0
  281. package/src/navigator/legacy.ts +169 -0
  282. package/src/navigator/{navigator-provider → navigator}/component.tsx +6 -44
  283. package/src/navigator/navigator-back-button/component.tsx +1 -37
  284. package/src/navigator/navigator-back-button/hook.ts +1 -1
  285. package/src/navigator/navigator-button/component.tsx +1 -36
  286. package/src/navigator/navigator-button/hook.ts +1 -1
  287. package/src/navigator/navigator-screen/component.tsx +48 -76
  288. package/src/navigator/navigator-screen/use-screen-animate-presence.ts +177 -0
  289. package/src/navigator/navigator-to-parent-button/component.tsx +2 -7
  290. package/src/navigator/stories/index.story.tsx +55 -54
  291. package/src/navigator/styles.ts +112 -41
  292. package/src/navigator/test/index.tsx +47 -47
  293. package/src/navigator/types.ts +19 -1
  294. package/src/navigator/use-navigator.ts +4 -1
  295. package/src/search-control/index.tsx +2 -2
  296. package/src/select-control/stories/index.story.tsx +14 -1
  297. package/src/tabs/stories/index.story.tsx +106 -0
  298. package/src/tabs/styles.ts +54 -20
  299. package/src/tabs/tablist.tsx +60 -26
  300. package/src/tabs/use-track-overflow.ts +76 -0
  301. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +208 -44
  302. package/src/toggle-group-control/toggle-group-control/as-button-group.tsx +18 -10
  303. package/src/toggle-group-control/toggle-group-control/as-radio-group.tsx +21 -9
  304. package/src/toggle-group-control/toggle-group-control/component.tsx +114 -6
  305. package/src/toggle-group-control/toggle-group-control/styles.ts +41 -0
  306. package/src/toggle-group-control/toggle-group-control-option-base/component.tsx +10 -27
  307. package/src/toggle-group-control/toggle-group-control-option-base/styles.ts +0 -11
  308. package/src/toggle-group-control/types.ts +3 -1
  309. package/src/tools-panel/tools-panel/README.md +10 -10
  310. package/src/utils/element-rect.ts +32 -15
  311. package/src/utils/hooks/use-on-value-update.ts +3 -6
  312. package/tsconfig.tsbuildinfo +1 -1
  313. package/build/navigator/navigator-provider/component.js.map +0 -1
  314. package/build/utils/hooks/use-event.js +0 -41
  315. package/build/utils/hooks/use-event.js.map +0 -1
  316. package/build-module/navigator/navigator-provider/component.js.map +0 -1
  317. package/build-module/utils/hooks/use-event.js +0 -35
  318. package/build-module/utils/hooks/use-event.js.map +0 -1
  319. package/build-types/navigator/navigator-provider/component.d.ts +0 -37
  320. package/build-types/navigator/navigator-provider/component.d.ts.map +0 -1
  321. package/build-types/utils/hooks/use-event.d.ts +0 -20
  322. package/build-types/utils/hooks/use-event.d.ts.map +0 -1
  323. package/src/navigator/index.ts +0 -6
  324. package/src/navigator/navigator-back-button/README.md +0 -15
  325. package/src/navigator/navigator-button/README.md +0 -38
  326. package/src/navigator/navigator-provider/README.md +0 -94
  327. package/src/navigator/navigator-screen/README.md +0 -33
  328. package/src/navigator/navigator-to-parent-button/README.md +0 -17
  329. package/src/utils/hooks/use-event.ts +0 -38
@@ -60,6 +60,55 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
60
60
  outline-offset: -2px;
61
61
  }
62
62
 
63
+ @media not ( prefers-reduced-motion ) {
64
+ .emotion-8[data-indicator-animated]::before {
65
+ transition-property: transform,border-radius;
66
+ transition-duration: 0.2s;
67
+ transition-timing-function: ease-out;
68
+ }
69
+ }
70
+
71
+ .emotion-8::before {
72
+ content: '';
73
+ position: absolute;
74
+ pointer-events: none;
75
+ background: #1e1e1e;
76
+ outline: 2px solid transparent;
77
+ outline-offset: -3px;
78
+ --antialiasing-factor: 100;
79
+ border-radius: calc(
80
+ 1px /
81
+ (
82
+ var( --selected-width, 0 ) /
83
+ var( --antialiasing-factor )
84
+ )
85
+ )/1px;
86
+ left: -1px;
87
+ width: calc( var( --antialiasing-factor ) * 1px );
88
+ height: calc( var( --selected-height, 0 ) * 1px );
89
+ transform-origin: left top;
90
+ -webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
91
+ calc(
92
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
93
+ )
94
+ );
95
+ -moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
96
+ calc(
97
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
98
+ )
99
+ );
100
+ -ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
101
+ calc(
102
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
103
+ )
104
+ );
105
+ transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
106
+ calc(
107
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
108
+ )
109
+ );
110
+ }
111
+
63
112
  .emotion-10 {
64
113
  display: -webkit-inline-box;
65
114
  display: -webkit-inline-flex;
@@ -150,17 +199,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
150
199
  line-height: 1;
151
200
  }
152
201
 
153
- .emotion-15 {
154
- background: #1e1e1e;
155
- border-radius: 1px;
156
- position: absolute;
157
- inset: 0;
158
- z-index: 1;
159
- outline: 2px solid transparent;
160
- outline-offset: -3px;
161
- }
162
-
163
- .emotion-18 {
202
+ .emotion-17 {
164
203
  -webkit-align-items: center;
165
204
  -webkit-box-align: center;
166
205
  -ms-flex-align: center;
@@ -204,22 +243,22 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
204
243
  }
205
244
 
206
245
  @media not ( prefers-reduced-motion ) {
207
- .emotion-18 {
246
+ .emotion-17 {
208
247
  -webkit-transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
209
248
  transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
210
249
  }
211
250
  }
212
251
 
213
- .emotion-18::-moz-focus-inner {
252
+ .emotion-17::-moz-focus-inner {
214
253
  border: 0;
215
254
  }
216
255
 
217
- .emotion-18[disabled] {
256
+ .emotion-17[disabled] {
218
257
  opacity: 0.4;
219
258
  cursor: default;
220
259
  }
221
260
 
222
- .emotion-18:active {
261
+ .emotion-17:active {
223
262
  background: #fff;
224
263
  }
225
264
 
@@ -280,12 +319,6 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
280
319
  </svg>
281
320
  </div>
282
321
  </button>
283
- <div>
284
- <div
285
- class="emotion-15"
286
- role="presentation"
287
- />
288
- </div>
289
322
  </div>
290
323
  <div
291
324
  class="emotion-10 emotion-11"
@@ -293,7 +326,7 @@ exports[`ToggleGroupControl controlled should render correctly with icons 1`] =
293
326
  <button
294
327
  aria-checked="false"
295
328
  aria-label="Lowercase"
296
- class="emotion-18 components-toggle-group-control-option-base"
329
+ class="emotion-17 components-toggle-group-control-option-base"
297
330
  data-value="lowercase"
298
331
  data-wp-c16t="true"
299
332
  data-wp-component="ToggleGroupControlOptionBase"
@@ -392,6 +425,55 @@ exports[`ToggleGroupControl controlled should render correctly with text options
392
425
  outline-offset: -2px;
393
426
  }
394
427
 
428
+ @media not ( prefers-reduced-motion ) {
429
+ .emotion-8[data-indicator-animated]::before {
430
+ transition-property: transform,border-radius;
431
+ transition-duration: 0.2s;
432
+ transition-timing-function: ease-out;
433
+ }
434
+ }
435
+
436
+ .emotion-8::before {
437
+ content: '';
438
+ position: absolute;
439
+ pointer-events: none;
440
+ background: #1e1e1e;
441
+ outline: 2px solid transparent;
442
+ outline-offset: -3px;
443
+ --antialiasing-factor: 100;
444
+ border-radius: calc(
445
+ 1px /
446
+ (
447
+ var( --selected-width, 0 ) /
448
+ var( --antialiasing-factor )
449
+ )
450
+ )/1px;
451
+ left: -1px;
452
+ width: calc( var( --antialiasing-factor ) * 1px );
453
+ height: calc( var( --selected-height, 0 ) * 1px );
454
+ transform-origin: left top;
455
+ -webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
456
+ calc(
457
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
458
+ )
459
+ );
460
+ -moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
461
+ calc(
462
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
463
+ )
464
+ );
465
+ -ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
466
+ calc(
467
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
468
+ )
469
+ );
470
+ transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
471
+ calc(
472
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
473
+ )
474
+ );
475
+ }
476
+
395
477
  .emotion-10 {
396
478
  display: -webkit-inline-box;
397
479
  display: -webkit-inline-flex;
@@ -612,6 +694,55 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
612
694
  outline-offset: -2px;
613
695
  }
614
696
 
697
+ @media not ( prefers-reduced-motion ) {
698
+ .emotion-8[data-indicator-animated]::before {
699
+ transition-property: transform,border-radius;
700
+ transition-duration: 0.2s;
701
+ transition-timing-function: ease-out;
702
+ }
703
+ }
704
+
705
+ .emotion-8::before {
706
+ content: '';
707
+ position: absolute;
708
+ pointer-events: none;
709
+ background: #1e1e1e;
710
+ outline: 2px solid transparent;
711
+ outline-offset: -3px;
712
+ --antialiasing-factor: 100;
713
+ border-radius: calc(
714
+ 1px /
715
+ (
716
+ var( --selected-width, 0 ) /
717
+ var( --antialiasing-factor )
718
+ )
719
+ )/1px;
720
+ left: -1px;
721
+ width: calc( var( --antialiasing-factor ) * 1px );
722
+ height: calc( var( --selected-height, 0 ) * 1px );
723
+ transform-origin: left top;
724
+ -webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
725
+ calc(
726
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
727
+ )
728
+ );
729
+ -moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
730
+ calc(
731
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
732
+ )
733
+ );
734
+ -ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
735
+ calc(
736
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
737
+ )
738
+ );
739
+ transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
740
+ calc(
741
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
742
+ )
743
+ );
744
+ }
745
+
615
746
  .emotion-10 {
616
747
  display: -webkit-inline-box;
617
748
  display: -webkit-inline-flex;
@@ -702,17 +833,7 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
702
833
  line-height: 1;
703
834
  }
704
835
 
705
- .emotion-15 {
706
- background: #1e1e1e;
707
- border-radius: 1px;
708
- position: absolute;
709
- inset: 0;
710
- z-index: 1;
711
- outline: 2px solid transparent;
712
- outline-offset: -3px;
713
- }
714
-
715
- .emotion-18 {
836
+ .emotion-17 {
716
837
  -webkit-align-items: center;
717
838
  -webkit-box-align: center;
718
839
  -ms-flex-align: center;
@@ -756,22 +877,22 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
756
877
  }
757
878
 
758
879
  @media not ( prefers-reduced-motion ) {
759
- .emotion-18 {
880
+ .emotion-17 {
760
881
  -webkit-transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
761
882
  transition: background 160ms linear,color 160ms linear,font-weight 60ms linear;
762
883
  }
763
884
  }
764
885
 
765
- .emotion-18::-moz-focus-inner {
886
+ .emotion-17::-moz-focus-inner {
766
887
  border: 0;
767
888
  }
768
889
 
769
- .emotion-18[disabled] {
890
+ .emotion-17[disabled] {
770
891
  opacity: 0.4;
771
892
  cursor: default;
772
893
  }
773
894
 
774
- .emotion-18:active {
895
+ .emotion-17:active {
775
896
  background: #fff;
776
897
  }
777
898
 
@@ -832,12 +953,6 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
832
953
  </svg>
833
954
  </div>
834
955
  </button>
835
- <div>
836
- <div
837
- class="emotion-15"
838
- role="presentation"
839
- />
840
- </div>
841
956
  </div>
842
957
  <div
843
958
  class="emotion-10 emotion-11"
@@ -845,7 +960,7 @@ exports[`ToggleGroupControl uncontrolled should render correctly with icons 1`]
845
960
  <button
846
961
  aria-checked="false"
847
962
  aria-label="Lowercase"
848
- class="emotion-18 components-toggle-group-control-option-base"
963
+ class="emotion-17 components-toggle-group-control-option-base"
849
964
  data-value="lowercase"
850
965
  data-wp-c16t="true"
851
966
  data-wp-component="ToggleGroupControlOptionBase"
@@ -938,6 +1053,55 @@ exports[`ToggleGroupControl uncontrolled should render correctly with text optio
938
1053
  outline-offset: -2px;
939
1054
  }
940
1055
 
1056
+ @media not ( prefers-reduced-motion ) {
1057
+ .emotion-8[data-indicator-animated]::before {
1058
+ transition-property: transform,border-radius;
1059
+ transition-duration: 0.2s;
1060
+ transition-timing-function: ease-out;
1061
+ }
1062
+ }
1063
+
1064
+ .emotion-8::before {
1065
+ content: '';
1066
+ position: absolute;
1067
+ pointer-events: none;
1068
+ background: #1e1e1e;
1069
+ outline: 2px solid transparent;
1070
+ outline-offset: -3px;
1071
+ --antialiasing-factor: 100;
1072
+ border-radius: calc(
1073
+ 1px /
1074
+ (
1075
+ var( --selected-width, 0 ) /
1076
+ var( --antialiasing-factor )
1077
+ )
1078
+ )/1px;
1079
+ left: -1px;
1080
+ width: calc( var( --antialiasing-factor ) * 1px );
1081
+ height: calc( var( --selected-height, 0 ) * 1px );
1082
+ transform-origin: left top;
1083
+ -webkit-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
1084
+ calc(
1085
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
1086
+ )
1087
+ );
1088
+ -moz-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
1089
+ calc(
1090
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
1091
+ )
1092
+ );
1093
+ -ms-transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
1094
+ calc(
1095
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
1096
+ )
1097
+ );
1098
+ transform: translateX( calc( var( --selected-left, 0 ) * 1px ) ) scaleX(
1099
+ calc(
1100
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
1101
+ )
1102
+ );
1103
+ }
1104
+
941
1105
  .emotion-10 {
942
1106
  display: -webkit-inline-box;
943
1107
  display: -webkit-inline-flex;
@@ -26,6 +26,7 @@ function UnforwardedToggleGroupControlAsButtonGroup(
26
26
  size,
27
27
  value: valueProp,
28
28
  id: idProp,
29
+ setSelectedElement,
29
30
  ...otherProps
30
31
  }: WordPressComponentProps<
31
32
  ToggleGroupControlMainControlProps,
@@ -54,16 +55,23 @@ function UnforwardedToggleGroupControlAsButtonGroup(
54
55
  } );
55
56
 
56
57
  const groupContextValue = useMemo(
57
- () =>
58
- ( {
59
- baseId,
60
- value: selectedValue,
61
- setValue: setSelectedValue,
62
- isBlock: ! isAdaptiveWidth,
63
- isDeselectable: true,
64
- size,
65
- } ) as ToggleGroupControlContextProps,
66
- [ baseId, selectedValue, setSelectedValue, isAdaptiveWidth, size ]
58
+ (): ToggleGroupControlContextProps => ( {
59
+ baseId,
60
+ value: selectedValue,
61
+ setValue: setSelectedValue,
62
+ isBlock: ! isAdaptiveWidth,
63
+ isDeselectable: true,
64
+ size,
65
+ setSelectedElement,
66
+ } ),
67
+ [
68
+ baseId,
69
+ selectedValue,
70
+ setSelectedValue,
71
+ isAdaptiveWidth,
72
+ size,
73
+ setSelectedElement,
74
+ ]
67
75
  );
68
76
 
69
77
  return (
@@ -10,6 +10,7 @@ import { useStoreState } from '@ariakit/react';
10
10
  */
11
11
  import { useInstanceId } from '@wordpress/compose';
12
12
  import { forwardRef, useMemo } from '@wordpress/element';
13
+ import { isRTL } from '@wordpress/i18n';
13
14
 
14
15
  /**
15
16
  * Internal dependencies
@@ -32,6 +33,7 @@ function UnforwardedToggleGroupControlAsRadioGroup(
32
33
  size,
33
34
  value: valueProp,
34
35
  id: idProp,
36
+ setSelectedElement,
35
37
  ...otherProps
36
38
  }: WordPressComponentProps<
37
39
  ToggleGroupControlMainControlProps,
@@ -65,21 +67,31 @@ function UnforwardedToggleGroupControlAsRadioGroup(
65
67
  defaultValue,
66
68
  value,
67
69
  setValue: wrappedOnChangeProp,
70
+ rtl: isRTL(),
68
71
  } );
69
72
 
70
73
  const selectedValue = useStoreState( radio, 'value' );
71
74
  const setValue = radio.setValue;
72
75
 
73
76
  const groupContextValue = useMemo(
74
- () =>
75
- ( {
76
- baseId,
77
- isBlock: ! isAdaptiveWidth,
78
- size,
79
- value: selectedValue,
80
- setValue,
81
- } ) as ToggleGroupControlContextProps,
82
- [ baseId, isAdaptiveWidth, size, selectedValue, setValue ]
77
+ (): ToggleGroupControlContextProps => ( {
78
+ baseId,
79
+ isBlock: ! isAdaptiveWidth,
80
+ size,
81
+ // @ts-expect-error - This is wrong and we should fix it.
82
+ value: selectedValue,
83
+ // @ts-expect-error - This is wrong and we should fix it.
84
+ setValue,
85
+ setSelectedElement,
86
+ } ),
87
+ [
88
+ baseId,
89
+ isAdaptiveWidth,
90
+ selectedValue,
91
+ setSelectedElement,
92
+ setValue,
93
+ size,
94
+ ]
83
95
  );
84
96
 
85
97
  return (
@@ -2,13 +2,11 @@
2
2
  * External dependencies
3
3
  */
4
4
  import type { ForwardedRef } from 'react';
5
- import { LayoutGroup } from 'framer-motion';
6
5
 
7
6
  /**
8
7
  * WordPress dependencies
9
8
  */
10
- import { useInstanceId } from '@wordpress/compose';
11
- import { useMemo } from '@wordpress/element';
9
+ import { useLayoutEffect, useMemo, useState } from '@wordpress/element';
12
10
 
13
11
  /**
14
12
  * Internal dependencies
@@ -22,6 +20,104 @@ import { VisualLabelWrapper } from './styles';
22
20
  import * as styles from './styles';
23
21
  import { ToggleGroupControlAsRadioGroup } from './as-radio-group';
24
22
  import { ToggleGroupControlAsButtonGroup } from './as-button-group';
23
+ import type { ElementOffsetRect } from '../../utils/element-rect';
24
+ import { useTrackElementOffsetRect } from '../../utils/element-rect';
25
+ import { useOnValueUpdate } from '../../utils/hooks/use-on-value-update';
26
+ import { useEvent, useMergeRefs } from '@wordpress/compose';
27
+
28
+ /**
29
+ * A utility used to animate something in a container component based on the "offset
30
+ * rect" (position relative to the container and size) of a subelement. For example,
31
+ * this is useful to render an indicator for the selected option of a component, and
32
+ * to animate it when the selected option changes.
33
+ *
34
+ * Takes in a container element and the up-to-date "offset rect" of the target
35
+ * subelement, obtained with `useTrackElementOffsetRect`. Then it does the following:
36
+ *
37
+ * - Adds CSS variables with rect information to the container, so that the indicator
38
+ * can be rendered and animated with them. These are kept up-to-date, enabling CSS
39
+ * transitions on change.
40
+ * - Sets an attribute (`data-subelement-animated` by default) when the tracked
41
+ * element changes, so that the target (e.g. the indicator) can be animated to its
42
+ * new size and position.
43
+ * - Removes the attribute when the animation is done.
44
+ *
45
+ * The need for the attribute is due to the fact that the rect might update in
46
+ * situations other than when the tracked element changes, e.g. the tracked element
47
+ * might be resized. In such cases, there is no need to animate the indicator, and
48
+ * the change in size or position of the indicator needs to be reflected immediately.
49
+ */
50
+ function useAnimatedOffsetRect(
51
+ /**
52
+ * The container element.
53
+ */
54
+ container: HTMLElement | undefined,
55
+ /**
56
+ * The rect of the tracked element.
57
+ */
58
+ rect: ElementOffsetRect,
59
+ {
60
+ prefix = 'subelement',
61
+ dataAttribute = `${ prefix }-animated`,
62
+ transitionEndFilter = () => true,
63
+ }: {
64
+ /**
65
+ * The prefix used for the CSS variables, e.g. if `prefix` is `selected`, the
66
+ * CSS variables will be `--selected-top`, `--selected-left`, etc.
67
+ * @default 'subelement'
68
+ */
69
+ prefix?: string;
70
+ /**
71
+ * The name of the data attribute used to indicate that the animation is in
72
+ * progress. The `data-` prefix is added automatically.
73
+ *
74
+ * For example, if `dataAttribute` is `indicator-animated`, the attribute will
75
+ * be `data-indicator-animated`.
76
+ * @default `${ prefix }-animated`
77
+ */
78
+ dataAttribute?: string;
79
+ /**
80
+ * A function that is called with the transition event and returns a boolean
81
+ * indicating whether the animation should be stopped. The default is a function
82
+ * that always returns `true`.
83
+ *
84
+ * For example, if the animated element is the `::before` pseudo-element, the
85
+ * function can be written as `( event ) => event.pseudoElement === '::before'`.
86
+ * @default () => true
87
+ */
88
+ transitionEndFilter?: ( event: TransitionEvent ) => boolean;
89
+ } = {}
90
+ ) {
91
+ const setProperties = useEvent( () => {
92
+ ( Object.keys( rect ) as Array< keyof typeof rect > ).forEach(
93
+ ( property ) =>
94
+ property !== 'element' &&
95
+ container?.style.setProperty(
96
+ `--${ prefix }-${ property }`,
97
+ String( rect[ property ] )
98
+ )
99
+ );
100
+ } );
101
+ useLayoutEffect( () => {
102
+ setProperties();
103
+ }, [ rect, setProperties ] );
104
+ useOnValueUpdate( rect.element, ( { previousValue } ) => {
105
+ // Only enable the animation when moving from one element to another.
106
+ if ( rect.element && previousValue ) {
107
+ container?.setAttribute( `data-${ dataAttribute }`, '' );
108
+ }
109
+ } );
110
+ useLayoutEffect( () => {
111
+ function onTransitionEnd( event: TransitionEvent ) {
112
+ if ( transitionEndFilter( event ) ) {
113
+ container?.removeAttribute( `data-${ dataAttribute }` );
114
+ }
115
+ }
116
+ container?.addEventListener( 'transitionend', onTransitionEnd );
117
+ return () =>
118
+ container?.removeEventListener( 'transitionend', onTransitionEnd );
119
+ }, [ dataAttribute, container, transitionEndFilter ] );
120
+ }
25
121
 
26
122
  function UnconnectedToggleGroupControl(
27
123
  props: WordPressComponentProps< ToggleGroupControlProps, 'div', false >,
@@ -44,10 +140,21 @@ function UnconnectedToggleGroupControl(
44
140
  ...otherProps
45
141
  } = useContextSystem( props, 'ToggleGroupControl' );
46
142
 
47
- const baseId = useInstanceId( ToggleGroupControl, 'toggle-group-control' );
48
143
  const normalizedSize =
49
144
  __next40pxDefaultSize && size === 'default' ? '__unstable-large' : size;
50
145
 
146
+ const [ selectedElement, setSelectedElement ] = useState< HTMLElement >();
147
+ const [ controlElement, setControlElement ] = useState< HTMLElement >();
148
+ const refs = useMergeRefs( [ setControlElement, forwardedRef ] );
149
+ const selectedRect = useTrackElementOffsetRect(
150
+ value ? selectedElement : undefined
151
+ );
152
+ useAnimatedOffsetRect( controlElement, selectedRect, {
153
+ prefix: 'selected',
154
+ dataAttribute: 'indicator-animated',
155
+ transitionEndFilter: ( event ) => event.pseudoElement === '::before',
156
+ } );
157
+
51
158
  const cx = useCx();
52
159
 
53
160
  const classes = useMemo(
@@ -81,15 +188,16 @@ function UnconnectedToggleGroupControl(
81
188
  ) }
82
189
  <MainControl
83
190
  { ...otherProps }
191
+ setSelectedElement={ setSelectedElement }
84
192
  className={ classes }
85
193
  isAdaptiveWidth={ isAdaptiveWidth }
86
194
  label={ label }
87
195
  onChange={ onChange }
88
- ref={ forwardedRef }
196
+ ref={ refs }
89
197
  size={ normalizedSize }
90
198
  value={ value }
91
199
  >
92
- <LayoutGroup id={ baseId }>{ children }</LayoutGroup>
200
+ { children }
93
201
  </MainControl>
94
202
  </BaseControl>
95
203
  );
@@ -26,6 +26,47 @@ export const toggleGroupControl = ( {
26
26
 
27
27
  ${ toggleGroupControlSize( size ) }
28
28
  ${ ! isDeselectable && enclosingBorders( isBlock ) }
29
+
30
+ @media not ( prefers-reduced-motion ) {
31
+ &[data-indicator-animated]::before {
32
+ transition-property: transform, border-radius;
33
+ transition-duration: 0.2s;
34
+ transition-timing-function: ease-out;
35
+ }
36
+ }
37
+
38
+ &::before {
39
+ content: '';
40
+ position: absolute;
41
+ pointer-events: none;
42
+ background: ${ COLORS.gray[ 900 ] };
43
+
44
+ // Windows High Contrast mode will show this outline, but not the box-shadow.
45
+ outline: 2px solid transparent;
46
+ outline-offset: -3px;
47
+
48
+ /* Using a large value to avoid antialiasing rounding issues
49
+ when scaling in the transform, see: https://stackoverflow.com/a/52159123 */
50
+ --antialiasing-factor: 100;
51
+ /* Adjusting the border radius to match the scaling in the x axis. */
52
+ border-radius: calc(
53
+ ${ CONFIG.radiusXSmall } /
54
+ (
55
+ var( --selected-width, 0 ) /
56
+ var( --antialiasing-factor )
57
+ )
58
+ ) / ${ CONFIG.radiusXSmall };
59
+ left: -1px; // Correcting for border.
60
+ width: calc( var( --antialiasing-factor ) * 1px );
61
+ height: calc( var( --selected-height, 0 ) * 1px );
62
+ transform-origin: left top;
63
+ transform: translateX( calc( var( --selected-left, 0 ) * 1px ) )
64
+ scaleX(
65
+ calc(
66
+ var( --selected-width, 0 ) / var( --antialiasing-factor )
67
+ )
68
+ );
69
+ }
29
70
  `;
30
71
 
31
72
  const enclosingBorders = ( isBlock: ToggleGroupControlProps[ 'isBlock' ] ) => {