@wordpress/edit-site 5.18.0 → 5.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/add-new-pattern/index.js +62 -1
  3. package/build/components/add-new-pattern/index.js.map +1 -1
  4. package/build/components/add-new-template/index.js +3 -2
  5. package/build/components/add-new-template/index.js.map +1 -1
  6. package/build/components/add-new-template/new-template.js +6 -1
  7. package/build/components/add-new-template/new-template.js.map +1 -1
  8. package/build/components/add-new-template/utils.js +6 -1
  9. package/build/components/add-new-template/utils.js.map +1 -1
  10. package/build/components/app/index.js +2 -7
  11. package/build/components/app/index.js.map +1 -1
  12. package/build/components/block-editor/back-button.js +3 -2
  13. package/build/components/block-editor/back-button.js.map +1 -1
  14. package/build/components/block-editor/editor-canvas.js +20 -16
  15. package/build/components/block-editor/editor-canvas.js.map +1 -1
  16. package/build/components/block-editor/site-editor-canvas.js +1 -3
  17. package/build/components/block-editor/site-editor-canvas.js.map +1 -1
  18. package/build/components/block-editor/use-site-editor-settings.js +8 -4
  19. package/build/components/block-editor/use-site-editor-settings.js.map +1 -1
  20. package/build/components/canvas-loader/index.js +18 -1
  21. package/build/components/canvas-loader/index.js.map +1 -1
  22. package/build/components/editor/index.js +3 -8
  23. package/build/components/editor/index.js.map +1 -1
  24. package/build/components/global-styles/dimensions-panel.js +5 -4
  25. package/build/components/global-styles/dimensions-panel.js.map +1 -1
  26. package/build/components/global-styles/font-families.js +68 -0
  27. package/build/components/global-styles/font-families.js.map +1 -0
  28. package/build/components/global-styles/font-family-item.js +47 -0
  29. package/build/components/global-styles/font-family-item.js.map +1 -0
  30. package/build/components/global-styles/font-library-modal/confirm-delete-dialog.js +31 -0
  31. package/build/components/global-styles/font-library-modal/confirm-delete-dialog.js.map +1 -0
  32. package/build/components/global-styles/font-library-modal/context.js +285 -0
  33. package/build/components/global-styles/font-library-modal/context.js.map +1 -0
  34. package/build/components/global-styles/font-library-modal/font-card.js +58 -0
  35. package/build/components/global-styles/font-library-modal/font-card.js.map +1 -0
  36. package/build/components/global-styles/font-library-modal/font-demo.js +69 -0
  37. package/build/components/global-styles/font-library-modal/font-demo.js.map +1 -0
  38. package/build/components/global-styles/font-library-modal/font-variant.js +51 -0
  39. package/build/components/global-styles/font-library-modal/font-variant.js.map +1 -0
  40. package/build/components/global-styles/font-library-modal/fonts-grid.js +54 -0
  41. package/build/components/global-styles/font-library-modal/fonts-grid.js.map +1 -0
  42. package/build/components/global-styles/font-library-modal/index.js +47 -0
  43. package/build/components/global-styles/font-library-modal/index.js.map +1 -0
  44. package/build/components/global-styles/font-library-modal/installed-fonts.js +128 -0
  45. package/build/components/global-styles/font-library-modal/installed-fonts.js.map +1 -0
  46. package/build/components/global-styles/font-library-modal/library-font-card.js +44 -0
  47. package/build/components/global-styles/font-library-modal/library-font-card.js.map +1 -0
  48. package/build/components/global-styles/font-library-modal/library-font-details.js +43 -0
  49. package/build/components/global-styles/font-library-modal/library-font-details.js.map +1 -0
  50. package/build/components/global-styles/font-library-modal/library-font-variant.js +59 -0
  51. package/build/components/global-styles/font-library-modal/library-font-variant.js.map +1 -0
  52. package/build/components/global-styles/font-library-modal/local-fonts.js +143 -0
  53. package/build/components/global-styles/font-library-modal/local-fonts.js.map +1 -0
  54. package/build/components/global-styles/font-library-modal/resolvers.js +37 -0
  55. package/build/components/global-styles/font-library-modal/resolvers.js.map +1 -0
  56. package/build/components/global-styles/font-library-modal/tab-layout.js +45 -0
  57. package/build/components/global-styles/font-library-modal/tab-layout.js.map +1 -0
  58. package/build/components/global-styles/font-library-modal/utils/constants.js +37 -0
  59. package/build/components/global-styles/font-library-modal/utils/constants.js.map +1 -0
  60. package/build/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js +58 -0
  61. package/build/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js.map +1 -0
  62. package/build/components/global-styles/font-library-modal/utils/index.js +205 -0
  63. package/build/components/global-styles/font-library-modal/utils/index.js.map +1 -0
  64. package/build/components/global-styles/font-library-modal/utils/make-families-from-faces.js +22 -0
  65. package/build/components/global-styles/font-library-modal/utils/make-families-from-faces.js.map +1 -0
  66. package/build/components/global-styles/font-library-modal/utils/toggleFont.js +92 -0
  67. package/build/components/global-styles/font-library-modal/utils/toggleFont.js.map +1 -0
  68. package/build/components/global-styles/global-styles-provider.js +7 -12
  69. package/build/components/global-styles/global-styles-provider.js.map +1 -1
  70. package/build/components/global-styles/screen-block.js +34 -21
  71. package/build/components/global-styles/screen-block.js.map +1 -1
  72. package/build/components/global-styles/screen-revisions/index.js +1 -3
  73. package/build/components/global-styles/screen-revisions/index.js.map +1 -1
  74. package/build/components/global-styles/screen-revisions/use-global-styles-revisions.js +0 -1
  75. package/build/components/global-styles/screen-revisions/use-global-styles-revisions.js.map +1 -1
  76. package/build/components/global-styles/screen-typography.js +4 -72
  77. package/build/components/global-styles/screen-typography.js.map +1 -1
  78. package/build/components/global-styles/style-variations-container.js +3 -5
  79. package/build/components/global-styles/style-variations-container.js.map +1 -1
  80. package/build/components/global-styles/typogrphy-elements.js +96 -0
  81. package/build/components/global-styles/typogrphy-elements.js.map +1 -0
  82. package/build/components/page-patterns/duplicate-menu-item.js +52 -16
  83. package/build/components/page-patterns/duplicate-menu-item.js.map +1 -1
  84. package/build/components/page-patterns/grid-item.js +46 -20
  85. package/build/components/page-patterns/grid-item.js.map +1 -1
  86. package/build/components/page-patterns/header.js +3 -7
  87. package/build/components/page-patterns/header.js.map +1 -1
  88. package/build/components/page-patterns/index.js +3 -3
  89. package/build/components/page-patterns/index.js.map +1 -1
  90. package/build/components/page-patterns/patterns-list.js +7 -7
  91. package/build/components/page-patterns/patterns-list.js.map +1 -1
  92. package/build/components/page-patterns/rename-menu-item.js +6 -5
  93. package/build/components/page-patterns/rename-menu-item.js.map +1 -1
  94. package/build/components/page-patterns/search-items.js +8 -2
  95. package/build/components/page-patterns/search-items.js.map +1 -1
  96. package/build/components/page-patterns/use-patterns.js +53 -27
  97. package/build/components/page-patterns/use-patterns.js.map +1 -1
  98. package/build/components/page-patterns/utils.js +1 -20
  99. package/build/components/page-patterns/utils.js.map +1 -1
  100. package/build/components/sidebar-edit-mode/page-panels/edit-template.js +33 -24
  101. package/build/components/sidebar-edit-mode/page-panels/edit-template.js.map +1 -1
  102. package/build/components/sidebar-edit-mode/page-panels/hooks.js +64 -0
  103. package/build/components/sidebar-edit-mode/page-panels/hooks.js.map +1 -0
  104. package/build/components/sidebar-edit-mode/page-panels/index.js +1 -4
  105. package/build/components/sidebar-edit-mode/page-panels/index.js.map +1 -1
  106. package/build/components/sidebar-edit-mode/page-panels/page-summary.js +2 -1
  107. package/build/components/sidebar-edit-mode/page-panels/page-summary.js.map +1 -1
  108. package/build/components/sidebar-edit-mode/page-panels/reset-default-template.js +56 -0
  109. package/build/components/sidebar-edit-mode/page-panels/reset-default-template.js.map +1 -0
  110. package/build/components/sidebar-edit-mode/page-panels/swap-template-button.js +91 -0
  111. package/build/components/sidebar-edit-mode/page-panels/swap-template-button.js.map +1 -0
  112. package/build/components/sidebar-edit-mode/template-panel/index.js +11 -9
  113. package/build/components/sidebar-edit-mode/template-panel/index.js.map +1 -1
  114. package/build/components/sidebar-edit-mode/template-panel/last-revision.js +6 -4
  115. package/build/components/sidebar-edit-mode/template-panel/last-revision.js.map +1 -1
  116. package/build/components/sidebar-edit-mode/template-panel/pattern-categories.js +211 -0
  117. package/build/components/sidebar-edit-mode/template-panel/pattern-categories.js.map +1 -0
  118. package/build/components/sidebar-navigation-screen/index.js +6 -4
  119. package/build/components/sidebar-navigation-screen/index.js.map +1 -1
  120. package/build/components/sidebar-navigation-screen-details-footer/index.js +32 -4
  121. package/build/components/sidebar-navigation-screen-details-footer/index.js.map +1 -1
  122. package/build/components/sidebar-navigation-screen-details-panel/sidebar-navigation-screen-details-panel-row.js +4 -2
  123. package/build/components/sidebar-navigation-screen-details-panel/sidebar-navigation-screen-details-panel-row.js.map +1 -1
  124. package/build/components/sidebar-navigation-screen-global-styles/index.js +4 -31
  125. package/build/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  126. package/build/components/sidebar-navigation-screen-page/index.js +3 -3
  127. package/build/components/sidebar-navigation-screen-page/index.js.map +1 -1
  128. package/build/components/sidebar-navigation-screen-pattern/index.js +18 -8
  129. package/build/components/sidebar-navigation-screen-pattern/index.js.map +1 -1
  130. package/build/components/sidebar-navigation-screen-pattern/use-pattern-details.js +34 -5
  131. package/build/components/sidebar-navigation-screen-pattern/use-pattern-details.js.map +1 -1
  132. package/build/components/sidebar-navigation-screen-patterns/index.js +7 -35
  133. package/build/components/sidebar-navigation-screen-patterns/index.js.map +1 -1
  134. package/build/components/sidebar-navigation-screen-patterns/use-pattern-categories.js +38 -4
  135. package/build/components/sidebar-navigation-screen-patterns/use-pattern-categories.js.map +1 -1
  136. package/build/components/sidebar-navigation-screen-patterns/use-theme-patterns.js +2 -1
  137. package/build/components/sidebar-navigation-screen-patterns/use-theme-patterns.js.map +1 -1
  138. package/build/components/sidebar-navigation-screen-template/index.js +2 -2
  139. package/build/components/sidebar-navigation-screen-template/index.js.map +1 -1
  140. package/build/components/sidebar-navigation-screen-templates/index.js +1 -1
  141. package/build/components/sidebar-navigation-screen-templates/index.js.map +1 -1
  142. package/build/components/template-actions/index.js +7 -4
  143. package/build/components/template-actions/index.js.map +1 -1
  144. package/build/components/template-actions/rename-menu-item.js +3 -2
  145. package/build/components/template-actions/rename-menu-item.js.map +1 -1
  146. package/build/components/welcome-guide/styles.js +2 -2
  147. package/build/components/welcome-guide/styles.js.map +1 -1
  148. package/build/hooks/push-changes-to-global-styles/index.js +5 -37
  149. package/build/hooks/push-changes-to-global-styles/index.js.map +1 -1
  150. package/build/store/actions.js +29 -6
  151. package/build/store/actions.js.map +1 -1
  152. package/build/utils/constants.js +45 -2
  153. package/build/utils/constants.js.map +1 -1
  154. package/build/utils/is-template-removable.js +6 -1
  155. package/build/utils/is-template-removable.js.map +1 -1
  156. package/build/utils/is-template-revertable.js +6 -1
  157. package/build/utils/is-template-revertable.js.map +1 -1
  158. package/build-module/components/add-new-pattern/index.js +66 -5
  159. package/build-module/components/add-new-pattern/index.js.map +1 -1
  160. package/build-module/components/add-new-template/index.js +3 -2
  161. package/build-module/components/add-new-template/index.js.map +1 -1
  162. package/build-module/components/add-new-template/new-template.js +6 -1
  163. package/build-module/components/add-new-template/new-template.js.map +1 -1
  164. package/build-module/components/add-new-template/utils.js +6 -1
  165. package/build-module/components/add-new-template/utils.js.map +1 -1
  166. package/build-module/components/app/index.js +2 -7
  167. package/build-module/components/app/index.js.map +1 -1
  168. package/build-module/components/block-editor/back-button.js +3 -2
  169. package/build-module/components/block-editor/back-button.js.map +1 -1
  170. package/build-module/components/block-editor/editor-canvas.js +21 -17
  171. package/build-module/components/block-editor/editor-canvas.js.map +1 -1
  172. package/build-module/components/block-editor/site-editor-canvas.js +3 -5
  173. package/build-module/components/block-editor/site-editor-canvas.js.map +1 -1
  174. package/build-module/components/block-editor/use-site-editor-settings.js +8 -4
  175. package/build-module/components/block-editor/use-site-editor-settings.js.map +1 -1
  176. package/build-module/components/canvas-loader/index.js +18 -1
  177. package/build-module/components/canvas-loader/index.js.map +1 -1
  178. package/build-module/components/editor/index.js +3 -8
  179. package/build-module/components/editor/index.js.map +1 -1
  180. package/build-module/components/global-styles/dimensions-panel.js +5 -4
  181. package/build-module/components/global-styles/dimensions-panel.js.map +1 -1
  182. package/build-module/components/global-styles/font-families.js +58 -0
  183. package/build-module/components/global-styles/font-families.js.map +1 -0
  184. package/build-module/components/global-styles/font-family-item.js +40 -0
  185. package/build-module/components/global-styles/font-family-item.js.map +1 -0
  186. package/build-module/components/global-styles/font-library-modal/confirm-delete-dialog.js +23 -0
  187. package/build-module/components/global-styles/font-library-modal/confirm-delete-dialog.js.map +1 -0
  188. package/build-module/components/global-styles/font-library-modal/context.js +276 -0
  189. package/build-module/components/global-styles/font-library-modal/context.js.map +1 -0
  190. package/build-module/components/global-styles/font-library-modal/font-card.js +49 -0
  191. package/build-module/components/global-styles/font-library-modal/font-card.js.map +1 -0
  192. package/build-module/components/global-styles/font-library-modal/font-demo.js +62 -0
  193. package/build-module/components/global-styles/font-library-modal/font-demo.js.map +1 -0
  194. package/build-module/components/global-styles/font-library-modal/font-variant.js +42 -0
  195. package/build-module/components/global-styles/font-library-modal/font-variant.js.map +1 -0
  196. package/build-module/components/global-styles/font-library-modal/fonts-grid.js +47 -0
  197. package/build-module/components/global-styles/font-library-modal/fonts-grid.js.map +1 -0
  198. package/build-module/components/global-styles/font-library-modal/index.js +38 -0
  199. package/build-module/components/global-styles/font-library-modal/index.js.map +1 -0
  200. package/build-module/components/global-styles/font-library-modal/installed-fonts.js +120 -0
  201. package/build-module/components/global-styles/font-library-modal/installed-fonts.js.map +1 -0
  202. package/build-module/components/global-styles/font-library-modal/library-font-card.js +36 -0
  203. package/build-module/components/global-styles/font-library-modal/library-font-card.js.map +1 -0
  204. package/build-module/components/global-styles/font-library-modal/library-font-details.js +34 -0
  205. package/build-module/components/global-styles/font-library-modal/library-font-details.js.map +1 -0
  206. package/build-module/components/global-styles/font-library-modal/library-font-variant.js +50 -0
  207. package/build-module/components/global-styles/font-library-modal/library-font-variant.js.map +1 -0
  208. package/build-module/components/global-styles/font-library-modal/local-fonts.js +135 -0
  209. package/build-module/components/global-styles/font-library-modal/local-fonts.js.map +1 -0
  210. package/build-module/components/global-styles/font-library-modal/resolvers.js +28 -0
  211. package/build-module/components/global-styles/font-library-modal/resolvers.js.map +1 -0
  212. package/build-module/components/global-styles/font-library-modal/tab-layout.js +37 -0
  213. package/build-module/components/global-styles/font-library-modal/tab-layout.js.map +1 -0
  214. package/build-module/components/global-styles/font-library-modal/utils/constants.js +26 -0
  215. package/build-module/components/global-styles/font-library-modal/utils/constants.js.map +1 -0
  216. package/build-module/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js +52 -0
  217. package/build-module/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js.map +1 -0
  218. package/build-module/components/global-styles/font-library-modal/utils/index.js +190 -0
  219. package/build-module/components/global-styles/font-library-modal/utils/index.js.map +1 -0
  220. package/build-module/components/global-styles/font-library-modal/utils/make-families-from-faces.js +16 -0
  221. package/build-module/components/global-styles/font-library-modal/utils/make-families-from-faces.js.map +1 -0
  222. package/build-module/components/global-styles/font-library-modal/utils/toggleFont.js +86 -0
  223. package/build-module/components/global-styles/font-library-modal/utils/toggleFont.js.map +1 -0
  224. package/build-module/components/global-styles/global-styles-provider.js +7 -12
  225. package/build-module/components/global-styles/global-styles-provider.js.map +1 -1
  226. package/build-module/components/global-styles/screen-block.js +34 -21
  227. package/build-module/components/global-styles/screen-block.js.map +1 -1
  228. package/build-module/components/global-styles/screen-revisions/index.js +1 -3
  229. package/build-module/components/global-styles/screen-revisions/index.js.map +1 -1
  230. package/build-module/components/global-styles/screen-revisions/use-global-styles-revisions.js +0 -1
  231. package/build-module/components/global-styles/screen-revisions/use-global-styles-revisions.js.map +1 -1
  232. package/build-module/components/global-styles/screen-typography.js +6 -74
  233. package/build-module/components/global-styles/screen-typography.js.map +1 -1
  234. package/build-module/components/global-styles/style-variations-container.js +3 -5
  235. package/build-module/components/global-styles/style-variations-container.js.map +1 -1
  236. package/build-module/components/global-styles/typogrphy-elements.js +87 -0
  237. package/build-module/components/global-styles/typogrphy-elements.js.map +1 -0
  238. package/build-module/components/page-patterns/duplicate-menu-item.js +51 -16
  239. package/build-module/components/page-patterns/duplicate-menu-item.js.map +1 -1
  240. package/build-module/components/page-patterns/grid-item.js +47 -21
  241. package/build-module/components/page-patterns/grid-item.js.map +1 -1
  242. package/build-module/components/page-patterns/header.js +3 -7
  243. package/build-module/components/page-patterns/header.js.map +1 -1
  244. package/build-module/components/page-patterns/index.js +3 -3
  245. package/build-module/components/page-patterns/index.js.map +1 -1
  246. package/build-module/components/page-patterns/patterns-list.js +7 -7
  247. package/build-module/components/page-patterns/patterns-list.js.map +1 -1
  248. package/build-module/components/page-patterns/rename-menu-item.js +6 -5
  249. package/build-module/components/page-patterns/rename-menu-item.js.map +1 -1
  250. package/build-module/components/page-patterns/search-items.js +8 -2
  251. package/build-module/components/page-patterns/search-items.js.map +1 -1
  252. package/build-module/components/page-patterns/use-patterns.js +54 -28
  253. package/build-module/components/page-patterns/use-patterns.js.map +1 -1
  254. package/build-module/components/page-patterns/utils.js +0 -11
  255. package/build-module/components/page-patterns/utils.js.map +1 -1
  256. package/build-module/components/sidebar-edit-mode/page-panels/edit-template.js +34 -27
  257. package/build-module/components/sidebar-edit-mode/page-panels/edit-template.js.map +1 -1
  258. package/build-module/components/sidebar-edit-mode/page-panels/hooks.js +54 -0
  259. package/build-module/components/sidebar-edit-mode/page-panels/hooks.js.map +1 -0
  260. package/build-module/components/sidebar-edit-mode/page-panels/index.js +1 -4
  261. package/build-module/components/sidebar-edit-mode/page-panels/index.js.map +1 -1
  262. package/build-module/components/sidebar-edit-mode/page-panels/page-summary.js +2 -1
  263. package/build-module/components/sidebar-edit-mode/page-panels/page-summary.js.map +1 -1
  264. package/build-module/components/sidebar-edit-mode/page-panels/reset-default-template.js +49 -0
  265. package/build-module/components/sidebar-edit-mode/page-panels/reset-default-template.js.map +1 -0
  266. package/build-module/components/sidebar-edit-mode/page-panels/swap-template-button.js +85 -0
  267. package/build-module/components/sidebar-edit-mode/page-panels/swap-template-button.js.map +1 -0
  268. package/build-module/components/sidebar-edit-mode/template-panel/index.js +12 -10
  269. package/build-module/components/sidebar-edit-mode/template-panel/index.js.map +1 -1
  270. package/build-module/components/sidebar-edit-mode/template-panel/last-revision.js +8 -6
  271. package/build-module/components/sidebar-edit-mode/template-panel/last-revision.js.map +1 -1
  272. package/build-module/components/sidebar-edit-mode/template-panel/pattern-categories.js +202 -0
  273. package/build-module/components/sidebar-edit-mode/template-panel/pattern-categories.js.map +1 -0
  274. package/build-module/components/sidebar-navigation-screen/index.js +6 -4
  275. package/build-module/components/sidebar-navigation-screen/index.js.map +1 -1
  276. package/build-module/components/sidebar-navigation-screen-details-footer/index.js +32 -5
  277. package/build-module/components/sidebar-navigation-screen-details-footer/index.js.map +1 -1
  278. package/build-module/components/sidebar-navigation-screen-details-panel/sidebar-navigation-screen-details-panel-row.js +4 -2
  279. package/build-module/components/sidebar-navigation-screen-details-panel/sidebar-navigation-screen-details-panel-row.js.map +1 -1
  280. package/build-module/components/sidebar-navigation-screen-global-styles/index.js +6 -33
  281. package/build-module/components/sidebar-navigation-screen-global-styles/index.js.map +1 -1
  282. package/build-module/components/sidebar-navigation-screen-page/index.js +3 -3
  283. package/build-module/components/sidebar-navigation-screen-page/index.js.map +1 -1
  284. package/build-module/components/sidebar-navigation-screen-pattern/index.js +19 -9
  285. package/build-module/components/sidebar-navigation-screen-pattern/index.js.map +1 -1
  286. package/build-module/components/sidebar-navigation-screen-pattern/use-pattern-details.js +34 -5
  287. package/build-module/components/sidebar-navigation-screen-pattern/use-pattern-details.js.map +1 -1
  288. package/build-module/components/sidebar-navigation-screen-patterns/index.js +10 -38
  289. package/build-module/components/sidebar-navigation-screen-patterns/index.js.map +1 -1
  290. package/build-module/components/sidebar-navigation-screen-patterns/use-pattern-categories.js +38 -4
  291. package/build-module/components/sidebar-navigation-screen-patterns/use-pattern-categories.js.map +1 -1
  292. package/build-module/components/sidebar-navigation-screen-patterns/use-theme-patterns.js +3 -2
  293. package/build-module/components/sidebar-navigation-screen-patterns/use-theme-patterns.js.map +1 -1
  294. package/build-module/components/sidebar-navigation-screen-template/index.js +2 -2
  295. package/build-module/components/sidebar-navigation-screen-template/index.js.map +1 -1
  296. package/build-module/components/sidebar-navigation-screen-templates/index.js +1 -1
  297. package/build-module/components/sidebar-navigation-screen-templates/index.js.map +1 -1
  298. package/build-module/components/template-actions/index.js +7 -4
  299. package/build-module/components/template-actions/index.js.map +1 -1
  300. package/build-module/components/template-actions/rename-menu-item.js +3 -2
  301. package/build-module/components/template-actions/rename-menu-item.js.map +1 -1
  302. package/build-module/components/welcome-guide/styles.js +2 -2
  303. package/build-module/components/welcome-guide/styles.js.map +1 -1
  304. package/build-module/hooks/push-changes-to-global-styles/index.js +5 -37
  305. package/build-module/hooks/push-changes-to-global-styles/index.js.map +1 -1
  306. package/build-module/store/actions.js +30 -7
  307. package/build-module/store/actions.js.map +1 -1
  308. package/build-module/utils/constants.js +35 -1
  309. package/build-module/utils/constants.js.map +1 -1
  310. package/build-module/utils/is-template-removable.js +6 -1
  311. package/build-module/utils/is-template-removable.js.map +1 -1
  312. package/build-module/utils/is-template-revertable.js +6 -1
  313. package/build-module/utils/is-template-revertable.js.map +1 -1
  314. package/build-style/style-rtl.css +244 -37
  315. package/build-style/style.css +244 -37
  316. package/lib/inflate.js +4082 -0
  317. package/lib/lib-font.browser.js +3831 -0
  318. package/lib/unbrotli.js +2679 -0
  319. package/package.json +40 -40
  320. package/src/components/add-new-pattern/index.js +83 -5
  321. package/src/components/add-new-template/index.js +3 -2
  322. package/src/components/add-new-template/new-template.js +6 -1
  323. package/src/components/add-new-template/utils.js +12 -3
  324. package/src/components/app/index.js +9 -12
  325. package/src/components/block-editor/back-button.js +6 -2
  326. package/src/components/block-editor/editor-canvas.js +31 -19
  327. package/src/components/block-editor/site-editor-canvas.js +2 -10
  328. package/src/components/block-editor/style.scss +88 -1
  329. package/src/components/block-editor/use-site-editor-settings.js +26 -19
  330. package/src/components/canvas-loader/index.js +12 -1
  331. package/src/components/canvas-loader/style.scss +1 -1
  332. package/src/components/editor/index.js +3 -8
  333. package/src/components/global-styles/dimensions-panel.js +8 -4
  334. package/src/components/global-styles/font-families.js +71 -0
  335. package/src/components/global-styles/font-family-item.js +44 -0
  336. package/src/components/global-styles/font-library-modal/confirm-delete-dialog.js +33 -0
  337. package/src/components/global-styles/font-library-modal/context.js +347 -0
  338. package/src/components/global-styles/font-library-modal/font-card.js +70 -0
  339. package/src/components/global-styles/font-library-modal/font-demo.js +57 -0
  340. package/src/components/global-styles/font-library-modal/font-variant.js +53 -0
  341. package/src/components/global-styles/font-library-modal/fonts-grid.js +55 -0
  342. package/src/components/global-styles/font-library-modal/index.js +42 -0
  343. package/src/components/global-styles/font-library-modal/installed-fonts.js +174 -0
  344. package/src/components/global-styles/font-library-modal/library-font-card.js +40 -0
  345. package/src/components/global-styles/font-library-modal/library-font-details.js +46 -0
  346. package/src/components/global-styles/font-library-modal/library-font-variant.js +54 -0
  347. package/src/components/global-styles/font-library-modal/local-fonts.js +160 -0
  348. package/src/components/global-styles/font-library-modal/resolvers.js +29 -0
  349. package/src/components/global-styles/font-library-modal/style.scss +113 -0
  350. package/src/components/global-styles/font-library-modal/tab-layout.js +50 -0
  351. package/src/components/global-styles/font-library-modal/utils/constants.js +31 -0
  352. package/src/components/global-styles/font-library-modal/utils/get-intersecting-font-faces.js +58 -0
  353. package/src/components/global-styles/font-library-modal/utils/index.js +213 -0
  354. package/src/components/global-styles/font-library-modal/utils/make-families-from-faces.js +15 -0
  355. package/src/components/global-styles/font-library-modal/utils/test/getDisplaySrcFromFontFace.spec.js +53 -0
  356. package/src/components/global-styles/font-library-modal/utils/test/getFontFaceVariantName.spec.js +30 -0
  357. package/src/components/global-styles/font-library-modal/utils/test/getIntersectingFontFaces.spec.js +240 -0
  358. package/src/components/global-styles/font-library-modal/utils/test/getPreviewStyle.spec.js +121 -0
  359. package/src/components/global-styles/font-library-modal/utils/test/isUrlEncoded.spec.js +31 -0
  360. package/src/components/global-styles/font-library-modal/utils/test/makeFamiliesFromFaces.spec.js +57 -0
  361. package/src/components/global-styles/font-library-modal/utils/test/makeFormDataFromFontFamilies.spec.js +62 -0
  362. package/src/components/global-styles/font-library-modal/utils/test/mergeFontFaces.spec.js +56 -0
  363. package/src/components/global-styles/font-library-modal/utils/test/mergeFontFamilies.spec.js +108 -0
  364. package/src/components/global-styles/font-library-modal/utils/test/setUIValuesNeeded.spec.js +41 -0
  365. package/src/components/global-styles/font-library-modal/utils/test/toggleFont.spec.js +141 -0
  366. package/src/components/global-styles/font-library-modal/utils/toggleFont.js +90 -0
  367. package/src/components/global-styles/global-styles-provider.js +2 -7
  368. package/src/components/global-styles/screen-block.js +42 -20
  369. package/src/components/global-styles/screen-revisions/index.js +0 -2
  370. package/src/components/global-styles/screen-revisions/use-global-styles-revisions.js +0 -1
  371. package/src/components/global-styles/screen-typography.js +7 -95
  372. package/src/components/global-styles/style-variations-container.js +0 -2
  373. package/src/components/global-styles/typogrphy-elements.js +110 -0
  374. package/src/components/list/style.scss +2 -0
  375. package/src/components/page-patterns/duplicate-menu-item.js +63 -20
  376. package/src/components/page-patterns/grid-item.js +77 -30
  377. package/src/components/page-patterns/header.js +3 -12
  378. package/src/components/page-patterns/index.js +3 -3
  379. package/src/components/page-patterns/patterns-list.js +7 -7
  380. package/src/components/page-patterns/rename-menu-item.js +18 -7
  381. package/src/components/page-patterns/search-items.js +14 -2
  382. package/src/components/page-patterns/style.scss +1 -5
  383. package/src/components/page-patterns/use-patterns.js +67 -33
  384. package/src/components/page-patterns/utils.js +0 -19
  385. package/src/components/sidebar-edit-mode/page-panels/edit-template.js +47 -33
  386. package/src/components/sidebar-edit-mode/page-panels/hooks.js +83 -0
  387. package/src/components/sidebar-edit-mode/page-panels/index.js +0 -4
  388. package/src/components/sidebar-edit-mode/page-panels/page-summary.js +2 -0
  389. package/src/components/sidebar-edit-mode/page-panels/reset-default-template.js +44 -0
  390. package/src/components/sidebar-edit-mode/page-panels/style.scss +41 -10
  391. package/src/components/sidebar-edit-mode/page-panels/swap-template-button.js +82 -0
  392. package/src/components/sidebar-edit-mode/template-panel/index.js +28 -24
  393. package/src/components/sidebar-edit-mode/template-panel/last-revision.js +19 -15
  394. package/src/components/sidebar-edit-mode/template-panel/pattern-categories.js +270 -0
  395. package/src/components/sidebar-navigation-screen/index.js +4 -9
  396. package/src/components/sidebar-navigation-screen/style.scss +7 -1
  397. package/src/components/sidebar-navigation-screen-details-footer/index.js +38 -10
  398. package/src/components/sidebar-navigation-screen-details-footer/style.scss +10 -3
  399. package/src/components/sidebar-navigation-screen-details-panel/sidebar-navigation-screen-details-panel-row.js +2 -0
  400. package/src/components/sidebar-navigation-screen-global-styles/index.js +6 -44
  401. package/src/components/sidebar-navigation-screen-navigation-menus/style.scss +0 -4
  402. package/src/components/sidebar-navigation-screen-page/index.js +3 -3
  403. package/src/components/sidebar-navigation-screen-pattern/index.js +20 -7
  404. package/src/components/sidebar-navigation-screen-pattern/style.scss +0 -3
  405. package/src/components/sidebar-navigation-screen-pattern/use-pattern-details.js +46 -13
  406. package/src/components/sidebar-navigation-screen-patterns/index.js +14 -49
  407. package/src/components/sidebar-navigation-screen-patterns/use-pattern-categories.js +48 -6
  408. package/src/components/sidebar-navigation-screen-patterns/use-theme-patterns.js +3 -5
  409. package/src/components/sidebar-navigation-screen-template/index.js +2 -4
  410. package/src/components/sidebar-navigation-screen-templates/index.js +1 -1
  411. package/src/components/template-actions/index.js +14 -8
  412. package/src/components/template-actions/rename-menu-item.js +15 -4
  413. package/src/components/welcome-guide/styles.js +2 -2
  414. package/src/hooks/push-changes-to-global-styles/index.js +6 -49
  415. package/src/store/actions.js +39 -13
  416. package/src/store/test/actions.js +0 -1
  417. package/src/store/test/reducer.js +0 -1
  418. package/src/style.scss +1 -1
  419. package/src/utils/constants.js +38 -3
  420. package/src/utils/is-template-removable.js +8 -1
  421. package/src/utils/is-template-revertable.js +8 -1
  422. package/build/components/sidebar-navigation-screen-patterns/use-my-patterns.js +0 -30
  423. package/build/components/sidebar-navigation-screen-patterns/use-my-patterns.js.map +0 -1
  424. package/build-module/components/sidebar-navigation-screen-patterns/use-my-patterns.js +0 -23
  425. package/build-module/components/sidebar-navigation-screen-patterns/use-my-patterns.js.map +0 -1
  426. package/src/components/sidebar-navigation-screen-global-styles/style.scss +0 -12
  427. package/src/components/sidebar-navigation-screen-patterns/use-my-patterns.js +0 -24
