@plaudit/gutenberg-api-extensions 2.79.0 → 2.80.1

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 (489) hide show
  1. package/dist/blocks/MoveError.js +10 -0
  2. package/dist/blocks/MoveError.js.map +1 -0
  3. package/{build → dist}/blocks/PathError.js +7 -3
  4. package/dist/blocks/PathError.js.map +1 -0
  5. package/{build → dist}/blocks/SNPFlexibleItemsListComponent.d.ts +1 -1
  6. package/dist/blocks/SNPFlexibleItemsListComponent.js +18 -0
  7. package/dist/blocks/SNPFlexibleItemsListComponent.js.map +1 -0
  8. package/{build → dist}/blocks/SNPGroupComponent.d.ts +2 -2
  9. package/dist/blocks/SNPGroupComponent.js +20 -0
  10. package/dist/blocks/SNPGroupComponent.js.map +1 -0
  11. package/{build → dist}/blocks/SNPListComponent.d.ts +1 -1
  12. package/dist/blocks/SNPListComponent.js +18 -0
  13. package/dist/blocks/SNPListComponent.js.map +1 -0
  14. package/dist/blocks/SNPTreeContext.js +14 -0
  15. package/dist/blocks/SNPTreeContext.js.map +1 -0
  16. package/dist/blocks/basic-custom-block-bindings-support.js +157 -0
  17. package/dist/blocks/basic-custom-block-bindings-support.js.map +1 -0
  18. package/dist/blocks/common-native-property-constructors.d.ts +13 -0
  19. package/{build → dist}/blocks/common-native-property-constructors.js +105 -151
  20. package/dist/blocks/common-native-property-constructors.js.map +1 -0
  21. package/{build → dist}/blocks/conditions.js +12 -7
  22. package/dist/blocks/conditions.js.map +1 -0
  23. package/dist/blocks/csnp-api.d.ts +166 -0
  24. package/dist/blocks/csnp-api.js +74 -0
  25. package/dist/blocks/csnp-api.js.map +1 -0
  26. package/{build → dist}/blocks/data-controller-manager.js +4 -1
  27. package/dist/blocks/data-controller-manager.js.map +1 -0
  28. package/{build → dist}/blocks/data-controller.js +74 -70
  29. package/dist/blocks/data-controller.js.map +1 -0
  30. package/{build → dist}/blocks/hooks/built-in-suspendable-option-protocols/select.js +14 -11
  31. package/dist/blocks/hooks/built-in-suspendable-option-protocols/select.js.map +1 -0
  32. package/{build → dist}/blocks/hooks/built-in-suspendable-option-protocols/settings.js +9 -6
  33. package/dist/blocks/hooks/built-in-suspendable-option-protocols/settings.js.map +1 -0
  34. package/{build → dist}/blocks/hooks/useSuspendableOptions.d.ts +1 -1
  35. package/{build → dist}/blocks/hooks/useSuspendableOptions.js +30 -23
  36. package/dist/blocks/hooks/useSuspendableOptions.js.map +1 -0
  37. package/dist/blocks/index.js +35 -0
  38. package/dist/blocks/index.js.map +1 -0
  39. package/{build → dist}/blocks/layered-styles-api.d.ts +2 -2
  40. package/{build → dist}/blocks/layered-styles-api.js +10 -6
  41. package/dist/blocks/layered-styles-api.js.map +1 -0
  42. package/{build → dist}/blocks/layered-styles-impl.js +14 -9
  43. package/dist/blocks/layered-styles-impl.js.map +1 -0
  44. package/{build → dist}/blocks/layout/LaidOutProperty.d.ts +1 -2
  45. package/dist/blocks/layout/LaidOutProperty.js +47 -0
  46. package/dist/blocks/layout/LaidOutProperty.js.map +1 -0
  47. package/dist/blocks/layout/LaidOutPropertyRow.js +15 -0
  48. package/dist/blocks/layout/LaidOutPropertyRow.js.map +1 -0
  49. package/{build → dist}/blocks/layout/NodeContext.d.ts +2 -2
  50. package/dist/blocks/layout/NodeContext.js +44 -0
  51. package/dist/blocks/layout/NodeContext.js.map +1 -0
  52. package/dist/blocks/layout/PanelRoot.js +29 -0
  53. package/dist/blocks/layout/PanelRoot.js.map +1 -0
  54. package/{build → dist}/blocks/layout/TabsRoot.js +16 -13
  55. package/dist/blocks/layout/TabsRoot.js.map +1 -0
  56. package/dist/blocks/layout/ToolsPanelContext.js +23 -0
  57. package/dist/blocks/layout/ToolsPanelContext.js.map +1 -0
  58. package/dist/blocks/shared-exportable-types.js +3 -0
  59. package/dist/blocks/shared-internal-types.js +3 -0
  60. package/{build → dist}/blocks/simple-block.d.ts +1 -1
  61. package/dist/blocks/simple-block.js +45 -0
  62. package/dist/blocks/simple-block.js.map +1 -0
  63. package/{build → dist}/blocks/simple-native-property-api.d.ts +1 -1
  64. package/{build → dist}/blocks/simple-native-property-api.js +16 -10
  65. package/dist/blocks/simple-native-property-api.js.map +1 -0
  66. package/{build → dist}/blocks/simple-native-property-impl.js +60 -55
  67. package/dist/blocks/simple-native-property-impl.js.map +1 -0
  68. package/{build → dist}/blocks/simple-native-property-internal-shared.js +6 -2
  69. package/dist/blocks/simple-native-property-internal-shared.js.map +1 -0
  70. package/{build → dist}/blocks/snp-api.d.ts +1 -0
  71. package/dist/blocks/snp-api.js +7 -0
  72. package/dist/blocks/snp-api.js.map +1 -0
  73. package/{build → dist}/blocks/snp-data-store.js +8 -4
  74. package/dist/blocks/snp-data-store.js.map +1 -0
  75. package/{build → dist}/blocks/utilities.d.ts +1 -1
  76. package/dist/blocks/utilities.js +79 -0
  77. package/dist/blocks/utilities.js.map +1 -0
  78. package/{build → dist}/controls/AsynchronousFormTokenField.d.ts +1 -1
  79. package/dist/controls/AsynchronousFormTokenField.js +36 -0
  80. package/dist/controls/AsynchronousFormTokenField.js.map +1 -0
  81. package/{build → dist}/controls/BaseSortableItemsControl.d.ts +3 -3
  82. package/dist/controls/BaseSortableItemsControl.js +25 -0
  83. package/dist/controls/BaseSortableItemsControl.js.map +1 -0
  84. package/{build → dist}/controls/ExtendedFormTokenField.d.ts +3 -3
  85. package/dist/controls/ExtendedFormTokenField.js +64 -0
  86. package/dist/controls/ExtendedFormTokenField.js.map +1 -0
  87. package/dist/controls/ExtendedPostPicker.js +28 -0
  88. package/dist/controls/ExtendedPostPicker.js.map +1 -0
  89. package/dist/controls/ExtendedRadioControl.d.ts +12 -0
  90. package/dist/controls/ExtendedRadioControl.js +33 -0
  91. package/dist/controls/ExtendedRadioControl.js.map +1 -0
  92. package/{build → dist}/controls/ExtendedTaxonomyPicker.d.ts +1 -1
  93. package/dist/controls/ExtendedTaxonomyPicker.js +71 -0
  94. package/dist/controls/ExtendedTaxonomyPicker.js.map +1 -0
  95. package/{build → dist}/controls/ExtendedTermPicker.d.ts +1 -1
  96. package/dist/controls/ExtendedTermPicker.js +33 -0
  97. package/dist/controls/ExtendedTermPicker.js.map +1 -0
  98. package/dist/controls/ExtendedTextareaControl.d.ts +12 -0
  99. package/{build → dist}/controls/ExtendedTextareaControl.js +15 -12
  100. package/dist/controls/ExtendedTextareaControl.js.map +1 -0
  101. package/dist/controls/ExtendedUserPicker.js +28 -0
  102. package/dist/controls/ExtendedUserPicker.js.map +1 -0
  103. package/{build → dist}/controls/FullSizeToggleControl.d.ts +6 -4
  104. package/dist/controls/FullSizeToggleControl.js +110 -0
  105. package/dist/controls/FullSizeToggleControl.js.map +1 -0
  106. package/{build → dist}/controls/ImageControl.d.ts +1 -1
  107. package/dist/controls/ImageControl.js +81 -0
  108. package/dist/controls/ImageControl.js.map +1 -0
  109. package/{build → dist}/controls/InspectorPanel.d.ts +4 -3
  110. package/dist/controls/InspectorPanel.js +29 -0
  111. package/dist/controls/InspectorPanel.js.map +1 -0
  112. package/{build → dist}/controls/LazySuggestionsComboboxControl.d.ts +5 -1
  113. package/dist/controls/LazySuggestionsComboboxControl.js +32 -0
  114. package/dist/controls/LazySuggestionsComboboxControl.js.map +1 -0
  115. package/{build → dist}/controls/MultiSelectControl.d.ts +1 -1
  116. package/dist/controls/MultiSelectControl.js +33 -0
  117. package/dist/controls/MultiSelectControl.js.map +1 -0
  118. package/{build → dist}/controls/PickOne.d.ts +1 -1
  119. package/dist/controls/PickOne.js +54 -0
  120. package/dist/controls/PickOne.js.map +1 -0
  121. package/{build → dist}/controls/PromisableComponent.d.ts +2 -2
  122. package/{build → dist}/controls/PromisableComponent.js +14 -11
  123. package/dist/controls/PromisableComponent.js.map +1 -0
  124. package/{build → dist}/controls/ProperLinkControl.d.ts +1 -1
  125. package/dist/controls/ProperLinkControl.js +59 -0
  126. package/dist/controls/ProperLinkControl.js.map +1 -0
  127. package/dist/controls/SimpleToggle.js +11 -0
  128. package/dist/controls/SimpleToggle.js.map +1 -0
  129. package/dist/controls/SortableFlexibleItemsControl.js +18 -0
  130. package/dist/controls/SortableFlexibleItemsControl.js.map +1 -0
  131. package/dist/controls/SortableItemsControl.js +15 -0
  132. package/dist/controls/SortableItemsControl.js.map +1 -0
  133. package/{build → dist}/controls/basicNumericallyIdedItemPicker.d.ts +1 -1
  134. package/dist/controls/basicNumericallyIdedItemPicker.js +37 -0
  135. package/dist/controls/basicNumericallyIdedItemPicker.js.map +1 -0
  136. package/{build → dist}/controls/hooks/useImprovedTokenManager.d.ts +7 -5
  137. package/{build → dist}/controls/hooks/useImprovedTokenManager.js +21 -15
  138. package/dist/controls/hooks/useImprovedTokenManager.js.map +1 -0
  139. package/{build → dist}/controls/hooks/useMultiSingleConversionLayer.d.ts +1 -1
  140. package/dist/controls/hooks/useMultiSingleConversionLayer.js +14 -0
  141. package/dist/controls/hooks/useMultiSingleConversionLayer.js.map +1 -0
  142. package/dist/controls/hooks/useNonRenderingCounter.js +9 -0
  143. package/dist/controls/hooks/useNonRenderingCounter.js.map +1 -0
  144. package/{build → dist}/controls/hooks/useOutputMemoizingFilter.js +7 -4
  145. package/dist/controls/hooks/useOutputMemoizingFilter.js.map +1 -0
  146. package/{build → dist}/controls/hooks/useSortableItemsModel.js +14 -11
  147. package/dist/controls/hooks/useSortableItemsModel.js.map +1 -0
  148. package/{build → dist}/controls/hooks/useSuggestions.js +16 -13
  149. package/dist/controls/hooks/useSuggestions.js.map +1 -0
  150. package/{build → dist}/controls/hooks/useTokenManager.d.ts +5 -3
  151. package/{build → dist}/controls/hooks/useTokenManager.js +37 -34
  152. package/dist/controls/hooks/useTokenManager.js.map +1 -0
  153. package/dist/controls/index.js +41 -0
  154. package/dist/controls/index.js.map +1 -0
  155. package/{build → dist}/controls/shared.js +18 -8
  156. package/dist/controls/shared.js.map +1 -0
  157. package/dist/controls/types.js +3 -0
  158. package/dist/editor/post-featured-image.js +125 -0
  159. package/dist/editor/post-featured-image.js.map +1 -0
  160. package/dist/editor/simple-gutenberg-endpoints-api.js +26 -0
  161. package/dist/editor/simple-gutenberg-endpoints-api.js.map +1 -0
  162. package/{build → dist}/editor/simple-gutenberg-endpoints-impl.js +24 -17
  163. package/dist/editor/simple-gutenberg-endpoints-impl.js.map +1 -0
  164. package/dist/index.js +39 -0
  165. package/dist/index.js.map +1 -0
  166. package/dist/lib/gutenberg-api-extensions-state/custom-block-bindings-support-logic.js +27 -0
  167. package/dist/lib/gutenberg-api-extensions-state/custom-block-bindings-support-logic.js.map +1 -0
  168. package/{build → dist}/lib/gutenberg-api-extensions-state/general-logic.js +12 -8
  169. package/dist/lib/gutenberg-api-extensions-state/general-logic.js.map +1 -0
  170. package/{build → dist}/lib/gutenberg-api-extensions-state/layered-block-styles-logic.js +10 -6
  171. package/dist/lib/gutenberg-api-extensions-state/layered-block-styles-logic.js.map +1 -0
  172. package/{build → dist}/lib/gutenberg-api-extensions-state/snp-logic.js +33 -26
  173. package/dist/lib/gutenberg-api-extensions-state/snp-logic.js.map +1 -0
  174. package/{build → dist}/lib/gutenberg-api-extensions-state.d.ts +2 -2
  175. package/dist/lib/gutenberg-api-extensions-state.js +52 -0
  176. package/dist/lib/gutenberg-api-extensions-state.js.map +1 -0
  177. package/{build → dist}/lib/helpers.d.ts +3 -4
  178. package/{build → dist}/lib/helpers.js +13 -6
  179. package/dist/lib/helpers.js.map +1 -0
  180. package/dist/lib/plaudit-icons/column-1.js +6 -0
  181. package/dist/lib/plaudit-icons/column-1.js.map +1 -0
  182. package/dist/lib/plaudit-icons/column-2.js +6 -0
  183. package/dist/lib/plaudit-icons/column-2.js.map +1 -0
  184. package/dist/lib/plaudit-icons/column-3.js +6 -0
  185. package/dist/lib/plaudit-icons/column-3.js.map +1 -0
  186. package/dist/lib/plaudit-icons/placement-center.js +6 -0
  187. package/dist/lib/plaudit-icons/placement-center.js.map +1 -0
  188. package/dist/lib/plaudit-icons/placement-end.js +6 -0
  189. package/dist/lib/plaudit-icons/placement-end.js.map +1 -0
  190. package/dist/lib/plaudit-icons/placement-start.js +6 -0
  191. package/dist/lib/plaudit-icons/placement-start.js.map +1 -0
  192. package/dist/lib/plaudit-icons/placement-stretch.js +6 -0
  193. package/dist/lib/plaudit-icons/placement-stretch.js.map +1 -0
  194. package/dist/lib/plaudit-icons/plaudit-icon.js +6 -0
  195. package/dist/lib/plaudit-icons/plaudit-icon.js.map +1 -0
  196. package/dist/lib/plaudit-icons/reusable-block-marker.js +6 -0
  197. package/{build → dist}/lib/plaudit-icons/reusable-block-marker.js.map +1 -1
  198. package/dist/lib/plaudit-icons.js +29 -0
  199. package/dist/lib/plaudit-icons.js.map +1 -0
  200. package/{build → dist}/lib/suspense/promise-handlers.js +16 -7
  201. package/dist/lib/suspense/promise-handlers.js.map +1 -0
  202. package/{build → dist}/lib/suspense.d.ts +2 -2
  203. package/dist/lib/suspense.js +31 -0
  204. package/dist/lib/suspense.js.map +1 -0
  205. package/{build → dist}/lib/useful-types.d.ts +4 -1
  206. package/dist/lib/useful-types.js +11 -0
  207. package/dist/lib/useful-types.js.map +1 -0
  208. package/package.json +23 -31
  209. package/src/blocks/MoveError.ts +7 -0
  210. package/src/blocks/PathError.ts +18 -0
  211. package/src/blocks/SNPFlexibleItemsListComponent.tsx +30 -0
  212. package/src/blocks/SNPGroupComponent.tsx +38 -0
  213. package/src/blocks/SNPListComponent.tsx +25 -0
  214. package/src/blocks/SNPTreeContext.tsx +13 -0
  215. package/src/blocks/basic-custom-block-bindings-support.tsx +243 -0
  216. package/src/blocks/common-native-property-constructors.tsx +877 -0
  217. package/src/blocks/conditions.ts +260 -0
  218. package/src/blocks/csnp-api.ts +214 -0
  219. package/src/blocks/data-controller-manager.ts +50 -0
  220. package/src/blocks/data-controller.ts +736 -0
  221. package/src/blocks/hooks/built-in-suspendable-option-protocols/select.ts +51 -0
  222. package/src/blocks/hooks/built-in-suspendable-option-protocols/settings.ts +70 -0
  223. package/src/blocks/hooks/useSuspendableOptions.ts +123 -0
  224. package/src/blocks/index.ts +20 -0
  225. package/src/blocks/layered-styles-api.ts +142 -0
  226. package/src/blocks/layered-styles-impl.ts +94 -0
  227. package/src/blocks/layout/LaidOutProperty.tsx +72 -0
  228. package/src/blocks/layout/LaidOutPropertyRow.tsx +22 -0
  229. package/src/blocks/layout/NodeContext.tsx +54 -0
  230. package/src/blocks/layout/PanelRoot.tsx +33 -0
  231. package/src/blocks/layout/TabsRoot.tsx +56 -0
  232. package/src/blocks/layout/ToolsPanelContext.tsx +22 -0
  233. package/src/blocks/shared-exportable-types.ts +6 -0
  234. package/src/blocks/shared-internal-types.ts +18 -0
  235. package/src/blocks/simple-block.tsx +74 -0
  236. package/src/blocks/simple-native-property-api.ts +170 -0
  237. package/src/blocks/simple-native-property-impl.tsx +329 -0
  238. package/src/blocks/simple-native-property-internal-shared.ts +46 -0
  239. package/src/blocks/snp-api.ts +5 -0
  240. package/src/blocks/snp-data-store.ts +66 -0
  241. package/src/blocks/utilities.ts +80 -0
  242. package/src/controls/AsynchronousFormTokenField.tsx +85 -0
  243. package/src/controls/BaseSortableItemsControl.tsx +84 -0
  244. package/src/controls/ExtendedFormTokenField.tsx +120 -0
  245. package/src/controls/ExtendedPostPicker.ts +57 -0
  246. package/src/controls/ExtendedRadioControl.tsx +107 -0
  247. package/src/controls/ExtendedTaxonomyPicker.tsx +100 -0
  248. package/src/controls/ExtendedTermPicker.tsx +62 -0
  249. package/src/controls/ExtendedTextareaControl.tsx +65 -0
  250. package/src/controls/ExtendedUserPicker.ts +56 -0
  251. package/src/controls/FullSizeToggleControl.tsx +94 -0
  252. package/src/controls/ImageControl.tsx +143 -0
  253. package/src/controls/InspectorPanel.tsx +37 -0
  254. package/src/controls/LazySuggestionsComboboxControl.tsx +62 -0
  255. package/src/controls/MultiSelectControl.tsx +59 -0
  256. package/src/controls/PickOne.tsx +84 -0
  257. package/src/controls/PromisableComponent.tsx +56 -0
  258. package/src/controls/ProperLinkControl.tsx +93 -0
  259. package/src/controls/SimpleToggle.tsx +9 -0
  260. package/src/controls/SortableFlexibleItemsControl.tsx +35 -0
  261. package/src/controls/SortableItemsControl.tsx +18 -0
  262. package/src/controls/basicNumericallyIdedItemPicker.tsx +76 -0
  263. package/src/controls/hooks/useImprovedTokenManager.ts +156 -0
  264. package/src/controls/hooks/useMultiSingleConversionLayer.ts +17 -0
  265. package/src/controls/hooks/useNonRenderingCounter.ts +6 -0
  266. package/src/controls/hooks/useOutputMemoizingFilter.ts +16 -0
  267. package/src/controls/hooks/useSortableItemsModel.ts +196 -0
  268. package/src/controls/hooks/useSuggestions.ts +91 -0
  269. package/src/controls/hooks/useTokenManager.ts +177 -0
  270. package/{build/controls/index.js → src/controls/index.ts} +3 -2
  271. package/src/controls/shared.ts +50 -0
  272. package/src/controls/types.ts +18 -0
  273. package/src/editor/post-featured-image.tsx +161 -0
  274. package/src/editor/simple-gutenberg-endpoints-api.ts +31 -0
  275. package/src/editor/simple-gutenberg-endpoints-impl.ts +119 -0
  276. package/src/index.ts +32 -0
  277. package/src/lib/gutenberg-api-extensions-state/custom-block-bindings-support-logic.ts +34 -0
  278. package/src/lib/gutenberg-api-extensions-state/general-logic.ts +41 -0
  279. package/src/lib/gutenberg-api-extensions-state/layered-block-styles-logic.ts +42 -0
  280. package/src/lib/gutenberg-api-extensions-state/snp-logic.ts +240 -0
  281. package/src/lib/gutenberg-api-extensions-state.ts +69 -0
  282. package/src/lib/helpers.ts +113 -0
  283. package/src/lib/plaudit-icons/column-1.tsx +6 -0
  284. package/src/lib/plaudit-icons/column-2.tsx +6 -0
  285. package/src/lib/plaudit-icons/column-3.tsx +6 -0
  286. package/src/lib/plaudit-icons/placement-center.tsx +3 -0
  287. package/src/lib/plaudit-icons/placement-end.tsx +3 -0
  288. package/src/lib/plaudit-icons/placement-start.tsx +3 -0
  289. package/src/lib/plaudit-icons/placement-stretch.tsx +3 -0
  290. package/src/lib/plaudit-icons/plaudit-icon.tsx +4 -0
  291. package/src/lib/plaudit-icons/reusable-block-marker.tsx +3 -0
  292. package/{build/lib/plaudit-icons.js → src/lib/plaudit-icons.ts} +1 -1
  293. package/src/lib/suspense/promise-handlers.ts +72 -0
  294. package/src/lib/suspense.tsx +18 -0
  295. package/src/lib/useful-types.ts +65 -0
  296. package/build/blocks/MoveError.js +0 -6
  297. package/build/blocks/MoveError.js.map +0 -1
  298. package/build/blocks/PathError.js.map +0 -1
  299. package/build/blocks/SNPFlexibleItemsListComponent.js +0 -15
  300. package/build/blocks/SNPFlexibleItemsListComponent.js.map +0 -1
  301. package/build/blocks/SNPGroupComponent.js +0 -17
  302. package/build/blocks/SNPGroupComponent.js.map +0 -1
  303. package/build/blocks/SNPListComponent.js +0 -15
  304. package/build/blocks/SNPListComponent.js.map +0 -1
  305. package/build/blocks/SNPTreeContext.js +0 -10
  306. package/build/blocks/SNPTreeContext.js.map +0 -1
  307. package/build/blocks/basic-custom-block-bindings-support.js +0 -150
  308. package/build/blocks/basic-custom-block-bindings-support.js.map +0 -1
  309. package/build/blocks/common-native-property-constructors.d.ts +0 -208
  310. package/build/blocks/common-native-property-constructors.js.map +0 -1
  311. package/build/blocks/conditions.js.map +0 -1
  312. package/build/blocks/data-controller-manager.js.map +0 -1
  313. package/build/blocks/data-controller.js.map +0 -1
  314. package/build/blocks/hooks/built-in-suspendable-option-protocols/select.js.map +0 -1
  315. package/build/blocks/hooks/built-in-suspendable-option-protocols/settings.js.map +0 -1
  316. package/build/blocks/hooks/useSuspendableOptions.js.map +0 -1
  317. package/build/blocks/index.js +0 -15
  318. package/build/blocks/index.js.map +0 -1
  319. package/build/blocks/layered-styles-api.js.map +0 -1
  320. package/build/blocks/layered-styles-impl.js.map +0 -1
  321. package/build/blocks/layout/LaidOutProperty.js +0 -44
  322. package/build/blocks/layout/LaidOutProperty.js.map +0 -1
  323. package/build/blocks/layout/LaidOutPropertyRow.js +0 -12
  324. package/build/blocks/layout/LaidOutPropertyRow.js.map +0 -1
  325. package/build/blocks/layout/NodeContext.js +0 -37
  326. package/build/blocks/layout/NodeContext.js.map +0 -1
  327. package/build/blocks/layout/PanelRoot.js +0 -26
  328. package/build/blocks/layout/PanelRoot.js.map +0 -1
  329. package/build/blocks/layout/TabsRoot.js.map +0 -1
  330. package/build/blocks/layout/ToolsPanelContext.js +0 -18
  331. package/build/blocks/layout/ToolsPanelContext.js.map +0 -1
  332. package/build/blocks/shared-exportable-types.js +0 -2
  333. package/build/blocks/shared-internal-types.js +0 -2
  334. package/build/blocks/simple-block.js +0 -41
  335. package/build/blocks/simple-block.js.map +0 -1
  336. package/build/blocks/simple-native-property-api.js.map +0 -1
  337. package/build/blocks/simple-native-property-impl.js.map +0 -1
  338. package/build/blocks/simple-native-property-internal-shared.js.map +0 -1
  339. package/build/blocks/snp-api.js +0 -2
  340. package/build/blocks/snp-api.js.map +0 -1
  341. package/build/blocks/snp-data-store.js.map +0 -1
  342. package/build/blocks/utilities.js +0 -67
  343. package/build/blocks/utilities.js.map +0 -1
  344. package/build/controls/AsynchronousFormTokenField.js +0 -32
  345. package/build/controls/AsynchronousFormTokenField.js.map +0 -1
  346. package/build/controls/BaseSortableItemsControl.js +0 -22
  347. package/build/controls/BaseSortableItemsControl.js.map +0 -1
  348. package/build/controls/ExtendedFormTokenField.js +0 -58
  349. package/build/controls/ExtendedFormTokenField.js.map +0 -1
  350. package/build/controls/ExtendedPostPicker.js +0 -22
  351. package/build/controls/ExtendedPostPicker.js.map +0 -1
  352. package/build/controls/ExtendedRadioControl.d.ts +0 -10
  353. package/build/controls/ExtendedRadioControl.js +0 -30
  354. package/build/controls/ExtendedRadioControl.js.map +0 -1
  355. package/build/controls/ExtendedTaxonomyPicker.js +0 -68
  356. package/build/controls/ExtendedTaxonomyPicker.js.map +0 -1
  357. package/build/controls/ExtendedTermPicker.js +0 -27
  358. package/build/controls/ExtendedTermPicker.js.map +0 -1
  359. package/build/controls/ExtendedTextareaControl.d.ts +0 -14
  360. package/build/controls/ExtendedTextareaControl.js.map +0 -1
  361. package/build/controls/ExtendedUserPicker.js +0 -22
  362. package/build/controls/ExtendedUserPicker.js.map +0 -1
  363. package/build/controls/FullSizeToggleControl.js +0 -70
  364. package/build/controls/FullSizeToggleControl.js.map +0 -1
  365. package/build/controls/ImageControl.js +0 -76
  366. package/build/controls/ImageControl.js.map +0 -1
  367. package/build/controls/InspectorPanel.js +0 -26
  368. package/build/controls/InspectorPanel.js.map +0 -1
  369. package/build/controls/LazySuggestionsComboboxControl.js +0 -29
  370. package/build/controls/LazySuggestionsComboboxControl.js.map +0 -1
  371. package/build/controls/MultiSelectControl.js +0 -30
  372. package/build/controls/MultiSelectControl.js.map +0 -1
  373. package/build/controls/PickOne.js +0 -48
  374. package/build/controls/PickOne.js.map +0 -1
  375. package/build/controls/PromisableComponent.js.map +0 -1
  376. package/build/controls/ProperLinkControl.js +0 -56
  377. package/build/controls/ProperLinkControl.js.map +0 -1
  378. package/build/controls/SimpleToggle.js +0 -8
  379. package/build/controls/SimpleToggle.js.map +0 -1
  380. package/build/controls/SortableFlexibleItemsControl.js +0 -15
  381. package/build/controls/SortableFlexibleItemsControl.js.map +0 -1
  382. package/build/controls/SortableItemsControl.js +0 -12
  383. package/build/controls/SortableItemsControl.js.map +0 -1
  384. package/build/controls/basicNumericallyIdedItemPicker.js +0 -34
  385. package/build/controls/basicNumericallyIdedItemPicker.js.map +0 -1
  386. package/build/controls/hooks/useImprovedTokenManager.js.map +0 -1
  387. package/build/controls/hooks/useMultiSingleConversionLayer.js +0 -11
  388. package/build/controls/hooks/useMultiSingleConversionLayer.js.map +0 -1
  389. package/build/controls/hooks/useNonRenderingCounter.js +0 -6
  390. package/build/controls/hooks/useNonRenderingCounter.js.map +0 -1
  391. package/build/controls/hooks/useOutputMemoizingFilter.js.map +0 -1
  392. package/build/controls/hooks/useSortableItemsModel.js.map +0 -1
  393. package/build/controls/hooks/useSuggestions.js.map +0 -1
  394. package/build/controls/hooks/useTokenManager.js.map +0 -1
  395. package/build/controls/index.js.map +0 -1
  396. package/build/controls/shared.js.map +0 -1
  397. package/build/controls/types.js +0 -2
  398. package/build/editor/post-featured-image.js +0 -122
  399. package/build/editor/post-featured-image.js.map +0 -1
  400. package/build/editor/simple-gutenberg-endpoints-api.js +0 -22
  401. package/build/editor/simple-gutenberg-endpoints-api.js.map +0 -1
  402. package/build/editor/simple-gutenberg-endpoints-impl.js.map +0 -1
  403. package/build/index.js +0 -22
  404. package/build/index.js.map +0 -1
  405. package/build/lib/gutenberg-api-extensions-state/custom-block-bindings-support-logic.js +0 -23
  406. package/build/lib/gutenberg-api-extensions-state/custom-block-bindings-support-logic.js.map +0 -1
  407. package/build/lib/gutenberg-api-extensions-state/general-logic.js.map +0 -1
  408. package/build/lib/gutenberg-api-extensions-state/layered-block-styles-logic.js.map +0 -1
  409. package/build/lib/gutenberg-api-extensions-state/snp-logic.js.map +0 -1
  410. package/build/lib/gutenberg-api-extensions-state.js +0 -48
  411. package/build/lib/gutenberg-api-extensions-state.js.map +0 -1
  412. package/build/lib/helpers.js.map +0 -1
  413. package/build/lib/plaudit-icons/column-1.js +0 -3
  414. package/build/lib/plaudit-icons/column-1.js.map +0 -1
  415. package/build/lib/plaudit-icons/column-2.js +0 -3
  416. package/build/lib/plaudit-icons/column-2.js.map +0 -1
  417. package/build/lib/plaudit-icons/column-3.js +0 -3
  418. package/build/lib/plaudit-icons/column-3.js.map +0 -1
  419. package/build/lib/plaudit-icons/placement-center.js +0 -3
  420. package/build/lib/plaudit-icons/placement-center.js.map +0 -1
  421. package/build/lib/plaudit-icons/placement-end.js +0 -3
  422. package/build/lib/plaudit-icons/placement-end.js.map +0 -1
  423. package/build/lib/plaudit-icons/placement-start.js +0 -3
  424. package/build/lib/plaudit-icons/placement-start.js.map +0 -1
  425. package/build/lib/plaudit-icons/placement-stretch.js +0 -3
  426. package/build/lib/plaudit-icons/placement-stretch.js.map +0 -1
  427. package/build/lib/plaudit-icons/plaudit-icon.js +0 -3
  428. package/build/lib/plaudit-icons/plaudit-icon.js.map +0 -1
  429. package/build/lib/plaudit-icons/reusable-block-marker.js +0 -3
  430. package/build/lib/plaudit-icons.js.map +0 -1
  431. package/build/lib/suspense/promise-handlers.js.map +0 -1
  432. package/build/lib/suspense.js +0 -14
  433. package/build/lib/suspense.js.map +0 -1
  434. package/build/lib/useful-types.js +0 -7
  435. package/build/lib/useful-types.js.map +0 -1
  436. /package/{build → dist}/blocks/MoveError.d.ts +0 -0
  437. /package/{build → dist}/blocks/PathError.d.ts +0 -0
  438. /package/{build → dist}/blocks/SNPTreeContext.d.ts +0 -0
  439. /package/{build → dist}/blocks/basic-custom-block-bindings-support.d.ts +0 -0
  440. /package/{build → dist}/blocks/conditions.d.ts +0 -0
  441. /package/{build → dist}/blocks/data-controller-manager.d.ts +0 -0
  442. /package/{build → dist}/blocks/data-controller.d.ts +0 -0
  443. /package/{build → dist}/blocks/hooks/built-in-suspendable-option-protocols/select.d.ts +0 -0
  444. /package/{build → dist}/blocks/hooks/built-in-suspendable-option-protocols/settings.d.ts +0 -0
  445. /package/{build → dist}/blocks/index.d.ts +0 -0
  446. /package/{build → dist}/blocks/layered-styles-impl.d.ts +0 -0
  447. /package/{build → dist}/blocks/layout/LaidOutPropertyRow.d.ts +0 -0
  448. /package/{build → dist}/blocks/layout/PanelRoot.d.ts +0 -0
  449. /package/{build → dist}/blocks/layout/TabsRoot.d.ts +0 -0
  450. /package/{build → dist}/blocks/layout/ToolsPanelContext.d.ts +0 -0
  451. /package/{build → dist}/blocks/shared-exportable-types.d.ts +0 -0
  452. /package/{build → dist}/blocks/shared-exportable-types.js.map +0 -0
  453. /package/{build → dist}/blocks/shared-internal-types.d.ts +0 -0
  454. /package/{build → dist}/blocks/shared-internal-types.js.map +0 -0
  455. /package/{build → dist}/blocks/simple-native-property-impl.d.ts +0 -0
  456. /package/{build → dist}/blocks/simple-native-property-internal-shared.d.ts +0 -0
  457. /package/{build → dist}/blocks/snp-data-store.d.ts +0 -0
  458. /package/{build → dist}/controls/ExtendedPostPicker.d.ts +0 -0
  459. /package/{build → dist}/controls/ExtendedUserPicker.d.ts +0 -0
  460. /package/{build → dist}/controls/SimpleToggle.d.ts +0 -0
  461. /package/{build → dist}/controls/SortableFlexibleItemsControl.d.ts +0 -0
  462. /package/{build → dist}/controls/SortableItemsControl.d.ts +0 -0
  463. /package/{build → dist}/controls/hooks/useNonRenderingCounter.d.ts +0 -0
  464. /package/{build → dist}/controls/hooks/useOutputMemoizingFilter.d.ts +0 -0
  465. /package/{build → dist}/controls/hooks/useSortableItemsModel.d.ts +0 -0
  466. /package/{build → dist}/controls/hooks/useSuggestions.d.ts +0 -0
  467. /package/{build → dist}/controls/index.d.ts +0 -0
  468. /package/{build → dist}/controls/shared.d.ts +0 -0
  469. /package/{build → dist}/controls/types.d.ts +0 -0
  470. /package/{build → dist}/controls/types.js.map +0 -0
  471. /package/{build → dist}/editor/post-featured-image.d.ts +0 -0
  472. /package/{build → dist}/editor/simple-gutenberg-endpoints-api.d.ts +0 -0
  473. /package/{build → dist}/editor/simple-gutenberg-endpoints-impl.d.ts +0 -0
  474. /package/{build → dist}/index.d.ts +0 -0
  475. /package/{build → dist}/lib/gutenberg-api-extensions-state/custom-block-bindings-support-logic.d.ts +0 -0
  476. /package/{build → dist}/lib/gutenberg-api-extensions-state/general-logic.d.ts +0 -0
  477. /package/{build → dist}/lib/gutenberg-api-extensions-state/layered-block-styles-logic.d.ts +0 -0
  478. /package/{build → dist}/lib/gutenberg-api-extensions-state/snp-logic.d.ts +0 -0
  479. /package/{build → dist}/lib/plaudit-icons/column-1.d.ts +0 -0
  480. /package/{build → dist}/lib/plaudit-icons/column-2.d.ts +0 -0
  481. /package/{build → dist}/lib/plaudit-icons/column-3.d.ts +0 -0
  482. /package/{build → dist}/lib/plaudit-icons/placement-center.d.ts +0 -0
  483. /package/{build → dist}/lib/plaudit-icons/placement-end.d.ts +0 -0
  484. /package/{build → dist}/lib/plaudit-icons/placement-start.d.ts +0 -0
  485. /package/{build → dist}/lib/plaudit-icons/placement-stretch.d.ts +0 -0
  486. /package/{build → dist}/lib/plaudit-icons/plaudit-icon.d.ts +0 -0
  487. /package/{build → dist}/lib/plaudit-icons/reusable-block-marker.d.ts +0 -0
  488. /package/{build → dist}/lib/plaudit-icons.d.ts +0 -0
  489. /package/{build → dist}/lib/suspense/promise-handlers.d.ts +0 -0
