@wordpress/components 28.11.0 → 28.13.1-next.082ed6819.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 (514) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/build/autocomplete/autocompleter-ui.js +1 -0
  3. package/build/autocomplete/autocompleter-ui.js.map +1 -1
  4. package/build/border-box-control/border-box-control/component.js +1 -0
  5. package/build/border-box-control/border-box-control/component.js.map +1 -1
  6. package/build/border-box-control/border-box-control-split-controls/component.js +2 -1
  7. package/build/border-box-control/border-box-control-split-controls/component.js.map +1 -1
  8. package/build/border-control/border-control/component.js +2 -1
  9. package/build/border-control/border-control/component.js.map +1 -1
  10. package/build/border-control/border-control/hook.js +3 -1
  11. package/build/border-control/border-control/hook.js.map +1 -1
  12. package/build/border-control/border-control-dropdown/component.js +1 -1
  13. package/build/border-control/border-control-dropdown/component.js.map +1 -1
  14. package/build/border-control/types.js.map +1 -1
  15. package/build/box-control/all-input-control.js +1 -0
  16. package/build/box-control/all-input-control.js.map +1 -1
  17. package/build/box-control/axial-input-controls.js +1 -0
  18. package/build/box-control/axial-input-controls.js.map +1 -1
  19. package/build/box-control/input-controls.js +1 -0
  20. package/build/box-control/input-controls.js.map +1 -1
  21. package/build/color-palette/index.js +2 -0
  22. package/build/color-palette/index.js.map +1 -1
  23. package/build/color-picker/color-copy-button.js +6 -4
  24. package/build/color-picker/color-copy-button.js.map +1 -1
  25. package/build/color-picker/component.js +1 -0
  26. package/build/color-picker/component.js.map +1 -1
  27. package/build/color-picker/styles.js +21 -28
  28. package/build/color-picker/styles.js.map +1 -1
  29. package/build/combobox-control/index.js +17 -12
  30. package/build/combobox-control/index.js.map +1 -1
  31. package/build/composite/hover.js +1 -1
  32. package/build/composite/hover.js.map +1 -1
  33. package/build/composite/typeahead.js +1 -1
  34. package/build/composite/typeahead.js.map +1 -1
  35. package/build/dashicon/types.js.map +1 -1
  36. package/build/dimension-control/index.js +7 -0
  37. package/build/dimension-control/index.js.map +1 -1
  38. package/build/disabled/index.js +8 -1
  39. package/build/disabled/index.js.map +1 -1
  40. package/build/duotone-picker/duotone-picker.js +2 -0
  41. package/build/duotone-picker/duotone-picker.js.map +1 -1
  42. package/build/font-size-picker/font-size-picker-toggle-group.js +1 -0
  43. package/build/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  44. package/build/font-size-picker/index.js +7 -0
  45. package/build/font-size-picker/index.js.map +1 -1
  46. package/build/form-file-upload/index.js +7 -1
  47. package/build/form-file-upload/index.js.map +1 -1
  48. package/build/form-token-field/token.js +1 -0
  49. package/build/form-token-field/token.js.map +1 -1
  50. package/build/gradient-picker/index.js +34 -32
  51. package/build/gradient-picker/index.js.map +1 -1
  52. package/build/gradient-picker/types.js.map +1 -1
  53. package/build/guide/page-control.js +1 -0
  54. package/build/guide/page-control.js.map +1 -1
  55. package/build/menu/styles.js +16 -16
  56. package/build/menu/styles.js.map +1 -1
  57. package/build/menu-item/index.js +1 -0
  58. package/build/menu-item/index.js.map +1 -1
  59. package/build/modal/index.js +2 -2
  60. package/build/modal/index.js.map +1 -1
  61. package/build/notice/index.js +2 -0
  62. package/build/notice/index.js.map +1 -1
  63. package/build/palette-edit/index.js +5 -0
  64. package/build/palette-edit/index.js.map +1 -1
  65. package/build/panel/body.js +1 -0
  66. package/build/panel/body.js.map +1 -1
  67. package/build/popover/index.js +4 -1
  68. package/build/popover/index.js.map +1 -1
  69. package/build/private-apis.js +0 -2
  70. package/build/private-apis.js.map +1 -1
  71. package/build/radio-group/radio.js +6 -0
  72. package/build/radio-group/radio.js.map +1 -1
  73. package/build/radio-group/types.js.map +1 -1
  74. package/build/range-control/index.js +11 -0
  75. package/build/range-control/index.js.map +1 -1
  76. package/build/range-control/types.js.map +1 -1
  77. package/build/slot-fill/bubbles-virtually/fill.js +14 -31
  78. package/build/slot-fill/bubbles-virtually/fill.js.map +1 -1
  79. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js +13 -4
  80. package/build/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  81. package/build/slot-fill/bubbles-virtually/slot.js +11 -9
  82. package/build/slot-fill/bubbles-virtually/slot.js.map +1 -1
  83. package/build/slot-fill/bubbles-virtually/use-slot.js +1 -8
  84. package/build/slot-fill/bubbles-virtually/use-slot.js.map +1 -1
  85. package/build/slot-fill/fill.js +7 -24
  86. package/build/slot-fill/fill.js.map +1 -1
  87. package/build/slot-fill/index.js +5 -10
  88. package/build/slot-fill/index.js.map +1 -1
  89. package/build/slot-fill/provider.js +2 -2
  90. package/build/slot-fill/provider.js.map +1 -1
  91. package/build/slot-fill/slot.js +37 -77
  92. package/build/slot-fill/slot.js.map +1 -1
  93. package/build/slot-fill/types.js.map +1 -1
  94. package/build/snackbar/index.js +2 -1
  95. package/build/snackbar/index.js.map +1 -1
  96. package/build/tabs/tablist.js +13 -2
  97. package/build/tabs/tablist.js.map +1 -1
  98. package/build/text-control/index.js +7 -0
  99. package/build/text-control/index.js.map +1 -1
  100. package/build/toggle-group-control/toggle-group-control/component.js +10 -1
  101. package/build/toggle-group-control/toggle-group-control/component.js.map +1 -1
  102. package/build/toggle-group-control/toggle-group-control-option/component.js +1 -0
  103. package/build/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  104. package/build/toggle-group-control/toggle-group-control-option-icon/component.js +1 -1
  105. package/build/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -1
  106. package/build/toggle-group-control/types.js.map +1 -1
  107. package/build/utils/deprecated-36px-size.js +3 -2
  108. package/build/utils/deprecated-36px-size.js.map +1 -1
  109. package/build-module/autocomplete/autocompleter-ui.js +1 -0
  110. package/build-module/autocomplete/autocompleter-ui.js.map +1 -1
  111. package/build-module/border-box-control/border-box-control/component.js +1 -0
  112. package/build-module/border-box-control/border-box-control/component.js.map +1 -1
  113. package/build-module/border-box-control/border-box-control-split-controls/component.js +2 -1
  114. package/build-module/border-box-control/border-box-control-split-controls/component.js.map +1 -1
  115. package/build-module/border-control/border-control/component.js +2 -1
  116. package/build-module/border-control/border-control/component.js.map +1 -1
  117. package/build-module/border-control/border-control/hook.js +3 -1
  118. package/build-module/border-control/border-control/hook.js.map +1 -1
  119. package/build-module/border-control/border-control-dropdown/component.js +1 -1
  120. package/build-module/border-control/border-control-dropdown/component.js.map +1 -1
  121. package/build-module/border-control/types.js.map +1 -1
  122. package/build-module/box-control/all-input-control.js +1 -0
  123. package/build-module/box-control/all-input-control.js.map +1 -1
  124. package/build-module/box-control/axial-input-controls.js +1 -0
  125. package/build-module/box-control/axial-input-controls.js.map +1 -1
  126. package/build-module/box-control/input-controls.js +1 -0
  127. package/build-module/box-control/input-controls.js.map +1 -1
  128. package/build-module/color-palette/index.js +2 -0
  129. package/build-module/color-palette/index.js.map +1 -1
  130. package/build-module/color-picker/color-copy-button.js +6 -4
  131. package/build-module/color-picker/color-copy-button.js.map +1 -1
  132. package/build-module/color-picker/component.js +1 -0
  133. package/build-module/color-picker/component.js.map +1 -1
  134. package/build-module/color-picker/styles.js +20 -27
  135. package/build-module/color-picker/styles.js.map +1 -1
  136. package/build-module/combobox-control/index.js +18 -13
  137. package/build-module/combobox-control/index.js.map +1 -1
  138. package/build-module/composite/hover.js +1 -1
  139. package/build-module/composite/hover.js.map +1 -1
  140. package/build-module/composite/typeahead.js +1 -1
  141. package/build-module/composite/typeahead.js.map +1 -1
  142. package/build-module/dashicon/types.js.map +1 -1
  143. package/build-module/dimension-control/index.js +7 -0
  144. package/build-module/dimension-control/index.js.map +1 -1
  145. package/build-module/disabled/index.js +8 -1
  146. package/build-module/disabled/index.js.map +1 -1
  147. package/build-module/duotone-picker/duotone-picker.js +2 -0
  148. package/build-module/duotone-picker/duotone-picker.js.map +1 -1
  149. package/build-module/font-size-picker/font-size-picker-toggle-group.js +1 -0
  150. package/build-module/font-size-picker/font-size-picker-toggle-group.js.map +1 -1
  151. package/build-module/font-size-picker/index.js +7 -0
  152. package/build-module/font-size-picker/index.js.map +1 -1
  153. package/build-module/form-file-upload/index.js +7 -1
  154. package/build-module/form-file-upload/index.js.map +1 -1
  155. package/build-module/form-token-field/token.js +1 -0
  156. package/build-module/form-token-field/token.js.map +1 -1
  157. package/build-module/gradient-picker/index.js +34 -32
  158. package/build-module/gradient-picker/index.js.map +1 -1
  159. package/build-module/gradient-picker/types.js.map +1 -1
  160. package/build-module/guide/page-control.js +1 -0
  161. package/build-module/guide/page-control.js.map +1 -1
  162. package/build-module/menu/styles.js +16 -16
  163. package/build-module/menu/styles.js.map +1 -1
  164. package/build-module/menu-item/index.js +1 -0
  165. package/build-module/menu-item/index.js.map +1 -1
  166. package/build-module/modal/index.js +2 -2
  167. package/build-module/modal/index.js.map +1 -1
  168. package/build-module/notice/index.js +2 -0
  169. package/build-module/notice/index.js.map +1 -1
  170. package/build-module/palette-edit/index.js +5 -0
  171. package/build-module/palette-edit/index.js.map +1 -1
  172. package/build-module/panel/body.js +1 -0
  173. package/build-module/panel/body.js.map +1 -1
  174. package/build-module/popover/index.js +4 -1
  175. package/build-module/popover/index.js.map +1 -1
  176. package/build-module/private-apis.js +0 -2
  177. package/build-module/private-apis.js.map +1 -1
  178. package/build-module/radio-group/radio.js +6 -0
  179. package/build-module/radio-group/radio.js.map +1 -1
  180. package/build-module/radio-group/types.js.map +1 -1
  181. package/build-module/range-control/index.js +11 -0
  182. package/build-module/range-control/index.js.map +1 -1
  183. package/build-module/range-control/types.js.map +1 -1
  184. package/build-module/slot-fill/bubbles-virtually/fill.js +15 -32
  185. package/build-module/slot-fill/bubbles-virtually/fill.js.map +1 -1
  186. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js +13 -4
  187. package/build-module/slot-fill/bubbles-virtually/slot-fill-provider.js.map +1 -1
  188. package/build-module/slot-fill/bubbles-virtually/slot.js +11 -9
  189. package/build-module/slot-fill/bubbles-virtually/slot.js.map +1 -1
  190. package/build-module/slot-fill/bubbles-virtually/use-slot.js +2 -9
  191. package/build-module/slot-fill/bubbles-virtually/use-slot.js.map +1 -1
  192. package/build-module/slot-fill/fill.js +7 -24
  193. package/build-module/slot-fill/fill.js.map +1 -1
  194. package/build-module/slot-fill/index.js +5 -8
  195. package/build-module/slot-fill/index.js.map +1 -1
  196. package/build-module/slot-fill/provider.js +2 -3
  197. package/build-module/slot-fill/provider.js.map +1 -1
  198. package/build-module/slot-fill/slot.js +38 -78
  199. package/build-module/slot-fill/slot.js.map +1 -1
  200. package/build-module/slot-fill/types.js.map +1 -1
  201. package/build-module/snackbar/index.js +2 -1
  202. package/build-module/snackbar/index.js.map +1 -1
  203. package/build-module/tabs/tablist.js +13 -2
  204. package/build-module/tabs/tablist.js.map +1 -1
  205. package/build-module/text-control/index.js +7 -0
  206. package/build-module/text-control/index.js.map +1 -1
  207. package/build-module/toggle-group-control/toggle-group-control/component.js +10 -1
  208. package/build-module/toggle-group-control/toggle-group-control/component.js.map +1 -1
  209. package/build-module/toggle-group-control/toggle-group-control-option/component.js +1 -0
  210. package/build-module/toggle-group-control/toggle-group-control-option/component.js.map +1 -1
  211. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js +1 -1
  212. package/build-module/toggle-group-control/toggle-group-control-option-icon/component.js.map +1 -1
  213. package/build-module/toggle-group-control/types.js.map +1 -1
  214. package/build-module/utils/deprecated-36px-size.js +3 -2
  215. package/build-module/utils/deprecated-36px-size.js.map +1 -1
  216. package/build-style/style-rtl.css +15 -36
  217. package/build-style/style.css +15 -36
  218. package/build-types/autocomplete/autocompleter-ui.d.ts.map +1 -1
  219. package/build-types/base-control/stories/index.story.d.ts.map +1 -1
  220. package/build-types/border-box-control/border-box-control/component.d.ts.map +1 -1
  221. package/build-types/border-box-control/border-box-control-split-controls/component.d.ts.map +1 -1
  222. package/build-types/border-control/border-control/component.d.ts +1 -0
  223. package/build-types/border-control/border-control/component.d.ts.map +1 -1
  224. package/build-types/border-control/border-control/hook.d.ts.map +1 -1
  225. package/build-types/border-control/border-control-dropdown/component.d.ts.map +1 -1
  226. package/build-types/border-control/border-control-style-picker/component.d.ts.map +1 -1
  227. package/build-types/border-control/stories/index.story.d.ts +10 -5
  228. package/build-types/border-control/stories/index.story.d.ts.map +1 -1
  229. package/build-types/border-control/types.d.ts +7 -0
  230. package/build-types/border-control/types.d.ts.map +1 -1
  231. package/build-types/box-control/all-input-control.d.ts.map +1 -1
  232. package/build-types/box-control/axial-input-controls.d.ts.map +1 -1
  233. package/build-types/box-control/input-controls.d.ts.map +1 -1
  234. package/build-types/box-control/styles/box-control-styles.d.ts +2 -1
  235. package/build-types/box-control/styles/box-control-styles.d.ts.map +1 -1
  236. package/build-types/checkbox-control/stories/index.story.d.ts.map +1 -1
  237. package/build-types/circular-option-picker/stories/index.story.d.ts.map +1 -1
  238. package/build-types/color-indicator/stories/index.story.d.ts.map +1 -1
  239. package/build-types/color-palette/index.d.ts.map +1 -1
  240. package/build-types/color-palette/stories/index.story.d.ts.map +1 -1
  241. package/build-types/color-picker/color-copy-button.d.ts.map +1 -1
  242. package/build-types/color-picker/component.d.ts.map +1 -1
  243. package/build-types/color-picker/stories/index.story.d.ts.map +1 -1
  244. package/build-types/color-picker/styles.d.ts +2 -4
  245. package/build-types/color-picker/styles.d.ts.map +1 -1
  246. package/build-types/combobox-control/index.d.ts +1 -0
  247. package/build-types/combobox-control/index.d.ts.map +1 -1
  248. package/build-types/combobox-control/stories/index.story.d.ts.map +1 -1
  249. package/build-types/composite/typeahead.d.ts.map +1 -1
  250. package/build-types/confirm-dialog/stories/index.story.d.ts.map +1 -1
  251. package/build-types/custom-gradient-picker/stories/index.story.d.ts.map +1 -1
  252. package/build-types/custom-select-control/stories/index.story.d.ts.map +1 -1
  253. package/build-types/custom-select-control-v2/stories/index.story.d.ts.map +1 -1
  254. package/build-types/dashicon/types.d.ts +1 -1
  255. package/build-types/dashicon/types.d.ts.map +1 -1
  256. package/build-types/date-time/stories/date-time.story.d.ts.map +1 -1
  257. package/build-types/date-time/stories/date.story.d.ts.map +1 -1
  258. package/build-types/date-time/stories/time.story.d.ts.map +1 -1
  259. package/build-types/dimension-control/index.d.ts +1 -0
  260. package/build-types/dimension-control/index.d.ts.map +1 -1
  261. package/build-types/disabled/index.d.ts +8 -1
  262. package/build-types/disabled/index.d.ts.map +1 -1
  263. package/build-types/disabled/stories/index.story.d.ts.map +1 -1
  264. package/build-types/drop-zone/stories/index.story.d.ts.map +1 -1
  265. package/build-types/dropdown/stories/index.story.d.ts.map +1 -1
  266. package/build-types/dropdown-menu/stories/index.story.d.ts.map +1 -1
  267. package/build-types/duotone-picker/duotone-picker.d.ts.map +1 -1
  268. package/build-types/external-link/stories/index.story.d.ts.map +1 -1
  269. package/build-types/font-size-picker/font-size-picker-toggle-group.d.ts.map +1 -1
  270. package/build-types/font-size-picker/index.d.ts.map +1 -1
  271. package/build-types/font-size-picker/stories/index.story.d.ts.map +1 -1
  272. package/build-types/form-file-upload/index.d.ts.map +1 -1
  273. package/build-types/form-file-upload/stories/index.story.d.ts.map +1 -1
  274. package/build-types/form-token-field/stories/index.story.d.ts.map +1 -1
  275. package/build-types/form-token-field/token.d.ts.map +1 -1
  276. package/build-types/gradient-picker/index.d.ts +32 -32
  277. package/build-types/gradient-picker/index.d.ts.map +1 -1
  278. package/build-types/gradient-picker/stories/index.story.d.ts.map +1 -1
  279. package/build-types/gradient-picker/types.d.ts +1 -5
  280. package/build-types/gradient-picker/types.d.ts.map +1 -1
  281. package/build-types/guide/page-control.d.ts.map +1 -1
  282. package/build-types/h-stack/stories/index.story.d.ts.map +1 -1
  283. package/build-types/heading/stories/index.story.d.ts.map +1 -1
  284. package/build-types/input-control/stories/index.story.d.ts.map +1 -1
  285. package/build-types/lock-unlock.d.ts +2 -2
  286. package/build-types/menu/stories/index.story.d.ts.map +1 -1
  287. package/build-types/menu-group/stories/index.story.d.ts.map +1 -1
  288. package/build-types/menu-item/index.d.ts.map +1 -1
  289. package/build-types/menu-item/stories/index.story.d.ts.map +1 -1
  290. package/build-types/menu-items-choice/stories/index.story.d.ts.map +1 -1
  291. package/build-types/modal/stories/index.story.d.ts.map +1 -1
  292. package/build-types/navigator/stories/index.story.d.ts.map +1 -1
  293. package/build-types/notice/index.d.ts.map +1 -1
  294. package/build-types/notice/stories/index.story.d.ts.map +1 -1
  295. package/build-types/number-control/stories/index.story.d.ts.map +1 -1
  296. package/build-types/palette-edit/index.d.ts.map +1 -1
  297. package/build-types/panel/body.d.ts.map +1 -1
  298. package/build-types/placeholder/stories/index.story.d.ts.map +1 -1
  299. package/build-types/popover/index.d.ts.map +1 -1
  300. package/build-types/popover/stories/index.story.d.ts.map +1 -1
  301. package/build-types/private-apis.d.ts.map +1 -1
  302. package/build-types/progress-bar/stories/index.story.d.ts.map +1 -1
  303. package/build-types/radio-control/stories/index.story.d.ts.map +1 -1
  304. package/build-types/radio-group/radio.d.ts +4 -2
  305. package/build-types/radio-group/radio.d.ts.map +1 -1
  306. package/build-types/radio-group/stories/index.story.d.ts.map +1 -1
  307. package/build-types/radio-group/types.d.ts +5 -1
  308. package/build-types/radio-group/types.d.ts.map +1 -1
  309. package/build-types/range-control/index.d.ts +3 -1
  310. package/build-types/range-control/index.d.ts.map +1 -1
  311. package/build-types/range-control/stories/index.story.d.ts.map +1 -1
  312. package/build-types/range-control/types.d.ts +7 -0
  313. package/build-types/range-control/types.d.ts.map +1 -1
  314. package/build-types/responsive-wrapper/stories/index.story.d.ts.map +1 -1
  315. package/build-types/search-control/stories/index.story.d.ts.map +1 -1
  316. package/build-types/select-control/stories/index.story.d.ts.map +1 -1
  317. package/build-types/slot-fill/bubbles-virtually/fill.d.ts +1 -1
  318. package/build-types/slot-fill/bubbles-virtually/fill.d.ts.map +1 -1
  319. package/build-types/slot-fill/bubbles-virtually/slot-fill-provider.d.ts.map +1 -1
  320. package/build-types/slot-fill/bubbles-virtually/slot.d.ts.map +1 -1
  321. package/build-types/slot-fill/bubbles-virtually/use-slot-fills.d.ts +1 -1
  322. package/build-types/slot-fill/bubbles-virtually/use-slot-fills.d.ts.map +1 -1
  323. package/build-types/slot-fill/bubbles-virtually/use-slot.d.ts +3 -7
  324. package/build-types/slot-fill/bubbles-virtually/use-slot.d.ts.map +1 -1
  325. package/build-types/slot-fill/fill.d.ts.map +1 -1
  326. package/build-types/slot-fill/index.d.ts +5 -12
  327. package/build-types/slot-fill/index.d.ts.map +1 -1
  328. package/build-types/slot-fill/provider.d.ts.map +1 -1
  329. package/build-types/slot-fill/slot.d.ts +1 -1
  330. package/build-types/slot-fill/slot.d.ts.map +1 -1
  331. package/build-types/slot-fill/types.d.ts +15 -18
  332. package/build-types/slot-fill/types.d.ts.map +1 -1
  333. package/build-types/slot-fill/use-slot.d.ts +1 -1
  334. package/build-types/slot-fill/use-slot.d.ts.map +1 -1
  335. package/build-types/snackbar/index.d.ts.map +1 -1
  336. package/build-types/snackbar/stories/index.story.d.ts.map +1 -1
  337. package/build-types/snackbar/stories/list.story.d.ts.map +1 -1
  338. package/build-types/spinner/stories/index.story.d.ts.map +1 -1
  339. package/build-types/tabs/tablist.d.ts.map +1 -1
  340. package/build-types/text/stories/index.story.d.ts.map +1 -1
  341. package/build-types/text-control/index.d.ts +1 -0
  342. package/build-types/text-control/index.d.ts.map +1 -1
  343. package/build-types/text-control/stories/index.story.d.ts.map +1 -1
  344. package/build-types/text-highlight/stories/index.story.d.ts.map +1 -1
  345. package/build-types/textarea-control/stories/index.story.d.ts.map +1 -1
  346. package/build-types/tip/stories/index.story.d.ts.map +1 -1
  347. package/build-types/toggle-control/stories/index.story.d.ts.map +1 -1
  348. package/build-types/toggle-group-control/stories/index.story.d.ts.map +1 -1
  349. package/build-types/toggle-group-control/toggle-group-control/component.d.ts +2 -0
  350. package/build-types/toggle-group-control/toggle-group-control/component.d.ts.map +1 -1
  351. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts +1 -0
  352. package/build-types/toggle-group-control/toggle-group-control-option/component.d.ts.map +1 -1
  353. package/build-types/toggle-group-control/toggle-group-control-option-icon/component.d.ts +1 -1
  354. package/build-types/toggle-group-control/types.d.ts +7 -0
  355. package/build-types/toggle-group-control/types.d.ts.map +1 -1
  356. package/build-types/tools-panel/stories/index.story.d.ts.map +1 -1
  357. package/build-types/tooltip/stories/index.story.d.ts.map +1 -1
  358. package/build-types/tree-grid/stories/index.story.d.ts.map +1 -1
  359. package/build-types/tree-select/stories/index.story.d.ts.map +1 -1
  360. package/build-types/truncate/stories/index.story.d.ts.map +1 -1
  361. package/build-types/unit-control/stories/index.story.d.ts.map +1 -1
  362. package/build-types/utils/deprecated-36px-size.d.ts +3 -2
  363. package/build-types/utils/deprecated-36px-size.d.ts.map +1 -1
  364. package/build-types/v-stack/stories/index.story.d.ts.map +1 -1
  365. package/package.json +21 -21
  366. package/src/autocomplete/autocompleter-ui.tsx +1 -0
  367. package/src/base-control/stories/index.story.tsx +2 -1
  368. package/src/border-box-control/border-box-control/component.tsx +1 -0
  369. package/src/border-box-control/border-box-control-split-controls/component.tsx +1 -0
  370. package/src/border-control/border-control/component.tsx +1 -0
  371. package/src/border-control/border-control/hook.ts +2 -0
  372. package/src/border-control/border-control-dropdown/component.tsx +1 -1
  373. package/src/border-control/types.ts +7 -0
  374. package/src/box-control/all-input-control.tsx +1 -0
  375. package/src/box-control/axial-input-controls.tsx +1 -0
  376. package/src/box-control/input-controls.tsx +1 -0
  377. package/src/checkbox-control/stories/index.story.tsx +2 -1
  378. package/src/circular-option-picker/stories/index.story.tsx +2 -1
  379. package/src/color-indicator/stories/index.story.tsx +2 -1
  380. package/src/color-palette/index.tsx +5 -1
  381. package/src/color-palette/stories/index.story.tsx +2 -1
  382. package/src/color-picker/color-copy-button.tsx +8 -10
  383. package/src/color-picker/component.tsx +1 -0
  384. package/src/color-picker/stories/index.story.tsx +2 -1
  385. package/src/color-picker/styles.ts +0 -13
  386. package/src/combobox-control/README.md +1 -0
  387. package/src/combobox-control/index.tsx +19 -13
  388. package/src/combobox-control/stories/index.story.tsx +3 -1
  389. package/src/combobox-control/style.scss +0 -6
  390. package/src/combobox-control/test/index.tsx +7 -1
  391. package/src/composite/hover.tsx +1 -1
  392. package/src/composite/typeahead.tsx +3 -1
  393. package/src/confirm-dialog/stories/index.story.tsx +2 -1
  394. package/src/custom-gradient-picker/stories/index.story.tsx +2 -1
  395. package/src/custom-select-control/stories/index.story.tsx +2 -1
  396. package/src/custom-select-control-v2/stories/index.story.tsx +2 -1
  397. package/src/dashicon/types.ts +0 -2
  398. package/src/date-time/stories/date-time.story.tsx +2 -1
  399. package/src/date-time/stories/date.story.tsx +2 -1
  400. package/src/date-time/stories/time.story.tsx +2 -1
  401. package/src/dimension-control/README.md +1 -0
  402. package/src/dimension-control/index.tsx +8 -0
  403. package/src/dimension-control/stories/index.story.tsx +1 -0
  404. package/src/dimension-control/test/__snapshots__/index.test.js.snap +24 -24
  405. package/src/dimension-control/test/index.test.js +7 -1
  406. package/src/disabled/README.md +9 -7
  407. package/src/disabled/index.tsx +8 -1
  408. package/src/disabled/stories/index.story.tsx +1 -0
  409. package/src/drop-zone/stories/index.story.tsx +2 -1
  410. package/src/dropdown/stories/index.story.tsx +2 -1
  411. package/src/dropdown-menu/stories/index.story.tsx +2 -1
  412. package/src/duotone-picker/duotone-picker.tsx +2 -0
  413. package/src/external-link/stories/index.story.tsx +2 -1
  414. package/src/font-size-picker/README.md +1 -0
  415. package/src/font-size-picker/font-size-picker-toggle-group.tsx +1 -0
  416. package/src/font-size-picker/index.tsx +8 -0
  417. package/src/font-size-picker/stories/index.story.tsx +1 -0
  418. package/src/font-size-picker/test/index.tsx +5 -1
  419. package/src/form-file-upload/index.tsx +13 -1
  420. package/src/form-file-upload/stories/index.story.tsx +2 -1
  421. package/src/form-token-field/stories/index.story.tsx +2 -1
  422. package/src/form-token-field/style.scss +8 -12
  423. package/src/form-token-field/token.tsx +1 -0
  424. package/src/gradient-picker/README.md +107 -69
  425. package/src/gradient-picker/docs-manifest.json +5 -0
  426. package/src/gradient-picker/index.tsx +34 -32
  427. package/src/gradient-picker/stories/index.story.tsx +2 -1
  428. package/src/gradient-picker/types.ts +3 -5
  429. package/src/guide/page-control.tsx +1 -0
  430. package/src/guide/style.scss +4 -6
  431. package/src/h-stack/stories/index.story.tsx +2 -1
  432. package/src/heading/stories/index.story.tsx +2 -1
  433. package/src/higher-order/with-constrained-tabbing/README.md +13 -3
  434. package/src/higher-order/with-focus-return/README.md +9 -2
  435. package/src/input-control/stories/index.story.tsx +2 -1
  436. package/src/menu/stories/index.story.tsx +2 -1
  437. package/src/menu/styles.ts +1 -1
  438. package/src/menu-group/stories/index.story.tsx +2 -1
  439. package/src/menu-item/index.tsx +1 -0
  440. package/src/menu-item/stories/index.story.tsx +2 -1
  441. package/src/menu-item/test/__snapshots__/index.js.snap +4 -4
  442. package/src/menu-items-choice/stories/index.story.tsx +2 -1
  443. package/src/modal/index.tsx +2 -2
  444. package/src/modal/stories/index.story.tsx +3 -2
  445. package/src/navigator/stories/index.story.tsx +2 -1
  446. package/src/notice/index.tsx +2 -0
  447. package/src/notice/stories/index.story.tsx +7 -2
  448. package/src/notice/test/__snapshots__/index.tsx.snap +4 -4
  449. package/src/number-control/stories/index.story.tsx +2 -1
  450. package/src/palette-edit/index.tsx +5 -0
  451. package/src/panel/body.tsx +1 -0
  452. package/src/placeholder/stories/index.story.tsx +1 -0
  453. package/src/popover/index.tsx +3 -0
  454. package/src/popover/stories/index.story.tsx +2 -1
  455. package/src/private-apis.ts +0 -2
  456. package/src/progress-bar/stories/index.story.tsx +2 -1
  457. package/src/radio-control/stories/index.story.tsx +2 -1
  458. package/src/radio-group/README.md +8 -8
  459. package/src/radio-group/radio.tsx +7 -0
  460. package/src/radio-group/stories/index.story.tsx +16 -4
  461. package/src/radio-group/types.ts +6 -1
  462. package/src/range-control/README.md +4 -3
  463. package/src/range-control/index.tsx +11 -0
  464. package/src/range-control/stories/index.story.tsx +9 -1
  465. package/src/range-control/test/index.tsx +7 -1
  466. package/src/range-control/types.ts +7 -0
  467. package/src/responsive-wrapper/stories/index.story.tsx +2 -1
  468. package/src/search-control/stories/index.story.tsx +2 -1
  469. package/src/select-control/stories/index.story.tsx +2 -1
  470. package/src/slot-fill/README.md +26 -15
  471. package/src/slot-fill/bubbles-virtually/fill.tsx +18 -28
  472. package/src/slot-fill/bubbles-virtually/slot-fill-provider.tsx +26 -16
  473. package/src/slot-fill/bubbles-virtually/slot.tsx +13 -9
  474. package/src/slot-fill/bubbles-virtually/use-slot.ts +3 -26
  475. package/src/slot-fill/fill.ts +7 -22
  476. package/src/slot-fill/index.tsx +5 -7
  477. package/src/slot-fill/provider.tsx +8 -17
  478. package/src/slot-fill/slot.tsx +48 -85
  479. package/src/slot-fill/types.ts +14 -51
  480. package/src/snackbar/index.tsx +2 -1
  481. package/src/snackbar/stories/index.story.tsx +2 -1
  482. package/src/snackbar/stories/list.story.tsx +2 -1
  483. package/src/snackbar/style.scss +7 -16
  484. package/src/spinner/stories/index.story.tsx +2 -1
  485. package/src/tabs/tablist.tsx +13 -2
  486. package/src/text/stories/index.story.tsx +2 -1
  487. package/src/text-control/README.md +1 -0
  488. package/src/text-control/index.tsx +8 -0
  489. package/src/text-control/stories/index.story.tsx +3 -1
  490. package/src/text-control/test/text-control.tsx +7 -1
  491. package/src/text-highlight/stories/index.story.tsx +2 -1
  492. package/src/textarea-control/stories/index.story.tsx +2 -1
  493. package/src/tip/stories/index.story.tsx +2 -1
  494. package/src/toggle-control/stories/index.story.tsx +2 -1
  495. package/src/toggle-group-control/stories/index.story.tsx +3 -1
  496. package/src/toggle-group-control/test/__snapshots__/index.tsx.snap +12 -12
  497. package/src/toggle-group-control/test/index.tsx +7 -1
  498. package/src/toggle-group-control/toggle-group-control/README.md +2 -1
  499. package/src/toggle-group-control/toggle-group-control/component.tsx +11 -1
  500. package/src/toggle-group-control/toggle-group-control-option/README.md +1 -1
  501. package/src/toggle-group-control/toggle-group-control-option/component.tsx +1 -0
  502. package/src/toggle-group-control/toggle-group-control-option-icon/README.md +1 -1
  503. package/src/toggle-group-control/toggle-group-control-option-icon/component.tsx +1 -1
  504. package/src/toggle-group-control/types.ts +7 -0
  505. package/src/tools-panel/stories/index.story.tsx +3 -0
  506. package/src/tooltip/stories/index.story.tsx +2 -1
  507. package/src/tree-grid/stories/index.story.tsx +2 -1
  508. package/src/tree-select/stories/index.story.tsx +2 -1
  509. package/src/truncate/stories/index.story.tsx +2 -1
  510. package/src/unit-control/stories/index.story.tsx +2 -1
  511. package/src/utils/deprecated-36px-size.ts +8 -2
  512. package/src/v-stack/stories/index.story.tsx +2 -1
  513. package/src/visually-hidden/stories/index.story.tsx +1 -1
  514. package/tsconfig.tsbuildinfo +1 -1