@@ -0,0 +1,57 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __experimentalText as Text } from '@wordpress/components';
5
+ import { useContext, useEffect, useState, useRef } from '@wordpress/element';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import { FontLibraryContext } from './context';
11
+
12
+ function FontFaceDemo( { fontFace, text, style = {} } ) {
13
+ const ref = useRef( null );
14
+ const [ isIntersecting, setIsIntersecting ] = useState( false );
15
+ const [ isAssetLoaded, setIsAssetLoaded ] = useState( false );
16
+ const { loadFontFaceAsset } = useContext( FontLibraryContext );
17
+ const { fontFamily, fontStyle, fontWeight } = fontFace;
18
+
19
+ const demoStyle = {
20
+ fontWeight,
21
+ fontStyle,
22
+ fontFamily,
23
+ flexShrink: 0,
24
+ fontSize: '18px',
25
+ opacity: isAssetLoaded ? '1' : '0',
26
+ transition: 'opacity 0.3s ease-in-out',
27
+ ...style,
28
+ };
29
+
30
+ useEffect( () => {
31
+ const observer = new window.IntersectionObserver( ( [ entry ] ) => {
32
+ setIsIntersecting( entry.isIntersecting );
33
+ }, {} );
34
+ observer.observe( ref.current );
35
+ return () => observer.disconnect();
36
+ }, [ ref ] );
37
+
38
+ useEffect( () => {
39
+ const loadAsset = async () => {
40
+ if ( isIntersecting ) {
41
+ if ( fontFace.src ) {
42
+ await loadFontFaceAsset( fontFace );
43
+ }
44
+ setIsAssetLoaded( true );
45
+ }
46
+ };
47
+ loadAsset();
48
+ }, [ fontFace, isIntersecting, loadFontFaceAsset ] );
49
+
50
+ return (
51
+ <Text style={ demoStyle } ref={ ref }>
52
+ { text }
53
+ </Text>
54
+ );
55
+ }
56
+
57
+ export default FontFaceDemo;
@@ -0,0 +1,53 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalText as Text,
6
+ __experimentalVStack as VStack,
7
+ __experimentalHStack as HStack,
8
+ CheckboxControl,
9
+ } from '@wordpress/components';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import FontFaceDemo from './font-demo';
15
+
16
+ function FontVariant( {
17
+ fontFace,
18
+ variantName,
19
+ checked,
20
+ onClick,
21
+ text,
22
+ actionHandler,
23
+ } ) {
24
+ const { fontStyle, fontWeight } = fontFace;
25
+ const displayVariantName = variantName || `${ fontWeight } ${ fontStyle }`;
26
+
27
+ return (
28
+ <div className="font-library-modal__font-variant">
29
+ <VStack spacing={ 1 }>
30
+ <HStack justify="flex-start" alignment="top">
31
+ { !! actionHandler ? (
32
+ actionHandler
33
+ ) : (
34
+ <CheckboxControl
35
+ checked={ checked }
36
+ onChange={ onClick }
37
+ />
38
+ ) }
39
+ { typeof displayVariantName === 'string' ? (
40
+ <Text>{ displayVariantName }</Text>
41
+ ) : (
42
+ displayVariantName
43
+ ) }
44
+ </HStack>
45
+ <div className="font-library-modal__font-variant_demo-wrapper">
46
+ <FontFaceDemo fontFace={ fontFace } text={ text } />
47
+ </div>
48
+ </VStack>
49
+ </div>
50
+ );
51
+ }
52
+
53
+ export default FontVariant;
@@ -0,0 +1,55 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalVStack as VStack,
6
+ __experimentalText as Text,
7
+ __experimentalSpacer as Spacer,
8
+ } from '@wordpress/components';
9
+ import { useState, useEffect } from '@wordpress/element';
10
+
11
+ function FontsGrid( { title, children, pageSize = 32 } ) {
12
+ const [ lastItem, setLastItem ] = useState( null );
13
+ const [ page, setPage ] = useState( 1 );
14
+ const itemsLimit = page * pageSize;
15
+ const items = children.slice( 0, itemsLimit );
16
+
17
+ useEffect( () => {
18
+ if ( lastItem ) {
19
+ const observer = new window.IntersectionObserver( ( [ entry ] ) => {
20
+ if ( entry.isIntersecting ) {
21
+ setPage( ( prevPage ) => prevPage + 1 );
22
+ }
23
+ } );
24
+
25
+ observer.observe( lastItem );
26
+
27
+ return () => observer.disconnect();
28
+ }
29
+ }, [ lastItem ] );
30
+
31
+ return (
32
+ <div className="font-library-modal__fonts-grid">
33
+ <VStack spacing={ 0 }>
34
+ { title && (
35
+ <>
36
+ <Text className="font-library-modal__subtitle">
37
+ { title }
38
+ </Text>
39
+ <Spacer margin={ 2 } />
40
+ </>
41
+ ) }
42
+ <div className="font-library-modal__fonts-grid__main">
43
+ { items.map( ( child, i ) => {
44
+ if ( i === itemsLimit - 1 ) {
45
+ return <div ref={ setLastItem }>{ child }</div>;
46
+ }
47
+ return child;
48
+ } ) }
49
+ </div>
50
+ </VStack>
51
+ </div>
52
+ );
53
+ }
54
+
55
+ export default FontsGrid;
@@ -0,0 +1,42 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { Modal, TabPanel } from '@wordpress/components';
6
+
7
+ /**
8
+ * Internal dependencies
9
+ */
10
+ import InstalledFonts from './installed-fonts';
11
+ import { MODAL_TABS } from './utils/constants';
12
+
13
+ function FontLibraryModal( {
14
+ onRequestClose,
15
+ initialTabName = 'installed-fonts',
16
+ } ) {
17
+ return (
18
+ <Modal
19
+ title={ __( 'Fonts' ) }
20
+ onRequestClose={ onRequestClose }
21
+ isFullScreen={ true }
22
+ className="font-library-modal"
23
+ style={ { width: '65vw' } }
24
+ >
25
+ <TabPanel
26
+ className="font-library-modal__tab-panel"
27
+ initialTabName={ initialTabName }
28
+ tabs={ MODAL_TABS }
29
+ >
30
+ { ( tab ) => {
31
+ switch ( tab.name ) {
32
+ case 'installed-fonts':
33
+ default:
34
+ return <InstalledFonts />;
35
+ }
36
+ } }
37
+ </TabPanel>
38
+ </Modal>
39
+ );
40
+ }
41
+
42
+ export default FontLibraryModal;
@@ -0,0 +1,174 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import { useContext, useEffect, useState } from '@wordpress/element';
6
+ import {
7
+ privateApis as componentsPrivateApis,
8
+ __experimentalHStack as HStack,
9
+ __experimentalSpacer as Spacer,
10
+ Button,
11
+ Spinner,
12
+ } from '@wordpress/components';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import TabLayout from './tab-layout';
18
+ import { FontLibraryContext } from './context';
19
+ import FontsGrid from './fonts-grid';
20
+ import LibraryFontDetails from './library-font-details';
21
+ import LibraryFontCard from './library-font-card';
22
+ import LocalFonts from './local-fonts';
23
+ import ConfirmDeleteDialog from './confirm-delete-dialog';
24
+ import { unlock } from '../../../lock-unlock';
25
+ const { ProgressBar } = unlock( componentsPrivateApis );
26
+
27
+ function InstalledFonts() {
28
+ const {
29
+ baseCustomFonts,
30
+ libraryFontSelected,
31
+ baseThemeFonts,
32
+ handleSetLibraryFontSelected,
33
+ refreshLibrary,
34
+ uninstallFont,
35
+ isResolvingLibrary,
36
+ } = useContext( FontLibraryContext );
37
+ const [ isConfirmDeleteOpen, setIsConfirmDeleteOpen ] = useState( false );
38
+
39
+ const handleUnselectFont = () => {
40
+ handleSetLibraryFontSelected( null );
41
+ };
42
+
43
+ const handleSelectFont = ( font ) => {
44
+ handleSetLibraryFontSelected( font );
45
+ };
46
+
47
+ const handleConfirmUninstall = async () => {
48
+ const result = await uninstallFont( libraryFontSelected );
49
+ // If the font was succesfully uninstalled it is unselected
50
+ if ( result ) {
51
+ handleUnselectFont();
52
+ }
53
+ setIsConfirmDeleteOpen( false );
54
+ };
55
+
56
+ const handleUninstallClick = async () => {
57
+ setIsConfirmDeleteOpen( true );
58
+ };
59
+
60
+ const handleCancelUninstall = () => {
61
+ setIsConfirmDeleteOpen( false );
62
+ };
63
+
64
+ const tabDescription = !! libraryFontSelected
65
+ ? __(
66
+ 'Choose font variants. Keep in mind that too many variants could make your site slower.'
67
+ )
68
+ : null;
69
+
70
+ const shouldDisplayDeleteButton =
71
+ !! libraryFontSelected && libraryFontSelected?.source !== 'theme';
72
+
73
+ useEffect( () => {
74
+ refreshLibrary();
75
+ }, [] );
76
+
77
+ return (
78
+ <TabLayout
79
+ title={ libraryFontSelected?.name || '' }
80
+ description={ tabDescription }
81
+ handleBack={ !! libraryFontSelected && handleUnselectFont }
82
+ footer={
83
+ <Footer
84
+ shouldDisplayDeleteButton={ shouldDisplayDeleteButton }
85
+ handleUninstallClick={ handleUninstallClick }
86
+ />
87
+ }
88
+ >
89
+ <ConfirmDeleteDialog
90
+ font={ libraryFontSelected }
91
+ isConfirmDeleteOpen={ isConfirmDeleteOpen }
92
+ handleConfirmUninstall={ handleConfirmUninstall }
93
+ handleCancelUninstall={ handleCancelUninstall }
94
+ />
95
+
96
+ { ! libraryFontSelected && (
97
+ <>
98
+ { isResolvingLibrary && <Spinner /> }
99
+ { baseCustomFonts.length > 0 && (
100
+ <>
101
+ <Spacer margin={ 2 } />
102
+ <FontsGrid>
103
+ { baseCustomFonts.map( ( font ) => (
104
+ <LibraryFontCard
105
+ font={ font }
106
+ key={ font.slug }
107
+ onClick={ () => {
108
+ handleSelectFont( font );
109
+ } }
110
+ />
111
+ ) ) }
112
+ </FontsGrid>
113
+ </>
114
+ ) }
115
+
116
+ { baseThemeFonts.length > 0 && (
117
+ <>
118
+ <Spacer margin={ 8 } />
119
+ <FontsGrid title={ __( 'Theme Fonts' ) }>
120
+ { baseThemeFonts.map( ( font ) => (
121
+ <LibraryFontCard
122
+ font={ font }
123
+ key={ font.slug }
124
+ onClick={ () => {
125
+ handleSelectFont( font );
126
+ } }
127
+ />
128
+ ) ) }
129
+ </FontsGrid>
130
+ </>
131
+ ) }
132
+
133
+ <Spacer margin={ 8 } />
134
+ <LocalFonts />
135
+ </>
136
+ ) }
137
+
138
+ { libraryFontSelected && (
139
+ <LibraryFontDetails
140
+ font={ libraryFontSelected }
141
+ isConfirmDeleteOpen={ isConfirmDeleteOpen }
142
+ handleConfirmUninstall={ handleConfirmUninstall }
143
+ handleCancelUninstall={ handleCancelUninstall }
144
+ />
145
+ ) }
146
+ </TabLayout>
147
+ );
148
+ }
149
+
150
+ function Footer( { shouldDisplayDeleteButton, handleUninstallClick } ) {
151
+ const { saveFontFamilies, fontFamiliesHasChanges, isInstalling } =
152
+ useContext( FontLibraryContext );
153
+ return (
154
+ <HStack justify="space-between">
155
+ { isInstalling && <ProgressBar /> }
156
+ <div>
157
+ { shouldDisplayDeleteButton && (
158
+ <Button variant="tertiary" onClick={ handleUninstallClick }>
159
+ { __( 'Delete' ) }
160
+ </Button>
161
+ ) }
162
+ </div>
163
+ <Button
164
+ disabled={ ! fontFamiliesHasChanges }
165
+ variant="primary"
166
+ onClick={ saveFontFamilies }
167
+ >
168
+ { __( 'Update' ) }
169
+ </Button>
170
+ </HStack>
171
+ );
172
+ }
173
+
174
+ export default InstalledFonts;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __, sprintf } from '@wordpress/i18n';
5
+ import { useContext } from '@wordpress/element';
6
+ import { Icon } from '@wordpress/components';
7
+ import { chevronRight } from '@wordpress/icons';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import FontCard from './font-card';
13
+ import { FontLibraryContext } from './context';
14
+
15
+ function LibraryFontCard( { font, ...props } ) {
16
+ const { getFontFacesActivated } = useContext( FontLibraryContext );
17
+
18
+ const variantsInstalled = font.fontFace?.length || 1;
19
+ const variantsActive = getFontFacesActivated(
20
+ font.slug,
21
+ font.source
22
+ ).length;
23
+ const variantsText = sprintf(
24
+ /* translators: %1$d: Active font variants, %2$d: Total font variants */
25
+ __( '%1$s/%2$s variants active' ),
26
+ variantsActive,
27
+ variantsInstalled
28
+ );
29
+
30
+ return (
31
+ <FontCard
32
+ font={ font }
33
+ variantsText={ variantsText }
34
+ actionHandler={ <Icon icon={ chevronRight } /> }
35
+ { ...props }
36
+ />
37
+ );
38
+ }
39
+
40
+ export default LibraryFontCard;
@@ -0,0 +1,46 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import {
5
+ __experimentalVStack as VStack,
6
+ __experimentalSpacer as Spacer,
7
+ } from '@wordpress/components';
8
+
9
+ /**
10
+ * Internal dependencies
11
+ */
12
+ import LibraryFontVariant from './library-font-variant';
13
+
14
+ function LibraryFontDetails( { font } ) {
15
+ const fontFaces =
16
+ font.fontFace && font.fontFace.length
17
+ ? font.fontFace.sort( ( a, b ) =>
18
+ a.fontWeight > b.fontWeight ? 1 : -1
19
+ )
20
+ : [
21
+ {
22
+ fontFamily: font.fontFamily,
23
+ fontStyle: 'normal',
24
+ fontWeight: '400',
25
+ },
26
+ ];
27
+
28
+ return (
29
+ <>
30
+ <Spacer margin={ 4 } />
31
+ <VStack spacing={ 0 }>
32
+ <Spacer margin={ 8 } />
33
+ { fontFaces.map( ( face, i ) => (
34
+ <LibraryFontVariant
35
+ font={ font }
36
+ face={ face }
37
+ key={ `face${ i }` }
38
+ />
39
+ ) ) }
40
+ </VStack>
41
+ <Spacer margin={ 8 } />
42
+ </>
43
+ );
44
+ }
45
+
46
+ export default LibraryFontDetails;
@@ -0,0 +1,54 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { useContext } from '@wordpress/element';
5
+ import { CheckboxControl, Flex } from '@wordpress/components';
6
+ /**
7
+ * Internal dependencies
8
+ */
9
+ import { getFontFaceVariantName } from './utils';
10
+
11
+ /**
12
+ * Internal dependencies
13
+ */
14
+ import { FontLibraryContext } from './context';
15
+ import FontFaceDemo from './font-demo';
16
+
17
+ function LibraryFontVariant( { face, font } ) {
18
+ const { isFontActivated, toggleActivateFont } =
19
+ useContext( FontLibraryContext );
20
+
21
+ const isIstalled = font?.fontFace
22
+ ? isFontActivated(
23
+ font.slug,
24
+ face.fontStyle,
25
+ face.fontWeight,
26
+ font.source
27
+ )
28
+ : isFontActivated( font.slug, null, null, font.source );
29
+
30
+ const handleToggleActivation = () => {
31
+ if ( font?.fontFace ) {
32
+ toggleActivateFont( font, face );
33
+ return;
34
+ }
35
+ toggleActivateFont( font );
36
+ };
37
+
38
+ const displayName = font.name + ' ' + getFontFaceVariantName( face );
39
+
40
+ return (
41
+ <div className="font-library-modal__library-font-variant">
42
+ <Flex justify="space-between" align="center" gap="1rem">
43
+ <FontFaceDemo fontFace={ face } text={ displayName } />
44
+ <CheckboxControl
45
+ checked={ isIstalled }
46
+ onChange={ handleToggleActivation }
47
+ __nextHasNoMarginBottom={ true }
48
+ />
49
+ </Flex>
50
+ </div>
51
+ );
52
+ }
53
+
54
+ export default LibraryFontVariant;
@@ -0,0 +1,160 @@
1
+ /**
2
+ * WordPress dependencies
3
+ */
4
+ import { __ } from '@wordpress/i18n';
5
+ import {
6
+ Button,
7
+ DropZone,
8
+ __experimentalSpacer as Spacer,
9
+ __experimentalText as Text,
10
+ FormFileUpload,
11
+ } from '@wordpress/components';
12
+ import { useContext } from '@wordpress/element';
13
+
14
+ /**
15
+ * Internal dependencies
16
+ */
17
+ import { ALLOWED_FILE_EXTENSIONS } from './utils/constants';
18
+ import { FontLibraryContext } from './context';
19
+ import { Font } from '../../../../lib/lib-font.browser';
20
+ import makeFamiliesFromFaces from './utils/make-families-from-faces';
21
+ import { loadFontFaceInBrowser } from './utils';
22
+
23
+ function LocalFonts() {
24
+ const { installFonts } = useContext( FontLibraryContext );
25
+
26
+ const handleDropZone = ( files ) => {
27
+ handleFilesUpload( files );
28
+ };
29
+ const onFilesUpload = ( event ) => {
30
+ handleFilesUpload( event.target.files );
31
+ };
32
+
33
+ /**
34
+ * Filters the selected files to only allow the ones with the allowed extensions
35
+ *
36
+ * @param {Array} files The files to be filtered
37
+ * @return {void}
38
+ */
39
+ const handleFilesUpload = ( files ) => {
40
+ const uniqueFilenames = new Set();
41
+ const selectedFiles = [ ...files ];
42
+ const allowedFiles = selectedFiles.filter( ( file ) => {
43
+ if ( uniqueFilenames.has( file.name ) ) {
44
+ return false; // Discard duplicates
45
+ }
46
+ // Eliminates files that are not allowed
47
+ const fileExtension = file.name.split( '.' ).pop().toLowerCase();
48
+ if ( ALLOWED_FILE_EXTENSIONS.includes( fileExtension ) ) {
49
+ uniqueFilenames.add( file.name );
50
+ return true; // Keep file if the extension is allowed
51
+ }
52
+ return false; // Discard file extension not allowed
53
+ } );
54
+ if ( allowedFiles.length > 0 ) {
55
+ loadFiles( allowedFiles );
56
+ }
57
+ };
58
+
59
+ /**
60
+ * Loads the selected files and reads the font metadata
61
+ *
62
+ * @param {Array} files The files to be loaded
63
+ * @return {void}
64
+ */
65
+ const loadFiles = async ( files ) => {
66
+ const fontFacesLoaded = await Promise.all(
67
+ files.map( async ( fontFile ) => {
68
+ const fontFaceData = await getFontFaceMetadata( fontFile );
69
+ await loadFontFaceInBrowser(
70
+ fontFaceData,
71
+ fontFaceData.file,
72
+ 'all'
73
+ );
74
+ return fontFaceData;
75
+ } )
76
+ );
77
+ await handleInstall( fontFacesLoaded );
78
+ };
79
+
80
+ // Create a function to read the file as array buffer
81
+ async function readFileAsArrayBuffer( file ) {
82
+ return new Promise( ( resolve, reject ) => {
83
+ const reader = new window.FileReader();
84
+ reader.readAsArrayBuffer( file );
85
+ reader.onload = () => resolve( reader.result );
86
+ reader.onerror = reject;
87
+ } );
88
+ }
89
+
90
+ const getFontFaceMetadata = async ( fontFile ) => {
91
+ const buffer = await readFileAsArrayBuffer( fontFile );
92
+ const fontObj = new Font( 'Uploaded Font' );
93
+ fontObj.fromDataBuffer( buffer, fontFile.name );
94
+ // Assuming that fromDataBuffer triggers onload event and returning a Promise
95
+ const onloadEvent = await new Promise(
96
+ ( resolve ) => ( fontObj.onload = resolve )
97
+ );
98
+ const font = onloadEvent.detail.font;
99
+ const { name } = font.opentype.tables;
100
+ const fontName = name.get( 16 ) || name.get( 1 );
101
+ const isItalic = name.get( 2 ).toLowerCase().includes( 'italic' );
102
+ const fontWeight =
103
+ font.opentype.tables[ 'OS/2' ].usWeightClass || 'normal';
104
+ const isVariable = !! font.opentype.tables.fvar;
105
+ const weightAxis =
106
+ isVariable &&
107
+ font.opentype.tables.fvar.axes.find(
108
+ ( { tag } ) => tag === 'wght'
109
+ );
110
+ const weightRange = weightAxis
111
+ ? `${ weightAxis.minValue } ${ weightAxis.maxValue }`
112
+ : null;
113
+ return {
114
+ file: fontFile,
115
+ fontFamily: fontName,
116
+ fontStyle: isItalic ? 'italic' : 'normal',
117
+ fontWeight: weightRange || fontWeight,
118
+ };
119
+ };
120
+
121
+ /**
122
+ * Creates the font family definition and sends it to the server
123
+ *
124
+ * @param {Array} fontFaces The font faces to be installed
125
+ * @return {void}
126
+ */
127
+ const handleInstall = async ( fontFaces ) => {
128
+ const fontFamilies = makeFamiliesFromFaces( fontFaces );
129
+ await installFonts( fontFamilies );
130
+ };
131
+
132
+ return (
133
+ <>
134
+ <Text className="font-library-modal__subtitle">
135
+ { __( 'Upload Fonts' ) }
136
+ </Text>
137
+ <Spacer margin={ 2 } />
138
+ <DropZone onFilesDrop={ handleDropZone } />
139
+ <FormFileUpload
140
+ accept={ ALLOWED_FILE_EXTENSIONS.map(
141
+ ( ext ) => `.${ ext }`
142
+ ).join( ',' ) }
143
+ multiple={ true }
144
+ onChange={ onFilesUpload }
145
+ render={ ( { openFileDialog } ) => (
146
+ <Button
147
+ className="font-library-modal__upload-area"
148
+ onClick={ openFileDialog }
149
+ >
150
+ <span>
151
+ { __( 'Drag and drop your font files here.' ) }
152
+ </span>
153
+ </Button>
154
+ ) }
155
+ />
156
+ </>
157
+ );
158
+ }
159
+
160
+ export default LocalFonts;