@@ -0,0 +1,84 @@
1
+ import {BaseControl, Button, useBaseControlProps} from "@wordpress/components";
2
+ import {useCallback} from "@wordpress/element";
3
+ import {dragHandle, Icon} from "@wordpress/icons";
4
+
5
+ import {ProvidedSlot} from "../blocks";
6
+
7
+ import {Reorder, useDragControls} from "framer-motion";
8
+ import type {ReactNode} from "react";
9
+ import {IndexedItemActionsMaker, KeyedValue, useSortableItemsModel} from "./hooks/useSortableItemsModel";
10
+
11
+ export type BaseSortableItemsControlProps<D> = Omit<Parameters<typeof useBaseControlProps>[0], 'children'|'id'>&{
12
+ id?: string,
13
+ value: D[]|undefined,
14
+ onAdd?: (index: number, value: D) => void,
15
+ onChange?: (value: D[]) => void,
16
+ onRemove?: (index: number) => void,
17
+ onReorder?: (oldIndex: number, newIndex: number) => void,
18
+ children: (datum: D, onDatumChange: (datum: D) => void, index: number) => ReactNode,
19
+ buttonsArea: (props: {addHandler: (added: D, index?: number) => void, disabled: boolean}) => ReactNode,
20
+ min?: number,
21
+ max?: number,
22
+ emptyValue?: D,
23
+ Label?: ProvidedSlot, Messages?: ProvidedSlot
24
+ };
25
+
26
+ export function BaseSortableItemsControl<D>({
27
+ value, onChange, onRemove, onReorder, onAdd, children: makeChild, min, max, label, Label, Messages, buttonsArea, emptyValue, ...wrapperProps
28
+ }: BaseSortableItemsControlProps<D>) {
29
+ const {add: addHandler, commit, makeIndexedItemActions, keyedValues} = useSortableItemsModel({onAdd, onChange, onRemove, onReorder, emptyValue, value});
30
+
31
+ const listLength = value?.length ?? 0;
32
+ const addDisabled = max !== undefined && listLength >= max;
33
+ const removeDisabled = min !== undefined && listLength <= min;
34
+ const {baseControlProps, controlProps} = useBaseControlProps({...wrapperProps, label: Label ? <Label /> : label});
35
+
36
+ return <BaseControl {...baseControlProps}>
37
+ <div {...controlProps} className="plaudit-sortable-items-container">
38
+ <Reorder.Group
39
+ axis="y" onReorder={commit} values={keyedValues}
40
+ children={keyedValues.map((datum, index) => <SortableItemsListNode
41
+ addDisabled={addDisabled} datum={datum} index={index} key={datum.key} listLength={listLength}
42
+ makeChild={makeChild} makeIndexedItemActions={makeIndexedItemActions} removeDisabled={removeDisabled}
43
+ />)}
44
+ />
45
+ </div>
46
+ {buttonsArea({addHandler, disabled: addDisabled})}
47
+ {Messages && <Messages />}
48
+ </BaseControl>;
49
+ }
50
+
51
+ type SortableItemsListNodeProps<D> = {
52
+ addDisabled: boolean, datum: KeyedValue<D>, index: number, listLength: number,
53
+ makeChild: BaseSortableItemsControlProps<D>['children'], removeDisabled: boolean,
54
+ makeIndexedItemActions: IndexedItemActionsMaker<D>
55
+ };
56
+ function SortableItemsListNode<D>({datum, index, listLength, makeChild, makeIndexedItemActions, removeDisabled}: SortableItemsListNodeProps<D>) {
57
+ const {remove, moveUp, moveDown, change} = makeIndexedItemActions(index, datum.key);
58
+ //TODO: If used, implement addBefore and addAfter the same way as moveUp and moveDown
59
+
60
+ const dragControls = useDragControls();
61
+ const dragStartHandler = useCallback((event: React.PointerEvent) => dragControls.start(event), [dragControls]);
62
+
63
+ return <Reorder.Item className="plaudit-sortable-items-row" data-index={index} dragListener={false} dragControls={dragControls} layout="position" value={datum}>
64
+ <div className="plaudit-sortable-items-ordering-controls">
65
+ <div className="plaudit-sortable-items-ordering-control">
66
+ <Icon icon={dragHandle} onPointerDown={dragStartHandler} />
67
+ </div>
68
+ <div className="plaudit-sortable-items-ordering-control">
69
+ <Button icon="arrow-up" aria-label="Move Up" disabled={index < 1} onClick={moveUp} />
70
+ <Button icon="arrow-down" aria-label="Move Down" disabled={index >= listLength - 1} onClick={moveDown} />
71
+ </div>
72
+ </div>
73
+ <div className="plaudit-sortable-items-inputs plaudit-sortable-items-padded">
74
+ {makeChild(datum.value, change, index)}
75
+ </div>
76
+ <div className="plaudit-sortable-items-presence-controls plaudit-sortable-items-padded">
77
+ {/*addEmptyHandlers && index === 0 &&
78
+ <Button icon="insert" className="insert-before" disabled={addDisabled} onClick={addEmptyHandlers[0]} aria-label="Insert Before"/>*/}
79
+ <Button icon="remove" disabled={removeDisabled} onClick={remove} aria-label="Remove"/>
80
+ {/*addEmptyHandlers && <Button icon="insert" className="insert-after" disabled={addDisabled} onClick={addEmptyHandlers[1]}
81
+ aria-label={index < listLength - 1 ? "Insert Between" : "Insert After"}/>*/}
82
+ </div>
83
+ </Reorder.Item>;
84
+ }
@@ -0,0 +1,120 @@
1
+ import {Spinner, FormTokenField} from '@wordpress/components';
2
+ import {useDebounce} from "@wordpress/compose";
3
+ import {type MapSelect, useSelect} from "@wordpress/data";
4
+ import {useCallback, useEffect, useMemo, useRef, useState} from "@wordpress/element";
5
+ import {__} from "@wordpress/i18n";
6
+
7
+ import type {SNPControlSlots} from "../blocks";
8
+ import type {TokenItem} from "../lib/useful-types";
9
+ import {packDisplayTokenText, unpackDisplayedTokenText, useImprovedTokenManager, ValidationState} from "./hooks/useImprovedTokenManager";
10
+ import {useMultiSingleConversionLayer} from "./hooks/useMultiSingleConversionLayer";
11
+
12
+ export {packDisplayTokenText, unpackDisplayedTokenText, ValidationState};
13
+
14
+ import type {ReactNode} from "react";
15
+
16
+ type ExtendedFormTokenFieldPropsBase = {
17
+ label?: string;
18
+ help?: ReactNode;
19
+
20
+ validationQuery(tokens: string[], ...args: Parameters<MapSelect>): TokenItem[]|undefined;
21
+ suggestionQuery(input: string, ...args: Parameters<MapSelect>): TokenItem[]|undefined;
22
+ stringToTokenConverter(suggestion: string): TokenItem;
23
+ validator?: (value: string) => boolean;
24
+ expandOnFocus?: boolean;
25
+ initialSuggestions?: TokenItem[];
26
+ hasLoadingError?: (input: string, ...args: Parameters<MapSelect>) => boolean;
27
+ hasValidationError?: (...args: Parameters<MapSelect>) => boolean;
28
+ }&Partial<Pick<SNPControlSlots, 'Messages'>>;
29
+ type ExtendedFormTokenFieldPropsSingle = ExtendedFormTokenFieldPropsBase&{
30
+ value?: string;
31
+ onChange: (value: string) => void;
32
+ multiple: false;
33
+ };
34
+ type ExtendedFormTokenFieldPropsMultiple = ExtendedFormTokenFieldPropsBase&{
35
+ value?: string[];
36
+ onChange: (value: string[]) => void;
37
+ multiple?: true|undefined;
38
+ maxLength?: number;
39
+ };
40
+ export type ExtendedFormTokenFieldProps = ExtendedFormTokenFieldPropsSingle|ExtendedFormTokenFieldPropsMultiple;
41
+
42
+ export function ExtendedFormTokenField(props: ExtendedFormTokenFieldProps) {
43
+ const [debouncedInput, setDebouncedInput, setImmediateInput, input] = useDebouncedValue('');
44
+
45
+ const tokenTitleCacheRef = useRef<Map<TokenItem['value'], TokenItem['title']>|undefined>(undefined);
46
+ if (tokenTitleCacheRef.current === undefined) {
47
+ tokenTitleCacheRef.current = new Map();
48
+ }
49
+
50
+ const {rawSuggestions, isLoading, hasLoadingError} = useSelect((select, registry) => {
51
+ if (!debouncedInput && props.initialSuggestions !== undefined) {
52
+ return {rawSuggestions: props.initialSuggestions, isLoading: false};
53
+ }
54
+ const res = props.suggestionQuery(debouncedInput, select, registry);
55
+ if (res === undefined) {
56
+ return {rawSuggestions: props.initialSuggestions, isLoading: true};
57
+ }
58
+
59
+ return {rawSuggestions: res, isLoading: false, hasLoadingError: props.hasLoadingError?.(debouncedInput, select, registry)};
60
+ }, [debouncedInput, props.initialSuggestions, props.suggestionQuery]);
61
+ const suggestions = useMemo(() => rawSuggestions?.map(packDisplayTokenText), [rawSuggestions]);
62
+
63
+ const [value, setValue] = useMultiSingleConversionLayer(props.value, props.onChange, props.stringToTokenConverter, props.multiple);
64
+ const {currentTokens, isValidating, updateComponentValue, tokenStatusCache}
65
+ = useImprovedTokenManager(value, setValue, props.validationQuery, props.stringToTokenConverter, tokenTitleCacheRef.current);
66
+
67
+ // This is just a trick to avoid needing to repeat requests when pulling from suggestions
68
+ useMemo(() => {
69
+ if (rawSuggestions) {
70
+ for (const suggestion of rawSuggestions) {
71
+ if (suggestion.status !== undefined && !tokenStatusCache.has(suggestion.value)) {
72
+ tokenStatusCache.set(suggestion.value, suggestion.status);
73
+ }
74
+ }
75
+ }
76
+ }, [rawSuggestions, tokenStatusCache]);
77
+
78
+ const {hasValidationError} = useSelect((select, registry) => ({
79
+ hasValidationError: props.hasValidationError?.(select, registry)
80
+ }), [props.hasLoadingError, props.hasValidationError]);
81
+
82
+ const {help, expandOnFocus = false} = props;
83
+
84
+ //TODO: If focus is in field but user hasn't started typing, show a message telling them to start typing
85
+ return <>
86
+ <FormTokenField
87
+ value={currentTokens}
88
+ label={props.label}
89
+ placeholder="Start typing to see suggestions"
90
+ suggestions={suggestions}
91
+ onChange={updateComponentValue}
92
+ displayTransform={useCallback((token: string) => tokenTitleCacheRef.current!.get(unpackDisplayedTokenText(token).value) ?? token, [tokenTitleCacheRef])}
93
+ maxLength={props.multiple !== false ? props.maxLength : 1}
94
+ __experimentalValidateInput={props.validator}
95
+ __experimentalAutoSelectFirstMatch={true}
96
+ __experimentalExpandOnFocus={expandOnFocus}
97
+ __experimentalShowHowTo={props.multiple !== false}
98
+ onInputChange={setDebouncedInput}
99
+ onFocus={useCallback(() => setImmediateInput(input), [input])}
100
+ />
101
+ {help && <div><span className="components-form-token-field__help">{help}</span></div>}
102
+ {hasLoadingError && <div><Spinner /><span className="components-form-token-field__help">{__("An Error Occurred While Loading Suggestions")}</span></div>}
103
+ {isLoading && <div><Spinner /><span className="components-form-token-field__help">{__("Updating Suggestions")}</span></div>}
104
+ {hasValidationError && <div><Spinner /><span className="components-form-token-field__help">{__("An Error Occurred While Validating")}</span></div>}
105
+ {isValidating && <div><Spinner /><span className="components-form-token-field__help">{__("Validating")}</span></div>}
106
+ </>;
107
+ }
108
+
109
+ function useDebouncedValue<V>(defaultValue: V): [V, (value: V) => any, (value: V) => any, V] {
110
+ const [value, setValue] = useState(defaultValue);
111
+ const [debouncedValue, setDebouncedState] = useState(defaultValue);
112
+ const setDebounced = useDebounce(setDebouncedState, 100);
113
+ useEffect(() => {
114
+ setDebounced(value);
115
+ }, [value, setDebounced]);
116
+ return [debouncedValue, setValue, useCallback((value: V) => {
117
+ setValue(value);
118
+ setDebouncedState(value);
119
+ }, [setValue, setDebounced]), value];
120
+ }
@@ -0,0 +1,57 @@
1
+ import apiFetch from "@wordpress/api-fetch";
2
+ import {memo, useMemo} from "@wordpress/element";
3
+
4
+ import {basicNumericallyIdedItemPicker} from "./basicNumericallyIdedItemPicker";
5
+ import type {SNPControlSlots} from "../blocks";
6
+ import {ValidationState} from "./ExtendedFormTokenField";
7
+ import {registerSimpleGutenbergApiEndpoint} from "../editor/simple-gutenberg-endpoints-api";
8
+ import type {TokenItem, WPTaxonomyQuery} from "../lib/useful-types";
9
+
10
+ import type {ReactNode} from "react";
11
+
12
+ type ExtendedPostPickerPropsBase = {
13
+ label?: string;
14
+ help?: ReactNode;
15
+ postTypes?: string[];
16
+ placeholder?: string;
17
+ taxonomyQuery?: WPTaxonomyQuery;
18
+ }&Partial<Pick<SNPControlSlots, 'Messages'>>;
19
+ type ExtendedPostPickerPropsSingle = ExtendedPostPickerPropsBase&{
20
+ onChange(value: string): void;
21
+ value?: string;
22
+ multiple: false;
23
+ };
24
+ type ExtendedPostPickerPropsMultiple = ExtendedPostPickerPropsBase&{
25
+ onChange(value: string[]): void;
26
+ value?: string[];
27
+ multiple?: true|undefined;
28
+ };
29
+ export type ExtendedPostPickerProps = ExtendedPostPickerPropsSingle|ExtendedPostPickerPropsMultiple;
30
+ export type ExtendedPostPickerConstructorProps = ExtendedPostPickerProps;
31
+
32
+ registerSimpleGutenbergApiEndpoint(
33
+ "plaudit-common.post-table-search-options",
34
+ data => apiFetch<Array<{id: number, title: string, type: string}>>({data, method: 'POST', path: "/plaudit/common/v1/post-table-search"}),
35
+ {
36
+ transformer: posts => posts.map(post => ({value: post.id.toString(), title: post.title, status: ValidationState.Valid})),
37
+ maxCachedResults: 10
38
+ }
39
+ );
40
+ registerSimpleGutenbergApiEndpoint(
41
+ "plaudit-common.post-table-search-validation",
42
+ data => apiFetch<Array<{id: number, title: string, type: string}>>({data, method: 'POST', path: "/plaudit/common/v1/post-table-search"}),
43
+ {
44
+ transformer: posts => posts
45
+ .map((post): TokenItem => ({value: post.id.toString(), title: post.title, status: ValidationState.Valid})),
46
+ maxCachedResults: 10
47
+ }
48
+ );
49
+
50
+ export const ExtendedPostPicker = memo((props: ExtendedPostPickerProps) => {
51
+ const {postTypes, taxonomyQuery, ...passthrough} = props;
52
+
53
+ const queryArgs = useMemo(() => {
54
+ return {postTypes: postTypes?.join(','), taxonomyQuery};
55
+ }, [postTypes, taxonomyQuery]);
56
+ return basicNumericallyIdedItemPicker(passthrough, "plaudit-common.post-table-search", queryArgs);
57
+ });
@@ -0,0 +1,107 @@
1
+ import {BaseControl, RadioControl, __experimentalVStack as VStack} from "@wordpress/components";
2
+ import {useInstanceId} from "@wordpress/compose";
3
+ import {useCallback, useState} from "@wordpress/element";
4
+
5
+ import type {SNPControlSlots} from "../blocks";
6
+
7
+ import type {ChangeEvent, ComponentPropsWithoutRef, ElementType} from "react";
8
+
9
+ type RawElementSafeProps<P, T extends ElementType> = P&Omit<ComponentPropsWithoutRef<T>, 'as' | keyof P | 'children'>;
10
+ export type ExtendedRadioControlProps = RawElementSafeProps<ComponentPropsWithoutRef<typeof RadioControl> & { allowCustom?: boolean }, 'input'>&Partial<SNPControlSlots>;
11
+
12
+ /**
13
+ * This is a variant of WordPress'
14
+ */
15
+ export function ExtendedRadioControl(props: ExtendedRadioControlProps) {
16
+ const {
17
+ label,
18
+ className,
19
+ selected,
20
+ help,
21
+ onChange,
22
+ hideLabelFromVision,
23
+ options = [],
24
+ allowCustom,
25
+ Label, Messages,
26
+ ...additionalProps
27
+ } = props;
28
+ const instanceId = useInstanceId( ExtendedRadioControl );
29
+ const id = `inspector-radio-control-${instanceId}`;
30
+ const [valueIsCustom, setValueIsCustom] = useState(
31
+ () => options.find(option => option.value === selected) === undefined);
32
+ const [customValue, setCustomValue] = useState(valueIsCustom ? selected : "");
33
+
34
+ const onChangeValue = useCallback((event: ChangeEvent<HTMLInputElement>) => {
35
+ setValueIsCustom(options.find(option => option.value === event.target.value) === undefined);
36
+ onChange(event.target.value);
37
+ }, [onChange, options, setValueIsCustom]);
38
+ const onChangeCustom = useCallback((e: ChangeEvent<HTMLInputElement>) => {
39
+ onChangeValue(e);
40
+ setValueIsCustom(true);
41
+ setCustomValue(e.target.value);
42
+ }, [onChangeValue, setValueIsCustom, setCustomValue]);
43
+
44
+ if (!options?.length) {
45
+ return null;
46
+ }
47
+
48
+ const distinctnessSet = new Set<string>();
49
+ const classNames = [...className?.split(/\s+/g) ?? [], 'components-radio-control'].filter(cn => distinctnessSet.add(cn)).join(' ');
50
+
51
+ return (
52
+ <BaseControl
53
+ __nextHasNoMarginBottom
54
+ label={Label ? <Label /> : label}
55
+ id={id}
56
+ hideLabelFromVision={hideLabelFromVision}
57
+ help={help}
58
+ className={classNames}
59
+ >
60
+ <VStack spacing={1}>
61
+ {options.map((option, index) => (
62
+ <div
63
+ key={`${id}-${index}`}
64
+ className="components-radio-control__option"
65
+ >
66
+ <input
67
+ id={`${id}-${index}`}
68
+ className="components-radio-control__input"
69
+ type="radio"
70
+ name={id}
71
+ value={option.value}
72
+ onChange={onChangeValue}
73
+ checked={option.value === selected}
74
+ aria-describedby={!!help ? `${id}__help` : undefined}
75
+ {...additionalProps}
76
+ />
77
+ <label
78
+ className="components-radio-control__label"
79
+ htmlFor={`${id}-${index}`}
80
+ >
81
+ {option.label}
82
+ </label>
83
+ </div>
84
+ ))}
85
+ {allowCustom && <div
86
+ key={`${id}-${options.length}`}
87
+ className="components-radio-control__option"
88
+ >
89
+ <input
90
+ id={`${id}-${options.length}`}
91
+ className="components-radio-control__input"
92
+ type="radio"
93
+ name={id}
94
+ value={customValue ?? ''}
95
+ onChange={onChangeValue}
96
+ checked={valueIsCustom}
97
+ aria-describedby={!!help ? `${id}__help` : undefined}
98
+ {...additionalProps}
99
+ />
100
+ <label id={`${id}-custom-label`} className="components-radio-control__label" htmlFor={`${id}-${options.length}`}>Custom:</label>
101
+ <input aria-labelledby={`${id}-custom-label`} type="text" value={customValue ?? ''} onChange={onChangeCustom} />
102
+ </div>}
103
+ </VStack>
104
+ {Messages && <Messages/>}
105
+ </BaseControl>
106
+ );
107
+ }
@@ -0,0 +1,100 @@
1
+ import {type BaseEntityRecords, store as coreStore, type Taxonomy} from "@wordpress/core-data";
2
+ import {useSelect} from "@wordpress/data";
3
+ import {useCallback, useMemo} from "@wordpress/element";
4
+
5
+ import type {SNPControlSlots} from "../blocks";
6
+ import type {TokenItem} from "../lib/useful-types";
7
+ import {useOutputMemoizingFilter} from "./hooks/useOutputMemoizingFilter";
8
+ import {ExtendedFormTokenField, unpackDisplayedTokenText, ValidationState} from "./ExtendedFormTokenField";
9
+
10
+ import type {ReactNode} from "react";
11
+
12
+ type ExtendedTaxonomyPickerPropsBase = {
13
+ label?: string;
14
+ help?: ReactNode;
15
+ placeholder?: string;
16
+ visibility?: Partial<BaseEntityRecords.TaxonomyVisibility>
17
+ }&Partial<Pick<SNPControlSlots, 'Messages'>>;
18
+ export type ExtendedTaxonomyPickerPropsSingle = {
19
+ onChange(value: string): void;
20
+ value?: string;
21
+ multiple: false;
22
+ };
23
+ export type ExtendedTaxonomyPickerPropsMultiple = {
24
+ onChange(value: string[]): void;
25
+ value?: string[];
26
+ multiple?: true|undefined;
27
+ };
28
+ export type ExtendedTaxonomyPickerProps = ExtendedTaxonomyPickerPropsBase&(ExtendedTaxonomyPickerPropsSingle|ExtendedTaxonomyPickerPropsMultiple);
29
+
30
+ export function ExtendedTaxonomyPicker(props: ExtendedTaxonomyPickerProps) {
31
+ const {visibility, ...extendedFormTokenFieldProps} = props;
32
+ const availableTaxonomies = useTaxonomiesFilteredByVisibility(visibility);
33
+ const taxonomyVisibilityFilter = makeTaxonomyVisibilityFilter(visibility);
34
+
35
+ const taxonomySuggestionQuery = useOutputMemoizingFilter((input: string, taxonomies: Taxonomy[]|null) => {
36
+ return taxonomies?.filter(taxonomy => !props.value?.includes(taxonomy.slug))
37
+ .filter(taxonomy => taxonomy.name.toLowerCase().includes(input.toLowerCase()) || taxonomy.slug.toLowerCase().includes(input.toLowerCase()))
38
+ .map(taxonomy => ({value: taxonomy.slug, status: ValidationState.Valid, title: taxonomy.name})) ?? [];
39
+ }, [props.value]);
40
+ const taxonomyValidationQuery = useOutputMemoizingFilter((tokens: string[], rawTaxonomies: Taxonomy[]|null) => {
41
+ if (rawTaxonomies === null) {
42
+ return tokens.map(token => ({value: token, status: ValidationState.Validating}));
43
+ }
44
+ const tokenItemCreator = (taxonomy: Taxonomy): [string, TokenItem] => {
45
+ return [taxonomy.slug, {value: taxonomy.slug, status: ValidationState.Valid, title: taxonomy.name}];
46
+ };
47
+ const taxonomies = rawTaxonomies?.length ? Object.fromEntries(rawTaxonomies.map(tokenItemCreator)) : undefined;
48
+ if (!taxonomies) {
49
+ return tokens.map(token => ({value: token, status: ValidationState.Invalid}));
50
+ }
51
+ return tokens.map(token => taxonomies[token] ?? {value: token, status: ValidationState.Invalid});
52
+ });
53
+
54
+ return <ExtendedFormTokenField
55
+ expandOnFocus={true}
56
+ {...extendedFormTokenFieldProps}
57
+ stringToTokenConverter={useCallback(token => {
58
+ if (availableTaxonomies === null) {
59
+ return {value: token, status: ValidationState.Validating};
60
+ }
61
+ const {value, title} = unpackDisplayedTokenText(token);
62
+ const foundTaxonomy = availableTaxonomies.find(taxonomy => taxonomy.slug === value);
63
+ if (foundTaxonomy) {
64
+ return {value: foundTaxonomy.slug, status: ValidationState.Valid, title: foundTaxonomy.name};
65
+ }
66
+ return title === undefined ? {value, status: ValidationState.Validating} : {value, status: ValidationState.Invalid, title};
67
+ }, [availableTaxonomies])}
68
+ suggestionQuery={useCallback((input, select) => {
69
+ return taxonomySuggestionQuery(input, taxonomyVisibilityFilter(select(coreStore).getTaxonomies()));
70
+ }, [taxonomyVisibilityFilter, taxonomySuggestionQuery])}
71
+ validationQuery={useCallback((tokens, select) => {
72
+ return taxonomyValidationQuery(tokens, taxonomyVisibilityFilter(select(coreStore).getTaxonomies()));
73
+ }, [taxonomyVisibilityFilter, taxonomyValidationQuery])}
74
+ validator={useCallback((token: string) => {
75
+ if (!availableTaxonomies) {
76
+ return false;
77
+ }
78
+ const {value} = unpackDisplayedTokenText(token);
79
+ return availableTaxonomies.find(taxonomy => taxonomy.slug === value) !== undefined;
80
+ }, [availableTaxonomies])}
81
+ />;
82
+ }
83
+
84
+ function useTaxonomiesFilteredByVisibility(visibility: ExtendedTaxonomyPickerProps['visibility']) {
85
+ const taxonomies = useSelect(select => select(coreStore).getTaxonomies(), []);
86
+ return useMemo(() => filterTaxonomiesByVisibility(taxonomies, visibility), [taxonomies, visibility]);
87
+ }
88
+ function makeTaxonomyVisibilityFilter(visibility: Parameters<typeof filterTaxonomiesByVisibility>[1]) {
89
+ return useOutputMemoizingFilter((taxonomies: Parameters<typeof filterTaxonomiesByVisibility>[0]) => filterTaxonomiesByVisibility(taxonomies, visibility), [visibility]);
90
+ }
91
+ function filterTaxonomiesByVisibility(taxonomies: Taxonomy[]|null, visibility: ExtendedTaxonomyPickerProps['visibility']) {
92
+ if (!taxonomies || !visibility) {
93
+ return taxonomies;
94
+ }
95
+ const tests = Object.entries(visibility)
96
+ .filter((entry): entry is [keyof BaseEntityRecords.TaxonomyVisibility, boolean] => entry[1] !== undefined && entry[1] !== null);
97
+ return tests.length
98
+ ? taxonomies.filter(taxonomy => tests.every(([key, value]) => taxonomy.visibility[key] === value))
99
+ : taxonomies;
100
+ }
@@ -0,0 +1,62 @@
1
+ import apiFetch from "@wordpress/api-fetch";
2
+ import {select as dataSelect} from "@wordpress/data";
3
+ import {useCallback} from "@wordpress/element";
4
+
5
+ import type {SNPControlSlots} from "../blocks";
6
+ import {ExtendedFormTokenField, unpackDisplayedTokenText, ValidationState} from "./ExtendedFormTokenField";
7
+ import {registerSimpleGutenbergApiEndpoint} from "../editor/simple-gutenberg-endpoints-api";
8
+ import type {TokenItem} from "../lib/useful-types";
9
+
10
+ import type {ReactNode} from "react";
11
+
12
+ type ExtendedTermPickerPropsBase = {
13
+ label?: string;
14
+ help?: ReactNode;
15
+ taxonomy: string;
16
+ placeholder?: string;
17
+ }&Partial<Pick<SNPControlSlots, 'Messages'>>;
18
+ export type ExtendedTermPickerPropsSingle = ExtendedTermPickerPropsBase&{
19
+ onChange(value: string): void;
20
+ value?: string;
21
+ multiple: false;
22
+ };
23
+ export type ExtendedTermPickerPropsMultiple = ExtendedTermPickerPropsBase&{
24
+ onChange(value: string[]): void;
25
+ value?: string[];
26
+ multiple?: true|undefined;
27
+ };
28
+ export type ExtendedTermPickerProps = ExtendedTermPickerPropsSingle|ExtendedTermPickerPropsMultiple;
29
+
30
+ export type TermDataStruct = {term_id: number, name: string, slug: number, term_taxonomy_id: number, taxonomy: string};
31
+ registerSimpleGutenbergApiEndpoint(
32
+ "plaudit-common.term-table-search-options",
33
+ data => apiFetch<TermDataStruct[]>({data, method: 'POST', path: "/plaudit/common/v1/term-table-search"}),
34
+ {
35
+ transformer: terms => terms.map(term => ({value: term.slug, title: term.name, status: ValidationState.Valid})),
36
+ maxCachedResults: 10
37
+ }
38
+ );
39
+ registerSimpleGutenbergApiEndpoint(
40
+ "plaudit-common.term-table-search-validation",
41
+ data => apiFetch<TermDataStruct[]>({data, method: 'POST', path: "/plaudit/common/v1/term-table-search"}),
42
+ {
43
+ transformer: terms => terms
44
+ .map((term) => ({value: term.slug, title: term.name, status: ValidationState.Valid})),
45
+ maxCachedResults: 10
46
+ }
47
+ );
48
+
49
+ export function ExtendedTermPicker(props: ExtendedTermPickerProps) {
50
+ const {taxonomy} = props;
51
+
52
+ const suggestionQuery = useCallback((input: string, select: typeof dataSelect) => {
53
+ return select('plaudit/simple-gutenberg-apis')
54
+ .get("plaudit-common.term-table-search-options", {search: input, taxonomy}) as TokenItem[]|undefined;
55
+ }, [taxonomy]);
56
+ const validationQuery = useCallback((slugsBeingValidated: string[], select: typeof dataSelect) => {
57
+ return (select('plaudit/simple-gutenberg-apis')
58
+ .get("plaudit-common.term-table-search-validation", {slugs: slugsBeingValidated.join(','), taxonomy}) as TokenItem[]|undefined);
59
+ }, [taxonomy]);
60
+
61
+ return <ExtendedFormTokenField {...props} validationQuery={validationQuery} suggestionQuery={suggestionQuery} stringToTokenConverter={unpackDisplayedTokenText} />;
62
+ }
@@ -0,0 +1,65 @@
1
+ import {TextareaControl} from "@wordpress/components";
2
+ import {useDebounce} from "@wordpress/compose";
3
+
4
+ import {forwardRef, useCallback, useEffect, useImperativeHandle, useRef} from "@wordpress/element";
5
+
6
+ import type {SNPControlSlots} from "../blocks";
7
+
8
+ import type {ComponentProps} from "react";
9
+
10
+ export type TextareaControlPropsExtension = {newline?: undefined|"\n"|"br"|"p", placeholder?: string|undefined, rich?: boolean};
11
+ export type ExtendedTextAreaControlProps = Omit<ComponentProps<typeof TextareaControl>, 'value'>&{value: ComponentProps<typeof TextareaControl>['value']|null|undefined}
12
+ &Partial<Pick<SNPControlSlots, 'Messages'>>&TextareaControlPropsExtension;
13
+ export const ExtendedTextareaControl = (() => {
14
+ const debouncerSettings = {leading: false, maxWait: 250, trailing: true};
15
+ return forwardRef<HTMLTextAreaElement, ExtendedTextAreaControlProps>((props, ref) => {
16
+ const {newline, onChange, placeholder, rich, value, Messages, ...forwardedProps} = props;
17
+ let v = value ?? '';
18
+ if (!rich) {
19
+ if (newline === "br") {
20
+ v = v.replaceAll(/<br>\s*<\/br>|<br\/?>/gi, "\n");
21
+ } else if (newline === "p") {
22
+ v = v.replaceAll(/<p>(.*?)<\/p>/gi, "$1\n");
23
+ }
24
+ }
25
+ const safeOnChange = useCallback((v: string) => {
26
+ if (rich) {
27
+ onChange(v);
28
+ } else if (newline === "br") {
29
+ onChange(v.replaceAll(/\r?\n/g, "<br/>"));
30
+ } else if (newline === "p") {
31
+ onChange(v.split(/\r?\n/g).map(v => "<p>" + v + "</p>").join(""));
32
+ } else {
33
+ onChange(v);
34
+ }
35
+ }, [onChange]);
36
+
37
+ const textareaRef = useRef<HTMLTextAreaElement|null>(null);
38
+ useImperativeHandle(ref, () => textareaRef.current!, []);
39
+
40
+ const debouncedUpdate = useDebounce(safeOnChange, 100, debouncerSettings);
41
+
42
+ useEffect(() => {
43
+ const id = textareaRef.current?.id;
44
+ if (id && rich && document.getElementById(id)) {
45
+ (window as any).tinymce.EditorManager.execCommand('mceAddEditor', true, id);
46
+ const editor = (window as any).tinymce.editors.findLast((e: {id: string}) => e.id === id);
47
+ editor.on('input', () => debouncedUpdate(editor.getContent()));
48
+ editor.on('NodeChange', () => debouncedUpdate(editor.getContent()));
49
+ editor.on('change', () => {
50
+ debouncedUpdate.cancel();
51
+ safeOnChange(editor.getContent());
52
+ });
53
+ return () => {
54
+ (window as any).tinymce.EditorManager.execCommand('mceRemoveEditor', true, id);
55
+ };
56
+ }
57
+ return () => {};
58
+ }, [rich, debouncedUpdate, textareaRef.current]);
59
+
60
+ return <>
61
+ <TextareaControl ref={textareaRef} {...forwardedProps} value={v} onChange={safeOnChange} />
62
+ {Messages && <Messages/>}
63
+ </>;
64
+ })
65
+ })();
@@ -0,0 +1,56 @@
1
+ import apiFetch from "@wordpress/api-fetch";
2
+ import {memo, useMemo} from "@wordpress/element";
3
+
4
+ import {basicNumericallyIdedItemPicker} from "./basicNumericallyIdedItemPicker";
5
+ import type {SNPControlSlots} from "../blocks";
6
+ import {ValidationState} from "./ExtendedFormTokenField";
7
+ import {registerSimpleGutenbergApiEndpoint} from "../editor/simple-gutenberg-endpoints-api";
8
+ import type {TokenItem} from "../lib/useful-types";
9
+
10
+ import type {ReactNode} from "react";
11
+
12
+ type ExtendedUserPickerPropsBase = {
13
+ label?: string;
14
+ help?: ReactNode;
15
+ userRoles?: string[];
16
+ placeholder?: string;
17
+ }&Partial<Pick<SNPControlSlots, 'Messages'>>;
18
+ type ExtendedUserPickerPropsSingle = ExtendedUserPickerPropsBase&{
19
+ onChange(value: string): void;
20
+ value?: string;
21
+ multiple: false;
22
+ };
23
+ type ExtendedUserPickerPropsMultiple = ExtendedUserPickerPropsBase&{
24
+ onChange(value: string[]): void;
25
+ value?: string[];
26
+ multiple?: true|undefined;
27
+ };
28
+ export type ExtendedUserPickerProps = ExtendedUserPickerPropsSingle|ExtendedUserPickerPropsMultiple;
29
+
30
+ registerSimpleGutenbergApiEndpoint(
31
+ "plaudit-common.user-table-search-options",
32
+ data => apiFetch<Array<{id: number, name: string, roles?: string[]}>>({data, method: 'POST', path: "/plaudit/common/v1/user-table-search"}),
33
+ {
34
+ transformer: users => users.map(user => ({value: user.id.toString(), title: user.name, status: ValidationState.Valid})),
35
+ maxCachedResults: 10
36
+ }
37
+ );
38
+ registerSimpleGutenbergApiEndpoint(
39
+ "plaudit-common.user-table-search-validation",
40
+ data => apiFetch<Array<{id: number, name: string, roles?: string[]}>>({data, method: 'POST', path: "/plaudit/common/v1/user-table-search"}),
41
+ {
42
+ transformer: user => user
43
+ .map((user): TokenItem => ({value: user.id.toString(), title: user.name, status: ValidationState.Valid})),
44
+ maxCachedResults: 10
45
+ }
46
+ );
47
+
48
+ export const ExtendedUserPicker = memo((props: ExtendedUserPickerProps) => {
49
+ const {userRoles, ...passthrough} = props;
50
+
51
+ const queryArgs = useMemo(() => {
52
+ return {roles: userRoles?.join(",")};
53
+ }, [userRoles]);
54
+
55
+ return basicNumericallyIdedItemPicker(passthrough, "plaudit-common.user-table-search", queryArgs);
56
+ })