@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,877 @@
1
+ import {
2
+ BaseControl,
3
+ ColorPalette,
4
+ DatePicker,
5
+ DateTimePicker,
6
+ Disabled,
7
+ RadioControl,
8
+ RangeControl,
9
+ SelectControl,
10
+ TextControl,
11
+ ToggleControl,
12
+ useBaseControlProps,
13
+ __experimentalToggleGroupControl as ToggleGroupControl
14
+ } from "@wordpress/components";
15
+ import {dispatch, select} from "@wordpress/data";
16
+ import {useCallback, useMemo, useRef} from "@wordpress/element";
17
+ import {applyFilters} from "@wordpress/hooks";
18
+
19
+ import {
20
+ ExtendedPostPicker, ExtendedRadioControl, ImageControl, type ImageData,
21
+ ExtendedTextareaControl, MultiSelectControl, type Dict,
22
+ ProperLinkControl, SortableItemsControl, type PickableOptions,
23
+ FullSizeToggleControl, ToggleGroupControlOptionWithOptionalIcon, ExtendedTaxonomyPicker, ExtendedTermPicker, ExtendedUserPicker
24
+ } from "../controls";
25
+ import {normalizePickableOptionsToObjects, normalizePickableOptionsToPairs} from "../controls/shared";
26
+ import {useSuspendableOptions} from "./hooks/useSuspendableOptions";
27
+ import {makeToolsPanelContextValue, ToolsPanelContext} from "./layout/ToolsPanelContext";
28
+ import {clone} from "../lib/helpers";
29
+ import {arrayIsNotEmpty, BlockName} from "../lib/useful-types";
30
+ import type {CSNPControlComponentProps} from "./shared-internal-types";
31
+ import {
32
+ GenericSimpleNativeProperty,
33
+ HydratedSimpleNativeProperty, PDSimpleNativeProperty, SNPControlProps, SNPControlSlots
34
+ } from "./simple-native-property-api";
35
+ import {SNPFlexibleItemsListComponent} from "./SNPFlexibleItemsListComponent";
36
+ import {SNPGroupComponent} from "./SNPGroupComponent";
37
+ import {SNPListComponent} from "./SNPListComponent";
38
+
39
+ import type {ComponentPropsWithoutRef, CSSProperties} from "react";
40
+ import {
41
+ CSNPConfig, FlexibleItemsListPropertyConfig, getPropType, isObjectListPropertyConfig, isStringValuedToggleGroupCSNPConfig,
42
+ ObjectListPropertyConfig, PostPropertyCSNPConfig, RadioPropertyCSNPConfig, SelectPropertyCSNPConfig, ShareableSNPElements,
43
+ TaxonomyPropertyCSNPConfig, TermPropertyCSNPConfig, UserPropertyCSNPConfig
44
+ } from "./csnp-api";
45
+
46
+ export type OutsideHydrationInfo = {forLayeredStyles: boolean, blockName: BlockName};
47
+ export function hydrateSimpleNativeProperty(
48
+ config: PDSimpleNativeProperty, parentPath: string, outsideHydrationInfo: OutsideHydrationInfo, parentTypes: string[]
49
+ ): HydratedSimpleNativeProperty {
50
+ const propPath = parentPath.length !== 0 ? parentPath + "." + config.name : config.name;
51
+ if (parentPath.length === 0) {
52
+ config = injectBlockSourcedDefault(config, outsideHydrationInfo.blockName);
53
+ }
54
+
55
+ config = applyFilters('plaudit.gutenbergApiExtensions.simpleNativeProperties.field', config, outsideHydrationInfo.blockName, propPath) as typeof config;
56
+ const res = typeof config.control === 'string'
57
+ ? hydrateDesiccatedSimpleNativeProperty(config, propPath, outsideHydrationInfo, parentTypes) : config;
58
+ validateAndRecordPotentialStyleProperty(res, propPath, outsideHydrationInfo, parentTypes);
59
+ return res;
60
+ }
61
+ function validateAndRecordPotentialStyleProperty(
62
+ config: HydratedSimpleNativeProperty, propPath: string, {forLayeredStyles, blockName}: OutsideHydrationInfo, parentTypes: string[]
63
+ ) {
64
+ if ("styleProperty" in config && config.styleProperty !== undefined) {
65
+ if (parentTypes.includes('array')) {
66
+ console.error(`A SNP was configured with a styleProperty, but it is within an array-type SNP. This is unsupported`, "SNP in error:", config);
67
+ } else {
68
+ dispatch('plaudit/gutenberg-api-extensions')
69
+ .addOrUpdateExtraPropTransform(blockName, propPath, {propName: config.name, forLayeredStyles, styleProperty: config.styleProperty});
70
+ }
71
+ }
72
+ }
73
+ function injectBlockSourcedDefault(config: PDSimpleNativeProperty, blockName: BlockName): typeof config {
74
+ if (config.default === undefined) {
75
+ const existingAttr = select('plaudit/gutenberg-api-extensions').baselineBlockAttrs(blockName)?.attributes?.[config.name];
76
+ if (existingAttr && typeof existingAttr === 'object' && 'default' in existingAttr) {
77
+ if (existingAttr.default !== undefined) {
78
+ const expectedPropType = getPropType(config);
79
+ if (expectedPropType === 'array' ? Array.isArray(existingAttr.default) : (typeof existingAttr.default) === expectedPropType) {
80
+ return {...config, default: clone<any>(existingAttr.default)};
81
+ } else {
82
+ console.error('Encountered a preexisting default value on a block that does not overlap with the datatype for an SNP');
83
+ }
84
+ }
85
+ }
86
+ }
87
+ return config;
88
+ }
89
+
90
+ type PassthroughPropsType = Pick<PDSimpleNativeProperty, 'condition'|'name'|'label'|'required'>&{controlType: string, styleProperty?: string};
91
+ function hydrateDesiccatedSimpleNativeProperty(
92
+ config: CSNPConfig, propPath: string, outsideHydrationInfo: OutsideHydrationInfo, parentTypes: string[]
93
+ ): HydratedSimpleNativeProperty {
94
+ const passthroughProps: PassthroughPropsType = {
95
+ condition: config.condition, label: config.label, name: config.name, required: config.required, controlType: config.control,
96
+ styleProperty: config.styleProperty
97
+ };
98
+ switch (config.control) {
99
+ case "colorPalette":
100
+ return {
101
+ type: 'string',
102
+ default: config.default,
103
+ alwaysStore: config.alwaysStore,
104
+ ...passthroughProps,
105
+ validator: config.validator,
106
+ transformer: config.transformer,
107
+ control({value, onChange, slots: {Label, Messages}}) {
108
+ const resolvedOptions = useSuspendableOptions(config);
109
+ const {colors, valueToColor, colorToValue} = useMemo(() => {
110
+ const normalizedOptions = normalizePickableOptionsToObjects(resolvedOptions);
111
+ const options = normalizedOptions.map(opt => {
112
+ if (hasDefinedKey(opt, 'color') && CSS.supports('color', opt.color)) {
113
+ return opt;
114
+ } else if (CSS.supports('color', opt.value)) {
115
+ return {...opt, color: opt.value};
116
+ } else if (CSS.supports('color', '#' + opt.value)) {
117
+ return {...opt, color: '#' + opt.value};
118
+ } else {
119
+ console.error(`The color property was ${opt.color ? "invalid" : "not set"} and value could not be converted to a valid CSS color.`,
120
+ "The color will be displayed as transparent.", "Option in error:", opt);
121
+ return {...opt, color: 'transparent'};
122
+ }
123
+ });
124
+
125
+ return {
126
+ colors: options.map(({value, label = value, color}) => ({color, name: label})),
127
+ valueToColor: Object.fromEntries(options.map(opt => [opt.value, opt.color])) as Dict<CSSProperties['color']>,
128
+ colorToValue: Object.fromEntries(options.map(opt => [opt.color, opt.value])) as Record<NonNullable<CSSProperties['color']>, string>
129
+ };
130
+ }, [resolvedOptions]);
131
+
132
+ const safeOnChange = useCallback((v: string|undefined) => onChange(v ? colorToValue[v] : undefined), [colorToValue, onChange]);
133
+
134
+ const {baseControlProps, controlProps} = useBaseControlProps({label: <Label />, help: config.help});
135
+ return <BaseControl {...baseControlProps}>
136
+ <ColorPalette
137
+ {...config.component}
138
+ {...controlProps}
139
+ value={value ? valueToColor[value] : undefined}
140
+ onChange={safeOnChange}
141
+ colors={colors}
142
+ clearable={config.clearable ?? false}
143
+ disableCustomColors={config.allowCustom !== true}
144
+ __experimentalIsRenderedInSidebar={true}
145
+ />
146
+ <Messages />
147
+ </BaseControl>;
148
+ }
149
+ };
150
+ case "constant":
151
+ return {
152
+ type: config.type as any,
153
+ default: config.default,
154
+ alwaysStore: true,
155
+ ...passthroughProps,
156
+ validator: config.validator,
157
+ transformer: config.transformer as any,
158
+ control({value, slots: {Label, Messages}}: SNPControlProps<any>) {
159
+ const {current: voidChangeHandler} = useRef(() => {});
160
+ return <Disabled>
161
+ <TextControl {...config.component} value={value} onChange={voidChangeHandler} label={<Label />} help={config.help} disabled={true} />
162
+ <Messages />
163
+ </Disabled>;
164
+ }
165
+ };
166
+ case "date":
167
+ return {
168
+ type: 'number',
169
+ default: config.default,
170
+ alwaysStore: config.alwaysStore,
171
+ ...passthroughProps,
172
+ validator: config.validator,
173
+ transformer: config.transformer,
174
+ control({value, onChange, slots: {Label, Messages}}) {
175
+ const safeOnChange = useCallback((v: string|null) => onChange(v === null ? undefined : new Date(v).getTime()), [onChange]);
176
+ return <BaseControl id="" label={<Label />} help={config.help}>
177
+ {config.time
178
+ ? <DateTimePicker {...config.component} currentDate={value ?? null} onChange={safeOnChange} />
179
+ : <DatePicker {...config.component} currentDate={value ?? null} onChange={safeOnChange} />
180
+ }
181
+ <Messages />
182
+ </BaseControl>;
183
+ }
184
+ }
185
+ case "group":
186
+ registerPlainTextLabelRequiredMarker("post", " > .components-tools-panel > .components-tools-panel-header > *");
187
+ const currentTypes = parentTypes.toSpliced(parentTypes.length - 1, 0, 'object');
188
+ const hydratedProperties = (config.fields ?? [])
189
+ .map(property => hydrateSimpleNativeProperty(property, propPath, outsideHydrationInfo, currentTypes));
190
+ if (config.default !== undefined) {
191
+ if (parentTypes.length !== 0) {
192
+ console.error("Non-root groups should not have default values set.",
193
+ "The resulting behavior is undefined and almost guaranteed to break.");
194
+ } else if (hydratedProperties.some(prop => prop.name in config.default!)) {
195
+ console.error("Groups should not have default values that conflict with their contained fields set.",
196
+ "The resulting behavior is undefined and almost guaranteed to break.");
197
+ }
198
+ }
199
+ const actualDefaultValues: {[key in string]: unknown} = {};
200
+ if (config.interface === 'toolsPanel') {
201
+ for (const hydratedProperty of hydratedProperties) {
202
+ actualDefaultValues[hydratedProperty.name] = hydratedProperty.default;
203
+ hydratedProperty.default = undefined;
204
+ }
205
+ }
206
+ return {
207
+ type: 'object',
208
+ alwaysStore: config.alwaysStore,
209
+ default: config.default,
210
+ children: hydratedProperties,
211
+ ...passthroughProps,
212
+ validator: config.validator,
213
+ transformer: config.transformer,
214
+ control({value, onChange, slots}: SNPControlProps<Dict<any>>) {
215
+ return <ToolsPanelContext.Provider value={makeToolsPanelContextValue(actualDefaultValues)}>
216
+ <SNPGroupComponent config={config} hydratedProperties={hydratedProperties} onChange={onChange} value={value} {...slots} />
217
+ </ToolsPanelContext.Provider>;
218
+ }
219
+ };
220
+ case "image":
221
+ return {
222
+ type: 'object',
223
+ alwaysStore: config.alwaysStore,
224
+ default: undefined,
225
+ ...passthroughProps,
226
+ validator: config.validator,
227
+ transformer: config.transformer,
228
+ control({value, onChange, slots}: SNPControlProps<ImageData>) {
229
+ return <ImageControl includeFocalPointPicker={config.includeFocalPointPicker} storage={config.storage} label={config.label} help={config.help} onChange={onChange} value={value} {...slots} />;
230
+ }
231
+ } as GenericSimpleNativeProperty<ImageData, 'object'>;
232
+ case "link":
233
+ return {
234
+ type: 'object',
235
+ default: config.default,
236
+ alwaysStore: config.alwaysStore,
237
+ ...passthroughProps,
238
+ validator: config.validator,
239
+ transformer: config.transformer,
240
+ control({value, onChange, slots: {Label, Messages}}) {
241
+ return <>
242
+ <ProperLinkControl
243
+ {...config.component}
244
+ hasRichPreviews
245
+ hasTextControl
246
+ help={config.help}
247
+ label={<Label />}
248
+ onChange={onChange}
249
+ settings={config.settings === false || config.settings === undefined ? false : (config.settings === true ? ProperLinkControl.DEFAULT_LINK_SETTINGS : config.settings)}
250
+ value={value}
251
+ />
252
+ <Messages />
253
+ </>;
254
+ }
255
+ };
256
+ case "list":
257
+ const sharedProps: ShareableSNPElements<'array'> = {...passthroughProps, type: 'array', alwaysStore: config.alwaysStore};
258
+ switch (config.itemType) {
259
+ case undefined:
260
+ case "string":
261
+ return {
262
+ ...sharedProps,
263
+ default: config.default,
264
+ type: 'array',
265
+ validator: config.validator,
266
+ transformer: config.transformer,
267
+ control({value, onChange, slots}) {
268
+ const children = useCallback((datum: any, onDatumChange: (datum: any) => void) => {
269
+ return <TextControl {...config.listComponent} value={datum} onChange={onDatumChange}/>;
270
+ }, [config.listComponent]);
271
+ return <SortableItemsControl {...config.component} {...slots}
272
+ value={value} onChange={onChange} min={config.min} max={config.max} label={config.label}
273
+ help={config.help} emptyValue={config.emptyValue ?? ''} children={children}
274
+ />;
275
+ }
276
+ };
277
+ case "float":
278
+ case "int":
279
+ case "integer":
280
+ return {
281
+ ...sharedProps,
282
+ default: config.default,
283
+ type: 'array',
284
+ validator: config.validator,
285
+ transformer: config.transformer,
286
+ control({value, onChange, slots}) {
287
+ const children = useCallback((datum: any, onDatumChange: (datum: any) => void) => {
288
+ return <NumberLikeListTextControl listComponent={config.listComponent} datum={datum} itemType={config.itemType} onDatumChange={onDatumChange} />;
289
+ }, [config.listComponent, config.itemType]);
290
+ return <SortableItemsControl {...config.component} {...slots}
291
+ value={value} onChange={onChange} min={config.min} max={config.max} label={config.label}
292
+ help={config.help} emptyValue={config.emptyValue ?? 0} children={children}
293
+ />;
294
+ }
295
+ };
296
+ default:
297
+ const currentTypes = parentTypes.toSpliced(parentTypes.length - 1, 0, 'array');
298
+ if (isObjectListPropertyConfig(config)) {
299
+ const hydratedProperties = config.itemType
300
+ .map(property => hydrateSimpleNativeProperty(property, propPath, outsideHydrationInfo, currentTypes));
301
+ const def = config.default ?? [];
302
+ return {
303
+ ...sharedProps,
304
+ children: hydratedProperties,
305
+ default: def, // This type-checks, but directly inlining the value doesn't
306
+ validator: config.validator,
307
+ transformer: config.transformer,
308
+ control({value, onChange, slots}) {
309
+ return <SNPListComponent config={config as ObjectListPropertyConfig} onChange={onChange} value={value}
310
+ hydratedProperties={hydratedProperties} {...slots} />;
311
+ }
312
+ }
313
+ } else {
314
+ const sharedProperties = config.sharedProperties;
315
+ const completedItemTypes = sharedProperties?.length
316
+ ? Object.fromEntries(Object.entries(config.itemType)
317
+ .map(([key, v]) => [key, {...v, properties: [...sharedProperties, ...v.properties]}]))
318
+ : config.itemType;
319
+ const availableTypes = Object.entries(completedItemTypes)
320
+ .map(([value, {label}]) => ({value, label}));
321
+ if (!arrayIsNotEmpty(availableTypes)) {
322
+ return invalidConfigMessageControl(config, passthroughProps, "Flexible Items lists must defined at least one item type.");
323
+ }
324
+
325
+ const invalidFlexibleItemDefinition = Object.values(completedItemTypes)
326
+ .find(({properties}) => properties.some(property => property.name === 'type'));
327
+ if (invalidFlexibleItemDefinition) {
328
+ return invalidConfigMessageControl(config, passthroughProps, "Flexible item definitions CANNOT include a property named 'type'");
329
+ }
330
+ const hydratedProperties = Object.fromEntries(
331
+ Object.entries(completedItemTypes)
332
+ .map(([itemType, {properties}]) => {
333
+ return [itemType, properties
334
+ .map(property => hydrateSimpleNativeProperty(property, propPath, outsideHydrationInfo, currentTypes))]
335
+ })
336
+ );
337
+ const emptyValues = Object.fromEntries(
338
+ Object.entries(completedItemTypes).map(([itemType, {emptyValue}]) => {
339
+ return [itemType, {...emptyValue, type: itemType}];
340
+ }));
341
+ const def = config.default ?? [];
342
+ return {
343
+ ...sharedProps,
344
+ children: hydratedProperties,
345
+ default: def, // This type-checks, but directly inlining the value doesn't
346
+ validator: config.validator,
347
+ transformer: config.transformer,
348
+ control({value, onChange, slots}) {
349
+ return <SNPFlexibleItemsListComponent
350
+ config={config as FlexibleItemsListPropertyConfig} onChange={onChange} value={value} emptyValues={emptyValues}
351
+ hydratedProperties={hydratedProperties} availableTypes={availableTypes} {...slots}
352
+ />;
353
+ }
354
+ }
355
+ }
356
+ }
357
+ case "number":
358
+ return {
359
+ type: 'number',
360
+ default: config.default,
361
+ alwaysStore: config.alwaysStore,
362
+ ...passthroughProps,
363
+ validator: config.validator,
364
+ transformer: config.transformer,
365
+ control({value, onChange, slots: {Label, Messages}}) {
366
+ const safeOnChange = useCallback((v: string) => onChange(float ? parseFloat(v) : parseInt(v)), [onChange]);
367
+ const float = config.float || config.step === 'any'
368
+ || (config.min !== undefined && !Number.isInteger(config.min))
369
+ || (config.max !== undefined && !Number.isInteger(config.max))
370
+ || (config.step !== undefined && !Number.isInteger(config.step));
371
+ return <>
372
+ <TextControl {...config.component}
373
+ type="number" value={value ?? ''} min={config.min} max={config.max} step={config.step ?? (float ? "any" : undefined)}
374
+ onChange={safeOnChange} label={<Label />} help={config.help} placeholder={config.placeholder}
375
+ />
376
+ <Messages />
377
+ </>;
378
+ }
379
+ };
380
+ case "post":
381
+ registerPlainTextLabelRequiredMarker("post", " > .components-form-token-field .components-form-token-field__label");
382
+ return hydratePostProperty(config);
383
+ case "radio":
384
+ return {
385
+ type: 'string',
386
+ enum: config.enum,
387
+ default: config.default,
388
+ alwaysStore: config.alwaysStore,
389
+ ...passthroughProps,
390
+ validator: config.validator,
391
+ transformer: config.transformer,
392
+ control({value, onChange, slots}) {
393
+ return <PotentiallyExtendedRadioControl config={config} onChange={onChange} value={value} {...slots} />;
394
+ }
395
+ };
396
+ case "range":
397
+ registerPlainTextLabelRequiredMarker("range", " > .components-range-control > .components-base-control__field > .components-base-control__label");
398
+ return {
399
+ type: 'number',
400
+ enum: config.enum,
401
+ default: config.default,
402
+ alwaysStore: config.alwaysStore,
403
+ ...passthroughProps,
404
+ validator: config.validator,
405
+ transformer: config.transformer,
406
+ control({value, onChange, slots: {Messages}}) {
407
+ return <>
408
+ <RangeControl
409
+ {...config.component} value={value} onChange={onChange} min={config.min} max={config.max} label={config.label}
410
+ step={config.step} help={config.help}
411
+ />
412
+ <Messages />
413
+ </>;
414
+ }
415
+ };
416
+ case "select":
417
+ registerPlainTextLabelRequiredMarker("select", " > .components-form-token-field .components-form-token-field__label");
418
+ return hydrateSelectProperty(config);
419
+ case "taxonomy":
420
+ registerPlainTextLabelRequiredMarker("taxonomy", " > .components-form-token-field .components-form-token-field__label");
421
+ return hydrateTaxonomyProperty(config);
422
+ case "term":
423
+ registerPlainTextLabelRequiredMarker("term", " > .components-form-token-field .components-form-token-field__label");
424
+ return hydrateTermProperty(config);
425
+ case "textarea":
426
+ return {
427
+ type: 'string',
428
+ default: config.default,
429
+ alwaysStore: config.alwaysStore,
430
+ ...passthroughProps,
431
+ validator: config.validator,
432
+ transformer: config.transformer,
433
+ control({value, onChange, slots}) {
434
+ return <ExtendedTextareaControl {...config} value={value} onChange={onChange} {...slots} />;
435
+ }
436
+ };
437
+ case "text":
438
+ return {
439
+ type: 'string',
440
+ default: config.default,
441
+ alwaysStore: config.alwaysStore,
442
+ ...passthroughProps,
443
+ validator: config.validator,
444
+ transformer: config.transformer,
445
+ control({value, onChange, slots: {Label, Messages}}) {
446
+ return <>
447
+ <TextControl {...config.component} value={value ?? ''} onChange={onChange} label={<Label />} help={config.help} placeholder={config.placeholder} />
448
+ <Messages />
449
+ </>;
450
+ }
451
+ };
452
+ case "toggle":
453
+ registerPlainTextLabelRequiredMarker("toggle", ToggleGroupControlLabelSelector);
454
+ return {
455
+ type: 'boolean',
456
+ default: config.default,
457
+ alwaysStore: config.alwaysStore,
458
+ ...passthroughProps,
459
+ validator: config.validator,
460
+ transformer: config.transformer,
461
+ control({value, onChange, slots: {Label, Messages}}) {
462
+ const switchCfg = useMemo(() => config.switch ?? {}, [config.switch]);
463
+ if (switchCfg.small === true) {
464
+ return <>
465
+ <ToggleControl {...config.component as Partial<ComponentPropsWithoutRef<typeof ToggleControl>>} checked={value} onChange={onChange} label={<Label />} help={config.help} />
466
+ <Messages />
467
+ </>;
468
+ } else {
469
+ return <>
470
+ <FullSizeToggleControl
471
+ componentConfig={config.component as Partial<ComponentPropsWithoutRef<typeof ToggleGroupControl>>} label={config.label} help={config.help}
472
+ onChange={onChange} switchCfg={switchCfg} value={value} />
473
+ <Messages />
474
+ </>;
475
+ }
476
+ }
477
+ };
478
+ case "toggleGroup":
479
+ registerPlainTextLabelRequiredMarker("toggleGroup", ToggleGroupControlLabelSelector);
480
+ if (isStringValuedToggleGroupCSNPConfig(config)) {
481
+ return {
482
+ type: 'string',
483
+ default: config.default,
484
+ alwaysStore: config.alwaysStore,
485
+ ...passthroughProps,
486
+ validator: config.validator,
487
+ transformer: config.transformer,
488
+ control({value, onChange, slots: {Messages}}) {
489
+ const unsuspendedOptions = useSuspendableOptions(config);
490
+ const options = useMemo(() => {
491
+ return normalizePickableOptionsToPairs(unsuspendedOptions);
492
+ }, [unsuspendedOptions]);
493
+ const safeOnChange = useCallback((v: string|number|undefined) => onChange(v?.toString()), [onChange]);
494
+ return <>
495
+ <ToggleGroupControl
496
+ {...config.component} value={value} onChange={safeOnChange} label={config.label} help={config.help} isBlock isDeselectable={config.clearable ?? false}
497
+ children={options.map(([value, label]) => {
498
+ return <ToggleGroupControlOptionWithOptionalIcon key={value} value={value} label={label}/>;
499
+ })}
500
+ />
501
+ <Messages />
502
+ </>;
503
+ }
504
+ };
505
+ } else {
506
+ return {
507
+ type: 'number',
508
+ default: config.default,
509
+ alwaysStore: config.alwaysStore,
510
+ ...passthroughProps,
511
+ validator: config.validator,
512
+ transformer: config.transformer,
513
+ control({value, onChange, slots: {Messages}}) {
514
+ const unsuspendedOptions = useSuspendableOptions(config);
515
+ const options = useMemo(() => {
516
+ return normalizePickableOptionsToPairs(unsuspendedOptions);
517
+ }, [unsuspendedOptions]);
518
+ const safeOnChange = useCallback(
519
+ (v: string|number|undefined) => onChange(v === undefined || typeof v === 'number' ? v : (v.includes('.') ? parseFloat(v) : parseInt(v))),
520
+ [onChange]);
521
+ return <>
522
+ <ToggleGroupControl
523
+ {...config.component} value={value} label={config.label} help={config.help} isBlock isDeselectable={config.clearable ?? false}
524
+ onChange={safeOnChange}
525
+ >
526
+ {...options.map(([value, label]) =>
527
+ (<ToggleGroupControlOptionWithOptionalIcon key={value} value={value} label={label} />))}
528
+ </ToggleGroupControl>
529
+ <Messages />
530
+ </>;
531
+ }
532
+ };
533
+ }
534
+ case "user":
535
+ registerPlainTextLabelRequiredMarker("user", " > .components-form-token-field .components-form-token-field__label");
536
+ return hydrateUserProperty(config);
537
+ default:
538
+ console.error("Invalid control name:", (config as any).control, "\nFalling back to a minimally-configured text control.");
539
+ return hydrateDesiccatedSimpleNativeProperty({
540
+ control: "text",
541
+ name: (config as any).name,
542
+ label: (config as any).label
543
+ }, propPath, outsideHydrationInfo, parentTypes);
544
+ }
545
+ }
546
+ const ToggleGroupControlLabelSelector: string = " > .components-base-control > .components-base-control__field:has(> [data-wp-component='ToggleGroupControl']) .components-base-control__label";
547
+
548
+ type NumberLikeListTextControlProps = {listComponent?: ComponentPropsWithoutRef<typeof TextControl>, datum: string, itemType: string, onDatumChange(value: any): void};
549
+ function NumberLikeListTextControl({listComponent, datum, itemType, onDatumChange}: NumberLikeListTextControlProps) {
550
+ const onChange = useCallback((v: string) => onDatumChange(itemType !== 'float' ? parseInt(v) : parseFloat(v)), [itemType, onDatumChange])
551
+ return <TextControl {...listComponent} type="number" value={datum} onChange={onChange} />
552
+ }
553
+
554
+ type PotentiallyExtendedRadioControlProps = CSNPControlComponentProps<RadioPropertyCSNPConfig, string>&SNPControlSlots;
555
+ function PotentiallyExtendedRadioControl({config, value, onChange, Label, Messages}: PotentiallyExtendedRadioControlProps) {
556
+ const unsuspendedOptions = useSuspendableOptions(config);
557
+ const options = useAsOptions(unsuspendedOptions, value);
558
+
559
+ if (config.allowCustom) {
560
+ return <ExtendedRadioControl {...config.component} selected={value} onChange={onChange} options={options} label={config.label} help={config.help}
561
+ allowCustom={true} Label={Label} Messages={Messages} />;
562
+ } else {
563
+ return <>
564
+ <RadioControl {...config.component} selected={value} onChange={onChange} options={options} label={Label ? <Label /> : config.label} help={config.help} />
565
+ <Messages />
566
+ </>;
567
+ }
568
+ }
569
+
570
+ export function hydratePostProperty(config: PostPropertyCSNPConfig): HydratedSimpleNativeProperty {
571
+ if (config.multiple) {
572
+ return {
573
+ name: config.name,
574
+ type: 'array',
575
+ default: config.default,
576
+ condition: config.condition,
577
+ alwaysStore: config.alwaysStore,
578
+ required: config.required,
579
+ validator: config.validator,
580
+ transformer: config.transformer,
581
+ controlType: 'post',
582
+ control({value, onChange, slots: {Messages}}: SNPControlProps<number[]>) {
583
+ const safeOnChange = useCallback((v: string[]) => onChange(v.map(v => parseInt(v))), [onChange]);
584
+ const safeValue = useMemo(() => value?.map(v => v.toString()), [value]);
585
+ return <ExtendedPostPicker
586
+ {...config.component}
587
+ multiple={true}
588
+ label={config.label}
589
+ help={config.help}
590
+ value={safeValue}
591
+ onChange={safeOnChange}
592
+ postTypes={config.postTypes}
593
+ Messages={Messages}
594
+ />;
595
+ }
596
+ };
597
+ } else {
598
+ return {
599
+ name: config.name,
600
+ type: 'number',
601
+ default: config.default,
602
+ condition: config.condition,
603
+ alwaysStore: config.alwaysStore,
604
+ required: config.required,
605
+ validator: config.validator,
606
+ transformer: config.transformer,
607
+ controlType: 'post',
608
+ control({value, onChange, slots: {Messages}}: SNPControlProps<number>) {
609
+ return <ExtendedPostPicker
610
+ {...config.component}
611
+ multiple={false}
612
+ label={config.label}
613
+ help={config.help}
614
+ value={value?.toString()}
615
+ onChange={useCallback(v => onChange(parseInt(v)), [onChange])}
616
+ postTypes={config.postTypes}
617
+ Messages={Messages}
618
+ />;
619
+ }
620
+ };
621
+ }
622
+ }
623
+
624
+ export function hydrateUserProperty(config: UserPropertyCSNPConfig): HydratedSimpleNativeProperty {
625
+ if (config.multiple) {
626
+ return {
627
+ name: config.name,
628
+ type: 'array',
629
+ default: config.default,
630
+ condition: config.condition,
631
+ alwaysStore: config.alwaysStore,
632
+ required: config.required,
633
+ validator: config.validator,
634
+ transformer: config.transformer,
635
+ controlType: 'user',
636
+ control({value, onChange, slots: {Messages}}: SNPControlProps<number[]>) {
637
+ const safeOnChange = useCallback((v: string[]) => onChange(v.map(v => parseInt(v))), [onChange]);
638
+ const safeValue = useMemo(() => value?.map(v => v.toString()), [value]);
639
+ return <ExtendedUserPicker
640
+ {...config.component}
641
+ multiple={true}
642
+ label={config.label}
643
+ help={config.help}
644
+ value={safeValue}
645
+ onChange={safeOnChange}
646
+ userRoles={config.userRoles}
647
+ Messages={Messages}
648
+ />;
649
+ }
650
+ };
651
+ } else {
652
+ return {
653
+ name: config.name,
654
+ type: 'number',
655
+ default: config.default,
656
+ condition: config.condition,
657
+ alwaysStore: config.alwaysStore,
658
+ required: config.required,
659
+ validator: config.validator,
660
+ transformer: config.transformer,
661
+ controlType: 'user',
662
+ control({value, onChange, slots: {Messages}}: SNPControlProps<number>) {
663
+ return <ExtendedUserPicker
664
+ {...config.component}
665
+ multiple={false}
666
+ label={config.label}
667
+ help={config.help}
668
+ value={value?.toString()}
669
+ onChange={useCallback(v => onChange(parseInt(v)), [onChange])}
670
+ userRoles={config.userRoles}
671
+ Messages={Messages}
672
+ />;
673
+ }
674
+ };
675
+ }
676
+ }
677
+
678
+ export function hydrateTaxonomyProperty(config: TaxonomyPropertyCSNPConfig): HydratedSimpleNativeProperty {
679
+ if (config.multiple === false) {
680
+ return {
681
+ name: config.name,
682
+ type: 'string',
683
+ default: config.default,
684
+ condition: config.condition,
685
+ alwaysStore: config.alwaysStore,
686
+ required: config.required,
687
+ validator: config.validator,
688
+ transformer: config.transformer,
689
+ controlType: 'taxonomy',
690
+ control({value, onChange, slots: {Messages}}) {
691
+ return <ExtendedTaxonomyPicker
692
+ {...config.component}
693
+ multiple={false}
694
+ label={config.label}
695
+ help={config.help}
696
+ value={value}
697
+ visibility={config.visibility}
698
+ onChange={onChange}
699
+ Messages={Messages}
700
+ />;
701
+ }
702
+ };
703
+ } else {
704
+ return {
705
+ name: config.name,
706
+ type: 'array',
707
+ default: config.default,
708
+ condition: config.condition,
709
+ alwaysStore: config.alwaysStore,
710
+ required: config.required,
711
+ validator: config.validator,
712
+ transformer: config.transformer,
713
+ controlType: 'taxonomy',
714
+ control({value, onChange, slots: {Messages}}: SNPControlProps<string[]>) {
715
+ return <ExtendedTaxonomyPicker
716
+ {...config.component}
717
+ multiple={true}
718
+ label={config.label}
719
+ help={config.help}
720
+ value={value}
721
+ visibility={config.visibility}
722
+ onChange={onChange}
723
+ Messages={Messages}
724
+ />;
725
+ }
726
+ };
727
+ }
728
+ }
729
+
730
+ export function hydrateTermProperty(config: TermPropertyCSNPConfig): HydratedSimpleNativeProperty {
731
+ if (config.multiple === false) {
732
+ return {
733
+ name: config.name,
734
+ type: 'string',
735
+ default: config.default,
736
+ condition: config.condition,
737
+ alwaysStore: config.alwaysStore,
738
+ required: config.required,
739
+ validator: config.validator,
740
+ transformer: config.transformer,
741
+ controlType: 'taxonomy',
742
+ control({value, onChange, slots: {Messages}}) {
743
+ return <ExtendedTermPicker
744
+ {...config.component}
745
+ multiple={false}
746
+ label={config.label}
747
+ help={config.help}
748
+ value={value}
749
+ taxonomy={config.taxonomy}
750
+ onChange={onChange}
751
+ Messages={Messages}
752
+ />;
753
+ }
754
+ };
755
+ } else {
756
+ return {
757
+ name: config.name,
758
+ type: 'array',
759
+ default: config.default,
760
+ condition: config.condition,
761
+ alwaysStore: config.alwaysStore,
762
+ required: config.required,
763
+ validator: config.validator,
764
+ transformer: config.transformer,
765
+ controlType: 'taxonomy',
766
+ control({value, onChange, slots: {Messages}}: SNPControlProps<string[]>) {
767
+ return <ExtendedTermPicker
768
+ {...config.component}
769
+ multiple={true}
770
+ label={config.label}
771
+ help={config.help}
772
+ value={value}
773
+ taxonomy={config.taxonomy}
774
+ onChange={onChange}
775
+ Messages={Messages}
776
+ />;
777
+ }
778
+ };
779
+ }
780
+ }
781
+
782
+ function hydrateSelectProperty(config: SelectPropertyCSNPConfig): HydratedSimpleNativeProperty {
783
+ if (config.multiple) {
784
+ return {
785
+ name: config.name,
786
+ label: config.label,
787
+ type: 'array',
788
+ default: config.default,
789
+ condition: config.condition,
790
+ alwaysStore: config.alwaysStore,
791
+ required: config.required,
792
+ validator: config.validator,
793
+ transformer: config.transformer,
794
+ controlType: 'select',
795
+ control({value, onChange, slots: {Messages}}) {
796
+ return <MultiSelectControl value={value ?? config.default} onChange={onChange} options={useSuspendableOptions(config)} label={config.label}
797
+ help={config.help} expandOnFocus={config.expandOnFocus} Messages={Messages} maxLength={config.maxLength} />;
798
+ }
799
+ };
800
+ } else {
801
+ return {
802
+ name: config.name,
803
+ label: config.label,
804
+ type: 'string',
805
+ enum: config.enum,
806
+ default: config.default,
807
+ condition: config.condition,
808
+ alwaysStore: config.alwaysStore,
809
+ required: config.required,
810
+ validator: config.validator,
811
+ transformer: config.transformer,
812
+ controlType: 'select',
813
+ control({value, onChange, slots: {Label, Messages}}) {
814
+ const normalizedOptions = useAsOptions(useSuspendableOptions(config), value, config.clearable ? '' : undefined);
815
+ return <>
816
+ <SelectControl value={value ?? config.default ?? ''} onChange={onChange} options={normalizedOptions} label={<Label />} help={config.help}/>
817
+ <Messages />
818
+ </>;
819
+ }
820
+ };
821
+ }
822
+ }
823
+
824
+ function useAsOptions<T extends string|number>(options: PickableOptions<T>, currentValue: T|undefined|null, noSelectionValue?: T) {
825
+ const normalizedOptions = useMemo(() => asOptions(options, noSelectionValue), [options, noSelectionValue]);
826
+ return useMemo(() => {
827
+ if ((currentValue !== undefined && currentValue !== null) && !normalizedOptions.find(opt => opt.value === currentValue)) {
828
+ if (noSelectionValue !== undefined && !normalizedOptions.some(opt => !opt.value)) {
829
+ return [normalizedOptions[0]!, {value: currentValue, label: currentValue.toString(), disabled: true}, ...normalizedOptions.slice(1)];
830
+ } else {
831
+ return [{value: currentValue, label: currentValue.toString(), disabled: true}, ...normalizedOptions];
832
+ }
833
+ }
834
+ return normalizedOptions;
835
+ }, [normalizedOptions, currentValue]);
836
+ }
837
+ function asOptions<T extends string|number>(options: PickableOptions<T>, noSelectionValue?: T) {
838
+ const res: Array<{ value: T, label: string, disabled?: boolean }> = normalizePickableOptionsToPairs(options)
839
+ .map(opt => ({value: opt[0], label: (typeof opt[1] === 'string' ? opt[1] : opt[1].text) ?? opt[0].toString()}));
840
+ if (noSelectionValue !== undefined && !res.some(opt => !opt.value)) {
841
+ res.splice(0, 0, {value: noSelectionValue, label: "-- No Selection --"});
842
+ }
843
+ return res;
844
+ }
845
+
846
+ function hasDefinedKey<O extends object, K extends keyof O>(obj: O, key: K): obj is O&Required<Pick<O, K>> {
847
+ return obj[key] !== undefined;
848
+ }
849
+
850
+ function invalidConfigMessageControl(config: CSNPConfig, passthroughProps: PassthroughPropsType, message: string) {
851
+ return {
852
+ type: 'string',
853
+ default: config.default,
854
+ alwaysStore: true,
855
+ ...passthroughProps,
856
+ validator: config.validator,
857
+ transformer: config.transformer,
858
+ control() {
859
+ return <Disabled>
860
+ <p>Invalid configuration for {config.label}: {message}</p>
861
+ </Disabled>;
862
+ }
863
+ } as any;
864
+ }
865
+
866
+ export function registerPlainTextLabelRequiredMarker(componentType: string, labelSelectorFragment: string) {
867
+ let loadedStyles: { componentTypes: Set<string>, sheet: CSSStyleSheet }|undefined = (window as any).plauditGutenbergExtensionsPlainTextLabelCSSLoaded;
868
+ if (loadedStyles === undefined) {
869
+ (window as any).plauditGutenbergExtensionsPlainTextLabelCSSLoaded = loadedStyles = {componentTypes: new Set(), sheet: new CSSStyleSheet()};
870
+ document.adoptedStyleSheets.push(loadedStyles.sheet);
871
+ }
872
+ if (loadedStyles.componentTypes.has(componentType)) {
873
+ return;
874
+ }
875
+ loadedStyles.componentTypes.add(componentType);
876
+ loadedStyles.sheet.insertRule(`.plaudit-snp-laid-out-property.required[data-plaudit-snp-control-type='${componentType}']${labelSelectorFragment}:after {content:" *";color: red;}`);
877
+ }