@@ -1,18 +1,18 @@
1
- # Slot Fill
1
+ # Slot/Fill
2
2
 
3
- Slot and Fill are a pair of components which enable developers to render elsewhere in a React element tree, a pattern often referred to as "portal" rendering. It is a pattern for component extensibility, where a single Slot may be occupied by an indeterminate number of Fills elsewhere in the application.
3
+ `Slot` and `Fill` are a pair of components which enable developers to render React UI elsewhere in a React element tree, a pattern often referred to as "portal" rendering. It is a pattern for component extensibility, where a single `Slot` may be occupied by multiple `Fill`s rendered in different parts of the application.
4
4
 
5
- Slot Fill is heavily inspired by the [`react-slot-fill` library](https://github.com/camwest/react-slot-fill), but uses React's own portal rendering API.
5
+ Slot/Fill was originally inspired by the [`react-slot-fill` library](https://github.com/camwest/react-slot-fill).
6
6
 
7
7
  ## Usage
8
8
 
9
- At the root of your application, you must render a `SlotFillProvider` which coordinates Slot and Fill rendering.
9
+ At the root of your application, you must render a `SlotFillProvider` which coordinates `Slot` and `Fill` rendering.
10
10
 
11
- Then, render a Slot component anywhere in your application, giving it a name.
11
+ Then, render a `Slot` component anywhere in your application, giving it a `name`. The `name` is either a `string` or a symbol. Symbol names are useful for slots that are supposed to be private, accessible only to clients that have access to the symbol value.
12
12
 
13
- Any Fill will automatically occupy this Slot space, even if rendered elsewhere in the application.
13
+ Any `Fill` will render its UI in this `Slot` space, even if rendered elsewhere in the application.
14
14
 
15
- You can either use the Fill component directly, or a wrapper component type as in the below example to abstract the slot name from consumer awareness.
15
+ You can either use the `Fill` component directly, or create a wrapper component (as in the following example) to hide the slot name from the consumer.
16
16
 
17
17
  ```jsx
18
18
  import {
@@ -43,7 +43,7 @@ const MySlotFillProvider = () => {
43
43
  };
44
44
  ```
45
45
 
46
- There is also `createSlotFill` helper method which was created to simplify the process of matching the corresponding `Slot` and `Fill` components:
46
+ There is also the `createSlotFill` helper method which was created to simplify the process of matching the corresponding `Slot` and `Fill` components:
47
47
 
48
48
  ```jsx
49
49
  const { Fill, Slot } = createSlotFill( 'Toolbar' );
@@ -59,18 +59,27 @@ const Toolbar = () => (
59
59
 
60
60
  ## Props
61
61
 
62
- The `SlotFillProvider` component does not accept any props.
62
+ The `SlotFillProvider` component does not accept any props (except `children`).
63
63
 
64
64
  Both `Slot` and `Fill` accept a `name` string prop, where a `Slot` with a given `name` will render the `children` of any associated `Fill`s.
65
65
 
66
- `Slot` accepts a `bubblesVirtually` prop which changes the event bubbling behaviour:
66
+ `Slot` accepts a `bubblesVirtually` prop which changes the method how the `Fill` children are rendered. With `bubblesVirtually`, the `Fill` is rendered using a React portal. That affects the event bubbling and React context propagation behaviour:
67
67
 
68
- - By default, events will bubble to their parents on the DOM hierarchy (native event bubbling)
69
- - If `bubblesVirtually` is set to true, events will bubble to their virtual parent in the React elements hierarchy instead.
68
+ ### `bubblesVirtually=false`
70
69
 
71
- `Slot` with `bubblesVirtually` set to true also accept optional `className` and `style` props to add to the slot container.
70
+ - events will bubble to their parents on the DOM hierarchy (native event bubbling)
71
+ - the React elements inside the `Fill` will be rendered with React context of the `Slot`
72
+ - renders the `Fill` elements directly, inside a `Fragment`, with no wrapper DOM element
72
73
 
73
- `Slot` **without** `bubblesVirtually` accepts an optional `children` function prop, which takes `fills` as a param. It allows you to perform additional processing and wrap `fills` conditionally.
74
+ ### `bubblesVirtually=true`
75
+
76
+ - events will bubble to their virtual (React) parent in the React elements hierarchy
77
+ - the React elements inside the `Fill` will keep the React context of the `Fill` and its parents
78
+ - renders a wrapper DOM element inside which the `Fill` elements are rendered (used as an argument for React `createPortal`)
79
+
80
+ `Slot` with `bubblesVirtually=true` renders a wrapper DOM element (a `div` by default) and accepts additional props that customize this element, like `className` or `style`. You can also replace the `div` with another element by passing an `as` prop.
81
+
82
+ `Slot` **without** `bubblesVirtually` accepts an optional `children` prop, which is a function that receives `fills` array as a param. It allows you to perform additional processing: render a placeholder when there are no fills, or render a wrapper only when there are fills.
74
83
 
75
84
  _Example_:
76
85
 
@@ -90,7 +99,9 @@ const Toolbar = ( { isMobile } ) => (
90
99
  );
91
100
  ```
92
101
 
93
- Props can also be passed from a `Slot` to a `Fill` by using the prop `fillProps` on the `Slot`:
102
+ Additional information (props) can also be passed from a `Slot` to a `Fill` by a combination of:
103
+ 1. Adding a `fillProps` prop to the `Slot`.
104
+ 2. Passing a function as `children` to the `Fill`. This function will receive the `fillProps` as an argument.
94
105
 
95
106
  ```jsx
96
107
  const { Fill, Slot } = createSlotFill( 'Toolbar' );
@@ -1,50 +1,40 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useRef, useState, useEffect, createPortal } from '@wordpress/element';
4
+ import { useObservableValue } from '@wordpress/compose';
5
+ import {
6
+ useContext,
7
+ useReducer,
8
+ useRef,
9
+ useEffect,
10
+ createPortal,
11
+ } from '@wordpress/element';
5
12
 
6
13
  /**
7
14
  * Internal dependencies
8
15
  */
9
- import useSlot from './use-slot';
16
+ import SlotFillContext from './slot-fill-context';
10
17
  import StyleProvider from '../../style-provider';
11
18
  import type { FillComponentProps } from '../types';
12
19
 
13
- function useForceUpdate() {
14
- const [ , setState ] = useState( {} );
15
- const mountedRef = useRef( true );
16
-
17
- useEffect( () => {
18
- mountedRef.current = true;
19
- return () => {
20
- mountedRef.current = false;
21
- };
22
- }, [] );
23
-
24
- return () => {
25
- if ( mountedRef.current ) {
26
- setState( {} );
27
- }
28
- };
29
- }
30
-
31
- export default function Fill( props: FillComponentProps ) {
32
- const { name, children } = props;
33
- const { registerFill, unregisterFill, ...slot } = useSlot( name );
34
- const rerender = useForceUpdate();
20
+ export default function Fill( { name, children }: FillComponentProps ) {
21
+ const registry = useContext( SlotFillContext );
22
+ const slot = useObservableValue( registry.slots, name );
23
+ const [ , rerender ] = useReducer( () => [], [] );
35
24
  const ref = useRef( { rerender } );
36
25
 
37
26
  useEffect( () => {
38
27
  // We register fills so we can keep track of their existence.
39
28
  // Some Slot implementations need to know if there're already fills
40
29
  // registered so they can choose to render themselves or not.
41
- registerFill( ref );
30
+ const refValue = ref.current;
31
+ registry.registerFill( name, refValue );
42
32
  return () => {
43
- unregisterFill( ref );
33
+ registry.unregisterFill( name, refValue );
44
34
  };
45
- }, [ registerFill, unregisterFill ] );
35
+ }, [ registry, name ] );
46
36
 
47
- if ( ! slot.ref || ! slot.ref.current ) {
37
+ if ( ! slot || ! slot.ref.current ) {
48
38
  return null;
49
39
  }
50
40
 
@@ -34,15 +34,23 @@ function createSlotRegistry(): SlotFillBubblesVirtuallyContext {
34
34
 
35
35
  const unregisterSlot: SlotFillBubblesVirtuallyContext[ 'unregisterSlot' ] =
36
36
  ( name, ref ) => {
37
+ const slot = slots.get( name );
38
+ if ( ! slot ) {
39
+ return;
40
+ }
41
+
37
42
  // Make sure we're not unregistering a slot registered by another element
38
43
  // See https://github.com/WordPress/gutenberg/pull/19242#issuecomment-590295412
39
- if ( slots.get( name )?.ref === ref ) {
40
- slots.delete( name );
44
+ if ( slot.ref !== ref ) {
45
+ return;
41
46
  }
47
+
48
+ slots.delete( name );
42
49
  };
43
50
 
44
51
  const updateSlot: SlotFillBubblesVirtuallyContext[ 'updateSlot' ] = (
45
52
  name,
53
+ ref,
46
54
  fillProps
47
55
  ) => {
48
56
  const slot = slots.get( name );
@@ -50,6 +58,10 @@ function createSlotRegistry(): SlotFillBubblesVirtuallyContext {
50
58
  return;
51
59
  }
52
60
 
61
+ if ( slot.ref !== ref ) {
62
+ return;
63
+ }
64
+
53
65
  if ( isShallowEqual( slot.fillProps, fillProps ) ) {
54
66
  return;
55
67
  }
@@ -58,7 +70,7 @@ function createSlotRegistry(): SlotFillBubblesVirtuallyContext {
58
70
  const slotFills = fills.get( name );
59
71
  if ( slotFills ) {
60
72
  // Force update fills.
61
- slotFills.forEach( ( fill ) => fill.current.rerender() );
73
+ slotFills.forEach( ( fill ) => fill.rerender() );
62
74
  }
63
75
  };
64
76
 
@@ -69,20 +81,18 @@ function createSlotRegistry(): SlotFillBubblesVirtuallyContext {
69
81
  fills.set( name, [ ...( fills.get( name ) || [] ), ref ] );
70
82
  };
71
83
 
72
- const unregisterFill: SlotFillBubblesVirtuallyContext[ 'registerFill' ] = (
73
- name,
74
- ref
75
- ) => {
76
- const fillsForName = fills.get( name );
77
- if ( ! fillsForName ) {
78
- return;
79
- }
84
+ const unregisterFill: SlotFillBubblesVirtuallyContext[ 'unregisterFill' ] =
85
+ ( name, ref ) => {
86
+ const fillsForName = fills.get( name );
87
+ if ( ! fillsForName ) {
88
+ return;
89
+ }
80
90
 
81
- fills.set(
82
- name,
83
- fillsForName.filter( ( fillRef ) => fillRef !== ref )
84
- );
85
- };
91
+ fills.set(
92
+ name,
93
+ fillsForName.filter( ( fillRef ) => fillRef !== ref )
94
+ );
95
+ };
86
96
 
87
97
  return {
88
98
  slots,
@@ -35,29 +35,33 @@ function Slot(
35
35
  as,
36
36
  // `children` is not allowed. However, if it is passed,
37
37
  // it will be displayed as is, so remove `children`.
38
- // @ts-ignore
39
38
  children,
40
39
  ...restProps
41
40
  } = props;
42
41
 
43
42
  const { registerSlot, unregisterSlot, ...registry } =
44
43
  useContext( SlotFillContext );
44
+
45
45
  const ref = useRef< HTMLElement >( null );
46
46
 
47
+ // We don't want to unregister and register the slot whenever
48
+ // `fillProps` change, which would cause the fill to be re-mounted. Instead,
49
+ // we can just update the slot (see hook below).
50
+ // For more context, see https://github.com/WordPress/gutenberg/pull/44403#discussion_r994415973
51
+ const fillPropsRef = useRef( fillProps );
52
+ useLayoutEffect( () => {
53
+ fillPropsRef.current = fillProps;
54
+ }, [ fillProps ] );
55
+
47
56
  useLayoutEffect( () => {
48
- registerSlot( name, ref, fillProps );
57
+ registerSlot( name, ref, fillPropsRef.current );
49
58
  return () => {
50
59
  unregisterSlot( name, ref );
51
60
  };
52
- // We don't want to unregister and register the slot whenever
53
- // `fillProps` change, which would cause the fill to be re-mounted. Instead,
54
- // we can just update the slot (see hook below).
55
- // For more context, see https://github.com/WordPress/gutenberg/pull/44403#discussion_r994415973
56
61
  }, [ registerSlot, unregisterSlot, name ] );
57
- // fillProps may be an update that interacts with the layout, so we
58
- // useLayoutEffect.
62
+
59
63
  useLayoutEffect( () => {
60
- registry.updateSlot( name, fillProps );
64
+ registry.updateSlot( name, ref, fillPropsRef.current );
61
65
  } );
62
66
 
63
67
  return (
@@ -1,40 +1,17 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import { useMemo, useContext } from '@wordpress/element';
4
+ import { useContext } from '@wordpress/element';
5
5
  import { useObservableValue } from '@wordpress/compose';
6
6
 
7
7
  /**
8
8
  * Internal dependencies
9
9
  */
10
10
  import SlotFillContext from './slot-fill-context';
11
- import type {
12
- SlotFillBubblesVirtuallyFillRef,
13
- SlotFillBubblesVirtuallySlotRef,
14
- FillProps,
15
- SlotKey,
16
- } from '../types';
11
+ import type { SlotKey } from '../types';
17
12
 
18
13
  export default function useSlot( name: SlotKey ) {
19
14
  const registry = useContext( SlotFillContext );
20
15
  const slot = useObservableValue( registry.slots, name );
21
-
22
- const api = useMemo(
23
- () => ( {
24
- updateSlot: ( fillProps: FillProps ) =>
25
- registry.updateSlot( name, fillProps ),
26
- unregisterSlot: ( ref: SlotFillBubblesVirtuallySlotRef ) =>
27
- registry.unregisterSlot( name, ref ),
28
- registerFill: ( ref: SlotFillBubblesVirtuallyFillRef ) =>
29
- registry.registerFill( name, ref ),
30
- unregisterFill: ( ref: SlotFillBubblesVirtuallyFillRef ) =>
31
- registry.unregisterFill( name, ref ),
32
- } ),
33
- [ name, registry ]
34
- );
35
-
36
- return {
37
- ...slot,
38
- ...api,
39
- };
16
+ return { ...slot };
40
17
  }
@@ -11,7 +11,7 @@ import useSlot from './use-slot';
11
11
  import type { FillComponentProps } from './types';
12
12
 
13
13
  export default function Fill( { name, children }: FillComponentProps ) {
14
- const { registerFill, unregisterFill } = useContext( SlotFillContext );
14
+ const registry = useContext( SlotFillContext );
15
15
  const slot = useSlot( name );
16
16
 
17
17
  const ref = useRef( {
@@ -21,32 +21,17 @@ export default function Fill( { name, children }: FillComponentProps ) {
21
21
 
22
22
  useLayoutEffect( () => {
23
23
  const refValue = ref.current;
24
- registerFill( name, refValue );
25
- return () => unregisterFill( name, refValue );
26
- // The useLayoutEffects here are written to fire at specific times, and introducing new dependencies could cause unexpected changes in behavior.
27
- // We'll leave them as-is until a more detailed investigation/refactor can be performed.
28
- }, [] );
24
+ refValue.name = name;
25
+ registry.registerFill( name, refValue );
26
+ return () => registry.unregisterFill( name, refValue );
27
+ }, [ registry, name ] );
29
28
 
30
29
  useLayoutEffect( () => {
31
30
  ref.current.children = children;
32
31
  if ( slot ) {
33
- slot.forceUpdate();
32
+ slot.rerender();
34
33
  }
35
- // The useLayoutEffects here are written to fire at specific times, and introducing new dependencies could cause unexpected changes in behavior.
36
- // We'll leave them as-is until a more detailed investigation/refactor can be performed.
37
- }, [ children ] );
38
-
39
- useLayoutEffect( () => {
40
- if ( name === ref.current.name ) {
41
- // Ignore initial effect.
42
- return;
43
- }
44
- unregisterFill( ref.current.name, ref.current );
45
- ref.current.name = name;
46
- registerFill( name, ref.current );
47
- // The useLayoutEffects here are written to fire at specific times, and introducing new dependencies could cause unexpected changes in behavior.
48
- // We'll leave them as-is until a more detailed investigation/refactor can be performed.
49
- }, [ name ] );
34
+ }, [ slot, children ] );
50
35
 
51
36
  return null;
52
37
  }
@@ -84,17 +84,15 @@ export function createSlotFill( key: SlotKey ) {
84
84
  props: DistributiveOmit< SlotComponentProps, 'name' >
85
85
  ) => <Slot name={ key } { ...props } />;
86
86
  SlotComponent.displayName = `${ baseName }Slot`;
87
+ /**
88
+ * @deprecated 6.8.0
89
+ * Please use `slotFill.name` instead of `slotFill.Slot.__unstableName`.
90
+ */
87
91
  SlotComponent.__unstableName = key;
88
92
 
89
93
  return {
94
+ name: key,
90
95
  Fill: FillComponent,
91
96
  Slot: SlotComponent,
92
97
  };
93
98
  }
94
-
95
- export const createPrivateSlotFill = ( name: string ) => {
96
- const privateKey = Symbol( name );
97
- const privateSlotFill = createSlotFill( privateKey );
98
-
99
- return { privateKey, ...privateSlotFill };
100
- };
@@ -1,7 +1,6 @@
1
1
  /**
2
2
  * WordPress dependencies
3
3
  */
4
- import type { Component } from '@wordpress/element';
5
4
  import { useState } from '@wordpress/element';
6
5
 
7
6
  /**
@@ -11,20 +10,17 @@ import SlotFillContext from './context';
11
10
  import type {
12
11
  FillComponentProps,
13
12
  BaseSlotFillContext,
14
- BaseSlotComponentProps,
15
13
  SlotFillProviderProps,
16
14
  SlotKey,
15
+ Rerenderable,
17
16
  } from './types';
18
17
 
19
18
  function createSlotRegistry(): BaseSlotFillContext {
20
- const slots: Record< SlotKey, Component< BaseSlotComponentProps > > = {};
19
+ const slots: Record< SlotKey, Rerenderable > = {};
21
20
  const fills: Record< SlotKey, FillComponentProps[] > = {};
22
21
  let listeners: Array< () => void > = [];
23
22
 
24
- function registerSlot(
25
- name: SlotKey,
26
- slot: Component< BaseSlotComponentProps >
27
- ) {
23
+ function registerSlot( name: SlotKey, slot: Rerenderable ) {
28
24
  const previousSlot = slots[ name ];
29
25
  slots[ name ] = slot;
30
26
  triggerListeners();
@@ -38,7 +34,7 @@ function createSlotRegistry(): BaseSlotFillContext {
38
34
  // assigned into the instance, such that its own rendering of children
39
35
  // will be empty (the new Slot will subsume all fills for this name).
40
36
  if ( previousSlot ) {
41
- previousSlot.forceUpdate();
37
+ previousSlot.rerender();
42
38
  }
43
39
  }
44
40
 
@@ -47,10 +43,7 @@ function createSlotRegistry(): BaseSlotFillContext {
47
43
  forceUpdateSlot( name );
48
44
  }
49
45
 
50
- function unregisterSlot(
51
- name: SlotKey,
52
- instance: Component< BaseSlotComponentProps >
53
- ) {
46
+ function unregisterSlot( name: SlotKey, instance: Rerenderable ) {
54
47
  // If a previous instance of a Slot by this name unmounts, do nothing,
55
48
  // as the slot and its fills should only be removed for the current
56
49
  // known instance.
@@ -68,15 +61,13 @@ function createSlotRegistry(): BaseSlotFillContext {
68
61
  forceUpdateSlot( name );
69
62
  }
70
63
 
71
- function getSlot(
72
- name: SlotKey
73
- ): Component< BaseSlotComponentProps > | undefined {
64
+ function getSlot( name: SlotKey ): Rerenderable | undefined {
74
65
  return slots[ name ];
75
66
  }
76
67
 
77
68
  function getFills(
78
69
  name: SlotKey,
79
- slotInstance: Component< BaseSlotComponentProps >
70
+ slotInstance: Rerenderable
80
71
  ): FillComponentProps[] {
81
72
  // Fills should only be returned for the current instance of the slot
82
73
  // in which they occupy.
@@ -90,7 +81,7 @@ function createSlotRegistry(): BaseSlotFillContext {
90
81
  const slot = getSlot( name );
91
82
 
92
83
  if ( slot ) {
93
- slot.forceUpdate();
84
+ slot.rerender();
94
85
  }
95
86
  }
96
87
 
@@ -7,8 +7,11 @@ import type { ReactElement, ReactNode, Key } from 'react';
7
7
  * WordPress dependencies
8
8
  */
9
9
  import {
10
+ useContext,
11
+ useEffect,
12
+ useReducer,
13
+ useRef,
10
14
  Children,
11
- Component,
12
15
  cloneElement,
13
16
  isEmptyElement,
14
17
  } from '@wordpress/element';
@@ -17,7 +20,7 @@ import {
17
20
  * Internal dependencies
18
21
  */
19
22
  import SlotFillContext from './context';
20
- import type { BaseSlotComponentProps, SlotComponentProps } from './types';
23
+ import type { SlotComponentProps } from './types';
21
24
 
22
25
  /**
23
26
  * Whether the argument is a function.
@@ -29,90 +32,50 @@ function isFunction( maybeFunc: any ): maybeFunc is Function {
29
32
  return typeof maybeFunc === 'function';
30
33
  }
31
34
 
32
- class SlotComponent extends Component< BaseSlotComponentProps > {
33
- private isUnmounted: boolean;
34
-
35
- constructor( props: BaseSlotComponentProps ) {
36
- super( props );
37
-
38
- this.isUnmounted = false;
39
- }
40
-
41
- componentDidMount() {
42
- const { registerSlot } = this.props;
43
- this.isUnmounted = false;
44
- registerSlot( this.props.name, this );
45
- }
46
-
47
- componentWillUnmount() {
48
- const { unregisterSlot } = this.props;
49
- this.isUnmounted = true;
50
- unregisterSlot( this.props.name, this );
51
- }
52
-
53
- componentDidUpdate( prevProps: BaseSlotComponentProps ) {
54
- const { name, unregisterSlot, registerSlot } = this.props;
55
-
56
- if ( prevProps.name !== name ) {
57
- unregisterSlot( prevProps.name, this );
58
- registerSlot( name, this );
59
- }
60
- }
61
-
62
- forceUpdate() {
63
- if ( this.isUnmounted ) {
64
- return;
65
- }
66
- super.forceUpdate();
67
- }
68
-
69
- render() {
70
- const { children, name, fillProps = {}, getFills } = this.props;
71
- const fills: ReactNode[] = ( getFills( name, this ) ?? [] )
72
- .map( ( fill ) => {
73
- const fillChildren = isFunction( fill.children )
74
- ? fill.children( fillProps )
75
- : fill.children;
76
- return Children.map( fillChildren, ( child, childIndex ) => {
77
- if ( ! child || typeof child === 'string' ) {
78
- return child;
79
- }
80
- let childKey: Key = childIndex;
81
- if (
82
- typeof child === 'object' &&
83
- 'key' in child &&
84
- child?.key
85
- ) {
86
- childKey = child.key;
87
- }
88
-
89
- return cloneElement( child as ReactElement, {
90
- key: childKey,
91
- } );
35
+ function Slot( props: Omit< SlotComponentProps, 'bubblesVirtually' > ) {
36
+ const registry = useContext( SlotFillContext );
37
+ const [ , rerender ] = useReducer( () => [], [] );
38
+ const ref = useRef( { rerender } );
39
+
40
+ const { name, children, fillProps = {} } = props;
41
+
42
+ useEffect( () => {
43
+ const refValue = ref.current;
44
+ registry.registerSlot( name, refValue );
45
+ return () => registry.unregisterSlot( name, refValue );
46
+ }, [ registry, name ] );
47
+
48
+ const fills: ReactNode[] = ( registry.getFills( name, ref.current ) ?? [] )
49
+ .map( ( fill ) => {
50
+ const fillChildren = isFunction( fill.children )
51
+ ? fill.children( fillProps )
52
+ : fill.children;
53
+ return Children.map( fillChildren, ( child, childIndex ) => {
54
+ if ( ! child || typeof child === 'string' ) {
55
+ return child;
56
+ }
57
+ let childKey: Key = childIndex;
58
+ if (
59
+ typeof child === 'object' &&
60
+ 'key' in child &&
61
+ child?.key
62
+ ) {
63
+ childKey = child.key;
64
+ }
65
+
66
+ return cloneElement( child as ReactElement, {
67
+ key: childKey,
92
68
  } );
93
- } )
94
- .filter(
95
- // In some cases fills are rendered only when some conditions apply.
96
- // This ensures that we only use non-empty fills when rendering, i.e.,
97
- // it allows us to render wrappers only when the fills are actually present.
98
- ( element ) => ! isEmptyElement( element )
99
- );
100
-
101
- return <>{ isFunction( children ) ? children( fills ) : fills }</>;
102
- }
69
+ } );
70
+ } )
71
+ .filter(
72
+ // In some cases fills are rendered only when some conditions apply.
73
+ // This ensures that we only use non-empty fills when rendering, i.e.,
74
+ // it allows us to render wrappers only when the fills are actually present.
75
+ ( element ) => ! isEmptyElement( element )
76
+ );
77
+
78
+ return <>{ isFunction( children ) ? children( fills ) : fills }</>;
103
79
  }
104
80
 
105
- const Slot = ( props: Omit< SlotComponentProps, 'bubblesVirtually' > ) => (
106
- <SlotFillContext.Consumer>
107
- { ( { registerSlot, unregisterSlot, getFills } ) => (
108
- <SlotComponent
109
- { ...props }
110
- registerSlot={ registerSlot }
111
- unregisterSlot={ unregisterSlot }
112
- getFills={ getFills }
113
- />
114
- ) }
115
- </SlotFillContext.Consumer>
116
- );
117
-
118
81
  export default Slot;