@goldencomm/create-baseline 0.0.1 → 0.1.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 (756) hide show
  1. package/README.md +18 -79
  2. package/index.mjs +175 -283
  3. package/package.json +13 -30
  4. package/templates/ci/bitbucket-pipelines.yml +29 -0
  5. package/templates/code-connect/accordion-item.figma.ts +45 -0
  6. package/templates/code-connect/accordion.figma.ts +40 -0
  7. package/templates/code-connect/alert.figma.ts +378 -0
  8. package/templates/code-connect/avatar-badge.figma.ts +14 -0
  9. package/templates/code-connect/avatar-group-count.figma.ts +16 -0
  10. package/templates/code-connect/avatar-group.figma.ts +30 -0
  11. package/templates/code-connect/avatar.figma.ts +34 -0
  12. package/templates/code-connect/badge.figma.ts +383 -0
  13. package/templates/code-connect/breadcrumb-item.figma.ts +23 -0
  14. package/templates/code-connect/breadcrumb-separator.figma.ts +12 -0
  15. package/templates/code-connect/breadcrumb.figma.ts +32 -0
  16. package/templates/code-connect/button-group.figma.ts +28 -0
  17. package/templates/code-connect/button.figma.ts +408 -0
  18. package/templates/code-connect/card.figma.ts +74 -0
  19. package/templates/code-connect/carousel.figma.ts +27 -0
  20. package/templates/code-connect/checkbox.figma.ts +34 -0
  21. package/templates/code-connect/columns-1.figma.ts +43 -0
  22. package/templates/code-connect/columns-2.figma.ts +49 -0
  23. package/templates/code-connect/columns-3.figma.ts +45 -0
  24. package/templates/code-connect/columns-4.figma.ts +46 -0
  25. package/templates/code-connect/container.figma.ts +42 -0
  26. package/templates/code-connect/dialog.figma.ts +72 -0
  27. package/templates/code-connect/drawer.figma.ts +69 -0
  28. package/templates/code-connect/dropdown-menu-checkbox-item.figma.ts +19 -0
  29. package/templates/code-connect/dropdown-menu-item.figma.ts +25 -0
  30. package/templates/code-connect/dropdown-menu-label.figma.ts +16 -0
  31. package/templates/code-connect/dropdown-menu-radio-item.figma.ts +19 -0
  32. package/templates/code-connect/dropdown-menu-separator.figma.ts +12 -0
  33. package/templates/code-connect/dropdown-menu-sub-trigger.figma.ts +22 -0
  34. package/templates/code-connect/dropdown-menu.figma.ts +44 -0
  35. package/templates/code-connect/field-horizontal.figma.ts +73 -0
  36. package/templates/code-connect/field.figma.ts +68 -0
  37. package/templates/code-connect/hover-card.figma.ts +41 -0
  38. package/templates/code-connect/icon-button.figma.ts +382 -0
  39. package/templates/code-connect/input-group.figma.ts +51 -0
  40. package/templates/code-connect/input-otp.figma.ts +40 -0
  41. package/templates/code-connect/input.figma.ts +42 -0
  42. package/templates/code-connect/item-group.figma.ts +30 -0
  43. package/templates/code-connect/item.figma.ts +50 -0
  44. package/templates/code-connect/kbd.figma.ts +16 -0
  45. package/templates/code-connect/media.figma.ts +35 -0
  46. package/templates/code-connect/meter.figma.ts +31 -0
  47. package/templates/code-connect/native-select.figma.ts +36 -0
  48. package/templates/code-connect/navigation-menu-link.figma.ts +33 -0
  49. package/templates/code-connect/navigation-menu-trigger.figma.ts +28 -0
  50. package/templates/code-connect/navigation-menu.figma.ts +30 -0
  51. package/templates/code-connect/pagination-ellipsis.figma.ts +11 -0
  52. package/templates/code-connect/pagination-link.figma.ts +24 -0
  53. package/templates/code-connect/pagination-next.figma.ts +17 -0
  54. package/templates/code-connect/pagination-previous.figma.ts +17 -0
  55. package/templates/code-connect/pagination.figma.ts +33 -0
  56. package/templates/code-connect/panel.figma.ts +40 -0
  57. package/templates/code-connect/popover.figma.ts +58 -0
  58. package/templates/code-connect/progress.figma.ts +34 -0
  59. package/templates/code-connect/radio.figma.ts +29 -0
  60. package/templates/code-connect/section.figma.ts +42 -0
  61. package/templates/code-connect/select.figma.ts +30 -0
  62. package/templates/code-connect/sheet.figma.ts +70 -0
  63. package/templates/code-connect/sidebar-menu-button.figma.ts +36 -0
  64. package/templates/code-connect/sidebar.figma.ts +44 -0
  65. package/templates/code-connect/spinner.figma.ts +13 -0
  66. package/templates/code-connect/switch.figma.ts +32 -0
  67. package/templates/code-connect/table-cell.figma.ts +21 -0
  68. package/templates/code-connect/table.figma.ts +62 -0
  69. package/templates/code-connect/tabs-trigger.figma.ts +369 -0
  70. package/templates/code-connect/tabs.figma.ts +28 -0
  71. package/templates/code-connect/textarea.figma.ts +32 -0
  72. package/templates/code-connect/toggle-group.figma.ts +24 -0
  73. package/templates/code-connect/toggle.figma.ts +385 -0
  74. package/templates/code-connect/tooltip.figma.ts +29 -0
  75. package/templates/next/app/globals.css +13 -12
  76. package/templates/next/app/page.tsx +38 -26
  77. package/templates/next/public/placeholder.svg +1 -0
  78. package/templates/shopify/.gitattributes +1 -0
  79. package/templates/shopify/.shopifyignore +23 -0
  80. package/templates/shopify/.theme-check.yml +1 -0
  81. package/templates/shopify/CODE_OF_CONDUCT.md +132 -0
  82. package/templates/shopify/CONTRIBUTING.md +24 -0
  83. package/templates/shopify/LICENSE.md +9 -0
  84. package/templates/shopify/README.md +160 -0
  85. package/templates/shopify/assets/carousel.js +2 -0
  86. package/templates/shopify/assets/critical.css +117 -0
  87. package/templates/shopify/assets/icon-account.svg +6 -0
  88. package/templates/shopify/assets/icon-cart.svg +5 -0
  89. package/templates/shopify/assets/predictive-search.js +65 -0
  90. package/templates/shopify/assets/shoppy-x-ray.svg +1 -0
  91. package/templates/shopify/blocks/_accordion-item.liquid +44 -0
  92. package/templates/shopify/blocks/_card-footer.liquid +26 -0
  93. package/templates/shopify/blocks/_carousel-slide.liquid +21 -0
  94. package/templates/shopify/blocks/_column.liquid +30 -0
  95. package/templates/shopify/blocks/_dialog-footer.liquid +28 -0
  96. package/templates/shopify/blocks/_sheet-footer.liquid +28 -0
  97. package/templates/shopify/blocks/_tab.liquid +21 -0
  98. package/templates/shopify/blocks/accordion.liquid +40 -0
  99. package/templates/shopify/blocks/blog-posts.liquid +70 -0
  100. package/templates/shopify/blocks/button.figma.ts +359 -0
  101. package/templates/shopify/blocks/button.liquid +477 -0
  102. package/templates/shopify/blocks/card.liquid +73 -0
  103. package/templates/shopify/blocks/carousel.liquid +47 -0
  104. package/templates/shopify/blocks/columns.liquid +73 -0
  105. package/templates/shopify/blocks/contact-form.liquid +69 -0
  106. package/templates/shopify/blocks/container.liquid +29 -0
  107. package/templates/shopify/blocks/dialog.liquid +77 -0
  108. package/templates/shopify/blocks/group.liquid +105 -0
  109. package/templates/shopify/blocks/heading.liquid +57 -0
  110. package/templates/shopify/blocks/icon-button.figma.ts +358 -0
  111. package/templates/shopify/blocks/media.liquid +80 -0
  112. package/templates/shopify/blocks/navigation-menu.liquid +23 -0
  113. package/templates/shopify/blocks/panel.liquid +64 -0
  114. package/templates/shopify/blocks/popover.liquid +88 -0
  115. package/templates/shopify/blocks/section-heading.liquid +68 -0
  116. package/templates/shopify/blocks/sheet.liquid +90 -0
  117. package/templates/shopify/blocks/tabs.liquid +58 -0
  118. package/templates/shopify/blocks/text.liquid +59 -0
  119. package/templates/shopify/build-js.mjs +22 -0
  120. package/templates/shopify/config/settings_data.json +182 -0
  121. package/templates/shopify/config/settings_schema.json +365 -0
  122. package/templates/shopify/layout/password.liquid +19 -0
  123. package/templates/shopify/layout/theme.liquid +57 -0
  124. package/templates/shopify/locales/en.default.json +58 -0
  125. package/templates/shopify/locales/en.default.schema.json +303 -0
  126. package/templates/shopify/package-lock.json +521 -0
  127. package/templates/shopify/package.json +17 -0
  128. package/templates/shopify/sections/404.liquid +23 -0
  129. package/templates/shopify/sections/article.liquid +81 -0
  130. package/templates/shopify/sections/baseline-header.liquid +236 -0
  131. package/templates/shopify/sections/baseline-kitchen-sink.liquid +988 -0
  132. package/templates/shopify/sections/baseline-section.liquid +661 -0
  133. package/templates/shopify/sections/blog.liquid +36 -0
  134. package/templates/shopify/sections/cart.liquid +65 -0
  135. package/templates/shopify/sections/collection.liquid +54 -0
  136. package/templates/shopify/sections/collections.liquid +83 -0
  137. package/templates/shopify/sections/custom-section.liquid +60 -0
  138. package/templates/shopify/sections/footer-group.json +25 -0
  139. package/templates/shopify/sections/footer.liquid +57 -0
  140. package/templates/shopify/sections/header-group.json +22 -0
  141. package/templates/shopify/sections/page.liquid +18 -0
  142. package/templates/shopify/sections/password.liquid +36 -0
  143. package/templates/shopify/sections/product.liquid +60 -0
  144. package/templates/shopify/sections/search.liquid +73 -0
  145. package/templates/shopify/snippets/accordion-item.figma.ts +34 -0
  146. package/templates/shopify/snippets/accordion-item.liquid +36 -0
  147. package/templates/shopify/snippets/accordion.figma.ts +37 -0
  148. package/templates/shopify/snippets/accordion.liquid +169 -0
  149. package/templates/shopify/snippets/alert.figma.ts +31 -0
  150. package/templates/shopify/snippets/alert.liquid +104 -0
  151. package/templates/shopify/snippets/avatar-group.figma.ts +17 -0
  152. package/templates/shopify/snippets/avatar-group.liquid +66 -0
  153. package/templates/shopify/snippets/avatar.figma.ts +24 -0
  154. package/templates/shopify/snippets/avatar.liquid +143 -0
  155. package/templates/shopify/snippets/badge.figma.ts +355 -0
  156. package/templates/shopify/snippets/badge.liquid +111 -0
  157. package/templates/shopify/snippets/baseline-schemes.liquid +44 -0
  158. package/templates/shopify/snippets/baseline-tokens.liquid +712 -0
  159. package/templates/shopify/snippets/breadcrumb.figma.ts +12 -0
  160. package/templates/shopify/snippets/breadcrumb.liquid +124 -0
  161. package/templates/shopify/snippets/button-group.liquid +148 -0
  162. package/templates/shopify/snippets/button.liquid +144 -0
  163. package/templates/shopify/snippets/card.figma.ts +43 -0
  164. package/templates/shopify/snippets/card.liquid +196 -0
  165. package/templates/shopify/snippets/carousel-item.liquid +18 -0
  166. package/templates/shopify/snippets/carousel.figma.ts +28 -0
  167. package/templates/shopify/snippets/carousel.liquid +121 -0
  168. package/templates/shopify/snippets/checkbox.liquid +147 -0
  169. package/templates/shopify/snippets/container.liquid +52 -0
  170. package/templates/shopify/snippets/css-variables.liquid +18 -0
  171. package/templates/shopify/snippets/dialog.figma.ts +36 -0
  172. package/templates/shopify/snippets/dialog.liquid +217 -0
  173. package/templates/shopify/snippets/field-separator.liquid +68 -0
  174. package/templates/shopify/snippets/field.liquid +187 -0
  175. package/templates/shopify/snippets/icon.liquid +101 -0
  176. package/templates/shopify/snippets/image.liquid +64 -0
  177. package/templates/shopify/snippets/input-group.liquid +196 -0
  178. package/templates/shopify/snippets/input.liquid +126 -0
  179. package/templates/shopify/snippets/item-group.liquid +31 -0
  180. package/templates/shopify/snippets/item.figma.ts +40 -0
  181. package/templates/shopify/snippets/item.liquid +162 -0
  182. package/templates/shopify/snippets/media.figma.ts +33 -0
  183. package/templates/shopify/snippets/media.liquid +273 -0
  184. package/templates/shopify/snippets/meta-tags.liquid +105 -0
  185. package/templates/shopify/snippets/meter.figma.ts +24 -0
  186. package/templates/shopify/snippets/meter.liquid +118 -0
  187. package/templates/shopify/snippets/native-select.liquid +141 -0
  188. package/templates/shopify/snippets/navigation-menu-item.figma.ts +23 -0
  189. package/templates/shopify/snippets/navigation-menu-item.liquid +40 -0
  190. package/templates/shopify/snippets/navigation-menu-link.figma.ts +27 -0
  191. package/templates/shopify/snippets/navigation-menu-link.liquid +31 -0
  192. package/templates/shopify/snippets/navigation-menu.figma.ts +12 -0
  193. package/templates/shopify/snippets/navigation-menu.liquid +300 -0
  194. package/templates/shopify/snippets/pagination.figma.ts +13 -0
  195. package/templates/shopify/snippets/pagination.liquid +208 -0
  196. package/templates/shopify/snippets/popover.figma.ts +41 -0
  197. package/templates/shopify/snippets/popover.liquid +203 -0
  198. package/templates/shopify/snippets/progress.figma.ts +26 -0
  199. package/templates/shopify/snippets/progress.liquid +114 -0
  200. package/templates/shopify/snippets/radio.liquid +145 -0
  201. package/templates/shopify/snippets/sheet.figma.ts +37 -0
  202. package/templates/shopify/snippets/sheet.liquid +197 -0
  203. package/templates/shopify/snippets/sidebar-menu-item.liquid +34 -0
  204. package/templates/shopify/snippets/sidebar-menu-sub-link.liquid +17 -0
  205. package/templates/shopify/snippets/sidebar-menu.liquid +139 -0
  206. package/templates/shopify/snippets/spinner.liquid +42 -0
  207. package/templates/shopify/snippets/switch.liquid +180 -0
  208. package/templates/shopify/snippets/tab.figma.ts +353 -0
  209. package/templates/shopify/snippets/tab.liquid +33 -0
  210. package/templates/shopify/snippets/tabs.figma.ts +21 -0
  211. package/templates/shopify/snippets/tabs.liquid +260 -0
  212. package/templates/shopify/snippets/text-styles.liquid +45 -0
  213. package/templates/shopify/snippets/textarea.liquid +103 -0
  214. package/templates/shopify/snippets/toggle-group.figma.ts +30 -0
  215. package/templates/shopify/snippets/toggle-group.liquid +46 -0
  216. package/templates/shopify/snippets/toggle.figma.ts +357 -0
  217. package/templates/shopify/snippets/toggle.liquid +104 -0
  218. package/templates/shopify/snippets/typeset.liquid +498 -0
  219. package/templates/shopify/src/carousel.js +94 -0
  220. package/templates/shopify/templates/404.json +20 -0
  221. package/templates/shopify/templates/article.json +20 -0
  222. package/templates/shopify/templates/blog.json +20 -0
  223. package/templates/shopify/templates/cart.json +20 -0
  224. package/templates/shopify/templates/collection.json +20 -0
  225. package/templates/shopify/templates/gift_card.liquid +73 -0
  226. package/templates/shopify/templates/index.json +18 -0
  227. package/templates/shopify/templates/list-collections.json +20 -0
  228. package/templates/shopify/templates/page.json +20 -0
  229. package/templates/shopify/templates/password.json +21 -0
  230. package/templates/shopify/templates/product.json +20 -0
  231. package/templates/shopify/templates/search.json +20 -0
  232. package/templates/skills/baseline-client-tokens/SKILL.md +74 -0
  233. package/templates/wordpress/.ddev/commands/web/seed +258 -3
  234. package/templates/wordpress/.ddev/config.yaml +10 -7
  235. package/templates/wordpress/.ddev/seed/gravityforms-contact.json +1 -0
  236. package/templates/wordpress/README.md +37 -39
  237. package/templates/wordpress/auth.json.example +1 -1
  238. package/templates/wordpress/composer.json +88 -84
  239. package/templates/wordpress/theme/README.md +3 -0
  240. package/templates/wordpress/theme/acf-json/.gitkeep +0 -0
  241. package/templates/wordpress/theme/acf-json/group_baseline_alert.json +83 -0
  242. package/templates/wordpress/theme/acf-json/group_baseline_avatar.json +82 -0
  243. package/templates/wordpress/theme/acf-json/group_baseline_avatar_group.json +35 -0
  244. package/templates/wordpress/theme/acf-json/group_baseline_badge.json +93 -0
  245. package/templates/wordpress/theme/acf-json/group_baseline_carousel.json +21 -0
  246. package/templates/wordpress/theme/acf-json/group_baseline_carousel_slide.json +16 -0
  247. package/templates/wordpress/theme/acf-json/group_baseline_dialog.json +68 -0
  248. package/templates/wordpress/theme/acf-json/group_baseline_dialog_footer.json +23 -0
  249. package/templates/wordpress/theme/acf-json/group_baseline_item.json +101 -0
  250. package/templates/wordpress/theme/acf-json/group_baseline_item_group.json +26 -0
  251. package/templates/wordpress/theme/acf-json/group_baseline_sheet.json +104 -0
  252. package/templates/wordpress/theme/acf-json/group_baseline_sheet_footer.json +31 -0
  253. package/templates/wordpress/theme/assets/app.css +2 -0
  254. package/templates/wordpress/theme/assets/editor.css +2 -0
  255. package/templates/wordpress/theme/assets/images/placeholder.svg +1 -0
  256. package/templates/wordpress/theme/assets/js/carousel-editor.js +85 -0
  257. package/templates/wordpress/theme/assets/js/carousel.js +2 -0
  258. package/templates/wordpress/theme/assets/js/core-button-editor.js +243 -0
  259. package/templates/wordpress/theme/assets/js/core-layout-editor.js +144 -0
  260. package/templates/wordpress/theme/assets/js/core-navigation.js +11 -0
  261. package/templates/wordpress/theme/assets/js/media-editor.js +52 -0
  262. package/templates/wordpress/theme/assets/js/media.js +38 -0
  263. package/templates/wordpress/theme/assets/tokens.css +1030 -0
  264. package/templates/wordpress/theme/blocks/alert/alert.figma.ts +32 -0
  265. package/templates/wordpress/theme/blocks/alert/block.json +24 -0
  266. package/templates/wordpress/theme/blocks/alert/render.php +30 -0
  267. package/templates/wordpress/theme/blocks/avatar/block.json +24 -0
  268. package/templates/wordpress/theme/blocks/avatar/render.php +35 -0
  269. package/templates/wordpress/theme/blocks/avatar-group/avatar-group.figma.ts +16 -0
  270. package/templates/wordpress/theme/blocks/avatar-group/block.json +25 -0
  271. package/templates/wordpress/theme/blocks/avatar-group/render.php +27 -0
  272. package/templates/wordpress/theme/blocks/badge/badge.figma.ts +349 -0
  273. package/templates/wordpress/theme/blocks/badge/block.json +23 -0
  274. package/templates/wordpress/theme/blocks/badge/render.php +28 -0
  275. package/templates/wordpress/theme/blocks/carousel/block.json +25 -0
  276. package/templates/wordpress/theme/blocks/carousel/carousel.figma.ts +22 -0
  277. package/templates/wordpress/theme/blocks/carousel/render.php +54 -0
  278. package/templates/wordpress/theme/blocks/carousel-slide/block.json +24 -0
  279. package/templates/wordpress/theme/blocks/carousel-slide/render.php +13 -0
  280. package/templates/wordpress/theme/blocks/dialog/block.json +24 -0
  281. package/templates/wordpress/theme/blocks/dialog/dialog.figma.ts +36 -0
  282. package/templates/wordpress/theme/blocks/dialog/render.php +41 -0
  283. package/templates/wordpress/theme/blocks/dialog-footer/block.json +25 -0
  284. package/templates/wordpress/theme/blocks/dialog-footer/render.php +18 -0
  285. package/templates/wordpress/theme/blocks/item/block.json +25 -0
  286. package/templates/wordpress/theme/blocks/item/item.figma.ts +43 -0
  287. package/templates/wordpress/theme/blocks/item/render.php +38 -0
  288. package/templates/wordpress/theme/blocks/item-group/block.json +25 -0
  289. package/templates/wordpress/theme/blocks/item-group/item-group.figma.ts +28 -0
  290. package/templates/wordpress/theme/blocks/item-group/render.php +22 -0
  291. package/templates/wordpress/theme/blocks/sheet/block.json +24 -0
  292. package/templates/wordpress/theme/blocks/sheet/render.php +39 -0
  293. package/templates/wordpress/theme/blocks/sheet/sheet.figma.ts +38 -0
  294. package/templates/wordpress/theme/blocks/sheet-footer/block.json +25 -0
  295. package/templates/wordpress/theme/blocks/sheet-footer/render.php +18 -0
  296. package/templates/wordpress/theme/build-js.mjs +22 -0
  297. package/templates/wordpress/theme/code-connect/accordion-item.figma.ts +47 -0
  298. package/templates/wordpress/theme/code-connect/accordion.figma.ts +37 -0
  299. package/templates/wordpress/theme/code-connect/avatar.figma.ts +25 -0
  300. package/templates/wordpress/theme/code-connect/breadcrumb.figma.ts +12 -0
  301. package/templates/wordpress/theme/code-connect/button.figma.ts +360 -0
  302. package/templates/wordpress/theme/code-connect/card.figma.ts +45 -0
  303. package/templates/wordpress/theme/code-connect/icon-button.figma.ts +359 -0
  304. package/templates/wordpress/theme/code-connect/navigation-menu.figma.ts +20 -0
  305. package/templates/wordpress/theme/code-connect/pagination.figma.ts +17 -0
  306. package/templates/wordpress/theme/code-connect/popover.figma.ts +42 -0
  307. package/templates/wordpress/theme/code-connect/tabs.figma.ts +32 -0
  308. package/templates/wordpress/theme/code-connect/toggle-group.figma.ts +34 -0
  309. package/templates/wordpress/theme/code-connect/toggle.figma.ts +356 -0
  310. package/templates/wordpress/theme/composer.json +7 -0
  311. package/templates/wordpress/theme/footer.php +4 -0
  312. package/templates/wordpress/theme/functions.php +86 -0
  313. package/templates/wordpress/theme/header.php +17 -0
  314. package/templates/wordpress/theme/inc/acf.php +13 -0
  315. package/templates/wordpress/theme/inc/blocks.php +41 -0
  316. package/templates/wordpress/theme/inc/carousel.php +36 -0
  317. package/templates/wordpress/theme/inc/components/alert.php +83 -0
  318. package/templates/wordpress/theme/inc/components/avatar.php +111 -0
  319. package/templates/wordpress/theme/inc/components/badge.php +96 -0
  320. package/templates/wordpress/theme/inc/components/button.php +77 -0
  321. package/templates/wordpress/theme/inc/components/dialog.php +98 -0
  322. package/templates/wordpress/theme/inc/components/item.php +111 -0
  323. package/templates/wordpress/theme/inc/components/popover.php +125 -0
  324. package/templates/wordpress/theme/inc/components/sheet.php +88 -0
  325. package/templates/wordpress/theme/inc/components/toggle.php +127 -0
  326. package/templates/wordpress/theme/inc/core-button.php +96 -0
  327. package/templates/wordpress/theme/inc/core-card.php +30 -0
  328. package/templates/wordpress/theme/inc/core-layout.php +76 -0
  329. package/templates/wordpress/theme/inc/core-navigation.php +31 -0
  330. package/templates/wordpress/theme/inc/core-pagination.php +87 -0
  331. package/templates/wordpress/theme/inc/header.php +39 -0
  332. package/templates/wordpress/theme/inc/icons.generated.php +94 -0
  333. package/templates/wordpress/theme/inc/icons.php +70 -0
  334. package/templates/wordpress/theme/inc/looks.generated.php +18 -0
  335. package/templates/wordpress/theme/inc/media.php +183 -0
  336. package/templates/wordpress/theme/inc/sections.php +16 -0
  337. package/templates/wordpress/theme/index.php +24 -0
  338. package/templates/wordpress/theme/package-lock.json +1637 -0
  339. package/templates/wordpress/theme/package.json +23 -0
  340. package/templates/wordpress/theme/parts/header.html +23 -0
  341. package/templates/wordpress/theme/patterns/blog-card-grid.php +41 -0
  342. package/templates/wordpress/theme/patterns/card.php +46 -0
  343. package/templates/wordpress/theme/patterns/contact-centered.php +22 -0
  344. package/templates/wordpress/theme/patterns/cta-left.php +25 -0
  345. package/templates/wordpress/theme/patterns/faq-centered.php +36 -0
  346. package/templates/wordpress/theme/patterns/header-inline.php +33 -0
  347. package/templates/wordpress/theme/patterns/header-stacked.php +25 -0
  348. package/templates/wordpress/theme/patterns/hero-centered.php +28 -0
  349. package/templates/wordpress/theme/patterns/hero-split.php +41 -0
  350. package/templates/wordpress/theme/patterns/section.php +28 -0
  351. package/templates/wordpress/theme/src/app.css +45 -0
  352. package/templates/wordpress/theme/src/carousel.css +93 -0
  353. package/templates/wordpress/theme/src/carousel.js +94 -0
  354. package/templates/wordpress/theme/src/checkbox.css +102 -0
  355. package/templates/wordpress/theme/src/core-accordion.css +158 -0
  356. package/templates/wordpress/theme/src/core-avatar.css +68 -0
  357. package/templates/wordpress/theme/src/core-breadcrumbs.css +124 -0
  358. package/templates/wordpress/theme/src/core-button-editor.css +45 -0
  359. package/templates/wordpress/theme/src/core-button.css +155 -0
  360. package/templates/wordpress/theme/src/core-card.css +157 -0
  361. package/templates/wordpress/theme/src/core-layout.css +73 -0
  362. package/templates/wordpress/theme/src/core-navigation.css +290 -0
  363. package/templates/wordpress/theme/src/core-pagination.css +112 -0
  364. package/templates/wordpress/theme/src/core-table.css +88 -0
  365. package/templates/wordpress/theme/src/core-tabs.css +86 -0
  366. package/templates/wordpress/theme/src/dialog.css +29 -0
  367. package/templates/wordpress/theme/src/editor.css +65 -0
  368. package/templates/wordpress/theme/src/field.css +95 -0
  369. package/templates/wordpress/theme/src/fonts.css +3 -0
  370. package/templates/wordpress/theme/src/gravityforms.css +919 -0
  371. package/templates/wordpress/theme/src/header.css +80 -0
  372. package/templates/wordpress/theme/src/icons.generated.css +16 -0
  373. package/templates/wordpress/theme/src/input-group.css +105 -0
  374. package/templates/wordpress/theme/src/input.css +116 -0
  375. package/templates/wordpress/theme/src/item.css +7 -0
  376. package/templates/wordpress/theme/src/looks.generated.css +358 -0
  377. package/templates/wordpress/theme/src/media.css +160 -0
  378. package/templates/wordpress/theme/src/radio.css +88 -0
  379. package/templates/wordpress/theme/src/sections.css +80 -0
  380. package/templates/wordpress/theme/src/sheet.css +24 -0
  381. package/templates/wordpress/theme/src/switch.css +120 -0
  382. package/templates/wordpress/theme/src/text-styles.css +44 -0
  383. package/templates/wordpress/theme/src/textarea.css +61 -0
  384. package/templates/wordpress/theme/src/toggle-group.css +28 -0
  385. package/templates/wordpress/theme/src/typeset.css +510 -0
  386. package/templates/wordpress/theme/style.css +13 -0
  387. package/templates/wordpress/theme/theme.json +362 -0
  388. package/templates/wordpress/web/wp-config.php +38 -0
  389. package/templates/wordpress/wp-cli.yml +1 -0
  390. package/templates/next/.claude/skills/ai-elements/SKILL.md +0 -160
  391. package/templates/next/.claude/skills/ai-elements/references/agent.md +0 -134
  392. package/templates/next/.claude/skills/ai-elements/references/artifact.md +0 -84
  393. package/templates/next/.claude/skills/ai-elements/references/attachments.md +0 -190
  394. package/templates/next/.claude/skills/ai-elements/references/audio-player.md +0 -134
  395. package/templates/next/.claude/skills/ai-elements/references/canvas.md +0 -34
  396. package/templates/next/.claude/skills/ai-elements/references/chain-of-thought.md +0 -81
  397. package/templates/next/.claude/skills/ai-elements/references/checkpoint.md +0 -183
  398. package/templates/next/.claude/skills/ai-elements/references/code-block.md +0 -170
  399. package/templates/next/.claude/skills/ai-elements/references/commit.md +0 -177
  400. package/templates/next/.claude/skills/ai-elements/references/confirmation.md +0 -262
  401. package/templates/next/.claude/skills/ai-elements/references/connection.md +0 -34
  402. package/templates/next/.claude/skills/ai-elements/references/context.md +0 -126
  403. package/templates/next/.claude/skills/ai-elements/references/controls.md +0 -32
  404. package/templates/next/.claude/skills/ai-elements/references/conversation.md +0 -224
  405. package/templates/next/.claude/skills/ai-elements/references/edge.md +0 -52
  406. package/templates/next/.claude/skills/ai-elements/references/environment-variables.md +0 -102
  407. package/templates/next/.claude/skills/ai-elements/references/file-tree.md +0 -72
  408. package/templates/next/.claude/skills/ai-elements/references/image.md +0 -146
  409. package/templates/next/.claude/skills/ai-elements/references/inline-citation.md +0 -299
  410. package/templates/next/.claude/skills/ai-elements/references/jsx-preview.md +0 -104
  411. package/templates/next/.claude/skills/ai-elements/references/message.md +0 -237
  412. package/templates/next/.claude/skills/ai-elements/references/mic-selector.md +0 -189
  413. package/templates/next/.claude/skills/ai-elements/references/model-selector.md +0 -112
  414. package/templates/next/.claude/skills/ai-elements/references/node.md +0 -73
  415. package/templates/next/.claude/skills/ai-elements/references/open-in-chat.md +0 -67
  416. package/templates/next/.claude/skills/ai-elements/references/package-info.md +0 -95
  417. package/templates/next/.claude/skills/ai-elements/references/panel.md +0 -33
  418. package/templates/next/.claude/skills/ai-elements/references/persona.md +0 -166
  419. package/templates/next/.claude/skills/ai-elements/references/plan.md +0 -79
  420. package/templates/next/.claude/skills/ai-elements/references/prompt-input.md +0 -579
  421. package/templates/next/.claude/skills/ai-elements/references/queue.md +0 -172
  422. package/templates/next/.claude/skills/ai-elements/references/reasoning.md +0 -238
  423. package/templates/next/.claude/skills/ai-elements/references/sandbox.md +0 -129
  424. package/templates/next/.claude/skills/ai-elements/references/schema-display.md +0 -102
  425. package/templates/next/.claude/skills/ai-elements/references/shimmer.md +0 -48
  426. package/templates/next/.claude/skills/ai-elements/references/snippet.md +0 -64
  427. package/templates/next/.claude/skills/ai-elements/references/sources.md +0 -209
  428. package/templates/next/.claude/skills/ai-elements/references/speech-input.md +0 -163
  429. package/templates/next/.claude/skills/ai-elements/references/stack-trace.md +0 -224
  430. package/templates/next/.claude/skills/ai-elements/references/suggestion.md +0 -124
  431. package/templates/next/.claude/skills/ai-elements/references/task.md +0 -222
  432. package/templates/next/.claude/skills/ai-elements/references/terminal.md +0 -103
  433. package/templates/next/.claude/skills/ai-elements/references/test-results.md +0 -157
  434. package/templates/next/.claude/skills/ai-elements/references/tool.md +0 -285
  435. package/templates/next/.claude/skills/ai-elements/references/toolbar.md +0 -32
  436. package/templates/next/.claude/skills/ai-elements/references/transcription.md +0 -120
  437. package/templates/next/.claude/skills/ai-elements/references/voice-selector.md +0 -241
  438. package/templates/next/.claude/skills/ai-elements/references/web-preview.md +0 -200
  439. package/templates/next/.claude/skills/ai-elements/scripts/agent.tsx +0 -61
  440. package/templates/next/.claude/skills/ai-elements/scripts/artifact.tsx +0 -127
  441. package/templates/next/.claude/skills/ai-elements/scripts/attachments-inline.tsx +0 -128
  442. package/templates/next/.claude/skills/ai-elements/scripts/attachments-list.tsx +0 -95
  443. package/templates/next/.claude/skills/ai-elements/scripts/attachments.tsx +0 -85
  444. package/templates/next/.claude/skills/ai-elements/scripts/audio-player-remote.tsx +0 -35
  445. package/templates/next/.claude/skills/ai-elements/scripts/audio-player.tsx +0 -68
  446. package/templates/next/.claude/skills/ai-elements/scripts/chain-of-thought.tsx +0 -82
  447. package/templates/next/.claude/skills/ai-elements/scripts/checkpoint.tsx +0 -110
  448. package/templates/next/.claude/skills/ai-elements/scripts/code-block-dark.tsx +0 -46
  449. package/templates/next/.claude/skills/ai-elements/scripts/code-block.tsx +0 -120
  450. package/templates/next/.claude/skills/ai-elements/scripts/commit.tsx +0 -94
  451. package/templates/next/.claude/skills/ai-elements/scripts/confirmation-accepted.tsx +0 -40
  452. package/templates/next/.claude/skills/ai-elements/scripts/confirmation-rejected.tsx +0 -40
  453. package/templates/next/.claude/skills/ai-elements/scripts/confirmation-request.tsx +0 -54
  454. package/templates/next/.claude/skills/ai-elements/scripts/confirmation.tsx +0 -55
  455. package/templates/next/.claude/skills/ai-elements/scripts/context.tsx +0 -45
  456. package/templates/next/.claude/skills/ai-elements/scripts/conversation.tsx +0 -177
  457. package/templates/next/.claude/skills/ai-elements/scripts/environment-variables.tsx +0 -62
  458. package/templates/next/.claude/skills/ai-elements/scripts/file-tree-basic.tsx +0 -18
  459. package/templates/next/.claude/skills/ai-elements/scripts/file-tree-expanded.tsx +0 -21
  460. package/templates/next/.claude/skills/ai-elements/scripts/file-tree-selection.tsx +0 -24
  461. package/templates/next/.claude/skills/ai-elements/scripts/file-tree.tsx +0 -42
  462. package/templates/next/.claude/skills/ai-elements/scripts/image.tsx +0 -20
  463. package/templates/next/.claude/skills/ai-elements/scripts/inline-citation.tsx +0 -97
  464. package/templates/next/.claude/skills/ai-elements/scripts/jsx-preview.tsx +0 -104
  465. package/templates/next/.claude/skills/ai-elements/scripts/message.tsx +0 -365
  466. package/templates/next/.claude/skills/ai-elements/scripts/mic-selector.tsx +0 -49
  467. package/templates/next/.claude/skills/ai-elements/scripts/model-selector.tsx +0 -365
  468. package/templates/next/.claude/skills/ai-elements/scripts/open-in-chat.tsx +0 -33
  469. package/templates/next/.claude/skills/ai-elements/scripts/package-info.tsx +0 -51
  470. package/templates/next/.claude/skills/ai-elements/scripts/persona-command.tsx +0 -110
  471. package/templates/next/.claude/skills/ai-elements/scripts/persona-glint.tsx +0 -110
  472. package/templates/next/.claude/skills/ai-elements/scripts/persona-halo.tsx +0 -110
  473. package/templates/next/.claude/skills/ai-elements/scripts/persona-mana.tsx +0 -110
  474. package/templates/next/.claude/skills/ai-elements/scripts/persona-obsidian.tsx +0 -110
  475. package/templates/next/.claude/skills/ai-elements/scripts/persona-opal.tsx +0 -110
  476. package/templates/next/.claude/skills/ai-elements/scripts/plan.tsx +0 -65
  477. package/templates/next/.claude/skills/ai-elements/scripts/prompt-input-cursor.tsx +0 -502
  478. package/templates/next/.claude/skills/ai-elements/scripts/prompt-input-tooltip.tsx +0 -44
  479. package/templates/next/.claude/skills/ai-elements/scripts/prompt-input.tsx +0 -267
  480. package/templates/next/.claude/skills/ai-elements/scripts/queue-prompt-input.tsx +0 -394
  481. package/templates/next/.claude/skills/ai-elements/scripts/queue.tsx +0 -295
  482. package/templates/next/.claude/skills/ai-elements/scripts/reasoning.tsx +0 -71
  483. package/templates/next/.claude/skills/ai-elements/scripts/sandbox.tsx +0 -178
  484. package/templates/next/.claude/skills/ai-elements/scripts/schema-display-basic.tsx +0 -9
  485. package/templates/next/.claude/skills/ai-elements/scripts/schema-display-body.tsx +0 -20
  486. package/templates/next/.claude/skills/ai-elements/scripts/schema-display-nested.tsx +0 -23
  487. package/templates/next/.claude/skills/ai-elements/scripts/schema-display-params.tsx +0 -16
  488. package/templates/next/.claude/skills/ai-elements/scripts/schema-display.tsx +0 -110
  489. package/templates/next/.claude/skills/ai-elements/scripts/shimmer-duration.tsx +0 -31
  490. package/templates/next/.claude/skills/ai-elements/scripts/shimmer-elements.tsx +0 -43
  491. package/templates/next/.claude/skills/ai-elements/scripts/shimmer.tsx +0 -17
  492. package/templates/next/.claude/skills/ai-elements/scripts/snippet-plain.tsx +0 -19
  493. package/templates/next/.claude/skills/ai-elements/scripts/snippet.tsx +0 -25
  494. package/templates/next/.claude/skills/ai-elements/scripts/sources-custom.tsx +0 -39
  495. package/templates/next/.claude/skills/ai-elements/scripts/sources.tsx +0 -32
  496. package/templates/next/.claude/skills/ai-elements/scripts/speech-input.tsx +0 -84
  497. package/templates/next/.claude/skills/ai-elements/scripts/stack-trace-collapsed.tsx +0 -39
  498. package/templates/next/.claude/skills/ai-elements/scripts/stack-trace-no-internal.tsx +0 -41
  499. package/templates/next/.claude/skills/ai-elements/scripts/stack-trace.tsx +0 -58
  500. package/templates/next/.claude/skills/ai-elements/scripts/suggestion-input.tsx +0 -144
  501. package/templates/next/.claude/skills/ai-elements/scripts/suggestion.tsx +0 -32
  502. package/templates/next/.claude/skills/ai-elements/scripts/task.tsx +0 -59
  503. package/templates/next/.claude/skills/ai-elements/scripts/terminal-basic.tsx +0 -7
  504. package/templates/next/.claude/skills/ai-elements/scripts/terminal-clear.tsx +0 -19
  505. package/templates/next/.claude/skills/ai-elements/scripts/terminal-streaming.tsx +0 -38
  506. package/templates/next/.claude/skills/ai-elements/scripts/terminal.tsx +0 -82
  507. package/templates/next/.claude/skills/ai-elements/scripts/test-results-basic.tsx +0 -27
  508. package/templates/next/.claude/skills/ai-elements/scripts/test-results-errors.tsx +0 -51
  509. package/templates/next/.claude/skills/ai-elements/scripts/test-results-suites.tsx +0 -40
  510. package/templates/next/.claude/skills/ai-elements/scripts/test-results.tsx +0 -102
  511. package/templates/next/.claude/skills/ai-elements/scripts/tool-input-available.tsx +0 -31
  512. package/templates/next/.claude/skills/ai-elements/scripts/tool-input-streaming.tsx +0 -30
  513. package/templates/next/.claude/skills/ai-elements/scripts/tool-output-available.tsx +0 -80
  514. package/templates/next/.claude/skills/ai-elements/scripts/tool-output-error.tsx +0 -44
  515. package/templates/next/.claude/skills/ai-elements/scripts/tool.tsx +0 -222
  516. package/templates/next/.claude/skills/ai-elements/scripts/transcription.tsx +0 -290
  517. package/templates/next/.claude/skills/ai-elements/scripts/voice-selector.tsx +0 -245
  518. package/templates/next/.claude/skills/ai-elements/scripts/web-preview.tsx +0 -115
  519. package/templates/next/.claude/skills/ai-sdk/SKILL.md +0 -78
  520. package/templates/next/.claude/skills/frontend-design/LICENSE.txt +0 -177
  521. package/templates/next/.claude/skills/frontend-design/SKILL.md +0 -55
  522. package/templates/next/.claude/skills/gc-implement-figma-page/SKILL.md +0 -93
  523. package/templates/next/.claude/skills/migrate-ai-sdk-v6-to-v7/SKILL.md +0 -108
  524. package/templates/next/.claude/skills/vercel-composition-patterns/AGENTS.md +0 -946
  525. package/templates/next/.claude/skills/vercel-composition-patterns/README.md +0 -60
  526. package/templates/next/.claude/skills/vercel-composition-patterns/SKILL.md +0 -89
  527. package/templates/next/.claude/skills/vercel-composition-patterns/metadata.json +0 -11
  528. package/templates/next/.claude/skills/vercel-composition-patterns/rules/_sections.md +0 -29
  529. package/templates/next/.claude/skills/vercel-composition-patterns/rules/_template.md +0 -24
  530. package/templates/next/.claude/skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +0 -100
  531. package/templates/next/.claude/skills/vercel-composition-patterns/rules/architecture-compound-components.md +0 -112
  532. package/templates/next/.claude/skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +0 -87
  533. package/templates/next/.claude/skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +0 -100
  534. package/templates/next/.claude/skills/vercel-composition-patterns/rules/react19-no-forwardref.md +0 -42
  535. package/templates/next/.claude/skills/vercel-composition-patterns/rules/state-context-interface.md +0 -191
  536. package/templates/next/.claude/skills/vercel-composition-patterns/rules/state-decouple-implementation.md +0 -113
  537. package/templates/next/.claude/skills/vercel-composition-patterns/rules/state-lift-state.md +0 -125
  538. package/templates/next/.claude/skills/vercel-react-best-practices/AGENTS.md +0 -3810
  539. package/templates/next/.claude/skills/vercel-react-best-practices/README.md +0 -123
  540. package/templates/next/.claude/skills/vercel-react-best-practices/SKILL.md +0 -149
  541. package/templates/next/.claude/skills/vercel-react-best-practices/metadata.json +0 -15
  542. package/templates/next/.claude/skills/vercel-react-best-practices/rules/_sections.md +0 -46
  543. package/templates/next/.claude/skills/vercel-react-best-practices/rules/_template.md +0 -28
  544. package/templates/next/.claude/skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +0 -56
  545. package/templates/next/.claude/skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +0 -55
  546. package/templates/next/.claude/skills/vercel-react-best-practices/rules/advanced-init-once.md +0 -42
  547. package/templates/next/.claude/skills/vercel-react-best-practices/rules/advanced-use-latest.md +0 -39
  548. package/templates/next/.claude/skills/vercel-react-best-practices/rules/async-api-routes.md +0 -38
  549. package/templates/next/.claude/skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +0 -37
  550. package/templates/next/.claude/skills/vercel-react-best-practices/rules/async-defer-await.md +0 -82
  551. package/templates/next/.claude/skills/vercel-react-best-practices/rules/async-dependencies.md +0 -51
  552. package/templates/next/.claude/skills/vercel-react-best-practices/rules/async-parallel.md +0 -28
  553. package/templates/next/.claude/skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +0 -99
  554. package/templates/next/.claude/skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +0 -63
  555. package/templates/next/.claude/skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +0 -60
  556. package/templates/next/.claude/skills/vercel-react-best-practices/rules/bundle-conditional.md +0 -31
  557. package/templates/next/.claude/skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +0 -49
  558. package/templates/next/.claude/skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +0 -35
  559. package/templates/next/.claude/skills/vercel-react-best-practices/rules/bundle-preload.md +0 -50
  560. package/templates/next/.claude/skills/vercel-react-best-practices/rules/client-event-listeners.md +0 -74
  561. package/templates/next/.claude/skills/vercel-react-best-practices/rules/client-localstorage-schema.md +0 -71
  562. package/templates/next/.claude/skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +0 -48
  563. package/templates/next/.claude/skills/vercel-react-best-practices/rules/client-swr-dedup.md +0 -56
  564. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-batch-dom-css.md +0 -107
  565. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-cache-function-results.md +0 -80
  566. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-cache-property-access.md +0 -28
  567. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-cache-storage.md +0 -70
  568. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-combine-iterations.md +0 -32
  569. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-early-exit.md +0 -50
  570. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-flatmap-filter.md +0 -60
  571. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-hoist-regexp.md +0 -45
  572. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-index-maps.md +0 -37
  573. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-length-check-first.md +0 -49
  574. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-min-max-loop.md +0 -82
  575. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-request-idle-callback.md +0 -105
  576. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-set-map-lookups.md +0 -24
  577. package/templates/next/.claude/skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +0 -57
  578. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-activity.md +0 -26
  579. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
  580. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-conditional-render.md +0 -40
  581. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-content-visibility.md +0 -38
  582. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +0 -46
  583. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
  584. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +0 -30
  585. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-resource-hints.md +0 -85
  586. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +0 -68
  587. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-svg-precision.md +0 -28
  588. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +0 -75
  589. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-defer-reads.md +0 -39
  590. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-dependencies.md +0 -45
  591. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +0 -40
  592. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-derived-state.md +0 -29
  593. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +0 -74
  594. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +0 -58
  595. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +0 -38
  596. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-memo.md +0 -44
  597. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +0 -45
  598. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +0 -82
  599. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +0 -35
  600. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +0 -64
  601. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-transitions.md +0 -40
  602. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +0 -59
  603. package/templates/next/.claude/skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +0 -73
  604. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-after-nonblocking.md +0 -73
  605. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-auth-actions.md +0 -96
  606. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-cache-lru.md +0 -41
  607. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-cache-react.md +0 -76
  608. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-dedup-props.md +0 -65
  609. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-hoist-static-io.md +0 -149
  610. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +0 -50
  611. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-parallel-fetching.md +0 -83
  612. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +0 -34
  613. package/templates/next/.claude/skills/vercel-react-best-practices/rules/server-serialization.md +0 -38
  614. package/templates/next/.claude/skills/web-design-guidelines/SKILL.md +0 -39
  615. package/templates/next/CLAUDE.md +0 -42
  616. package/templates/next/README.md +0 -30
  617. package/templates/next/_gitignore +0 -4
  618. package/templates/next/app/layout.tsx +0 -44
  619. package/templates/next/globals.d.ts +0 -8
  620. package/templates/next/next.config.mjs +0 -6
  621. package/templates/next/package.json +0 -38
  622. package/templates/next/postcss.config.mjs +0 -5
  623. package/templates/next/skills-lock.json +0 -47
  624. package/templates/next/tsconfig.json +0 -36
  625. package/templates/shopify-theme/.claude/skills/gc-shopify-block/SKILL.md +0 -44
  626. package/templates/shopify-theme/.claude/skills/shopify-dev/SKILL.md +0 -51
  627. package/templates/shopify-theme/.claude/skills/shopify-dev/scripts/log_skill_use.mjs +0 -205
  628. package/templates/shopify-theme/.claude/skills/shopify-dev/scripts/search_docs.mjs +0 -272
  629. package/templates/shopify-theme/.claude/skills/shopify-dev/scripts/track-telemetry.ps1 +0 -361
  630. package/templates/shopify-theme/.claude/skills/shopify-dev/scripts/track-telemetry.sh +0 -527
  631. package/templates/shopify-theme/.claude/skills/shopify-liquid/SKILL.md +0 -343
  632. package/templates/shopify-theme/.claude/skills/shopify-liquid/blocks/hero-slide.liquid +0 -342
  633. package/templates/shopify-theme/.claude/skills/shopify-liquid/config/settings_schema.json +0 -1
  634. package/templates/shopify-theme/.claude/skills/shopify-liquid/featured-collection.liquid +0 -457
  635. package/templates/shopify-theme/.claude/skills/shopify-liquid/locales/en.default.json +0 -10
  636. package/templates/shopify-theme/.claude/skills/shopify-liquid/locales/en.default.schema.json +0 -103
  637. package/templates/shopify-theme/.claude/skills/shopify-liquid/package.json +0 -10
  638. package/templates/shopify-theme/.claude/skills/shopify-liquid/scripts/search_docs.mjs +0 -759
  639. package/templates/shopify-theme/.claude/skills/shopify-liquid/scripts/track-telemetry.ps1 +0 -361
  640. package/templates/shopify-theme/.claude/skills/shopify-liquid/scripts/track-telemetry.sh +0 -527
  641. package/templates/shopify-theme/.claude/skills/shopify-liquid/scripts/validate.mjs +0 -654
  642. package/templates/shopify-theme/.claude/skills/shopify-liquid/sections/hero-banner.liquid +0 -329
  643. package/templates/shopify-theme/.claude/skills/shopify-use-shopify-cli/SKILL.md +0 -165
  644. package/templates/shopify-theme/.claude/skills/shopify-use-shopify-cli/scripts/log_skill_use.mjs +0 -205
  645. package/templates/shopify-theme/.claude/skills/shopify-use-shopify-cli/scripts/track-telemetry.ps1 +0 -361
  646. package/templates/shopify-theme/.claude/skills/shopify-use-shopify-cli/scripts/track-telemetry.sh +0 -527
  647. package/templates/shopify-theme/.shopifyignore +0 -9
  648. package/templates/shopify-theme/CLAUDE.md +0 -51
  649. package/templates/shopify-theme/README.md +0 -92
  650. package/templates/shopify-theme/assets/baseline.css +0 -8390
  651. package/templates/shopify-theme/assets/swiper-element-bundle.min.js +0 -14
  652. package/templates/shopify-theme/blocks/_accordion.liquid +0 -59
  653. package/templates/shopify-theme/blocks/_carousel-slide.liquid +0 -24
  654. package/templates/shopify-theme/blocks/_modal-body.liquid +0 -18
  655. package/templates/shopify-theme/blocks/_modal-footer.liquid +0 -36
  656. package/templates/shopify-theme/blocks/_modal-header.liquid +0 -19
  657. package/templates/shopify-theme/blocks/_modal-media.liquid +0 -37
  658. package/templates/shopify-theme/blocks/accordion-group.liquid +0 -53
  659. package/templates/shopify-theme/blocks/alert.liquid +0 -92
  660. package/templates/shopify-theme/blocks/avatar-group.liquid +0 -51
  661. package/templates/shopify-theme/blocks/avatar.liquid +0 -56
  662. package/templates/shopify-theme/blocks/badge.liquid +0 -33
  663. package/templates/shopify-theme/blocks/breadcrumb.liquid +0 -45
  664. package/templates/shopify-theme/blocks/button.liquid +0 -51
  665. package/templates/shopify-theme/blocks/buttons.liquid +0 -41
  666. package/templates/shopify-theme/blocks/card.liquid +0 -67
  667. package/templates/shopify-theme/blocks/carousel.liquid +0 -55
  668. package/templates/shopify-theme/blocks/column.liquid +0 -33
  669. package/templates/shopify-theme/blocks/image.liquid +0 -37
  670. package/templates/shopify-theme/blocks/modal.liquid +0 -52
  671. package/templates/shopify-theme/blocks/popover.liquid +0 -24
  672. package/templates/shopify-theme/blocks/skeleton.liquid +0 -22
  673. package/templates/shopify-theme/blocks/spinner.liquid +0 -22
  674. package/templates/shopify-theme/blocks/split.liquid +0 -39
  675. package/templates/shopify-theme/blocks/tab.liquid +0 -19
  676. package/templates/shopify-theme/blocks/tabs.liquid +0 -78
  677. package/templates/shopify-theme/blocks/tags.liquid +0 -55
  678. package/templates/shopify-theme/blocks/text.liquid +0 -55
  679. package/templates/shopify-theme/blocks/tooltip.liquid +0 -50
  680. package/templates/shopify-theme/blocks/typography.liquid +0 -90
  681. package/templates/shopify-theme/config/settings_data.json +0 -4
  682. package/templates/shopify-theme/config/settings_schema.json +0 -10
  683. package/templates/shopify-theme/layout/theme.liquid +0 -21
  684. package/templates/shopify-theme/locales/en.default.json +0 -5
  685. package/templates/shopify-theme/locales/en.default.schema.json +0 -131
  686. package/templates/shopify-theme/package.json +0 -21
  687. package/templates/shopify-theme/scripts/sync-tokens.mjs +0 -32
  688. package/templates/shopify-theme/sections/baseline-components.liquid +0 -81
  689. package/templates/shopify-theme/skills-lock.json +0 -23
  690. package/templates/shopify-theme/snippets/lucide.liquid +0 -34
  691. package/templates/shopify-theme/snippets/pagination.liquid +0 -44
  692. package/templates/shopify-theme/templates/collection.json +0 -13
  693. package/templates/shopify-theme/templates/gift_card.liquid +0 -5
  694. package/templates/shopify-theme/templates/index.json +0 -135
  695. package/templates/shopify-theme/templates/list-collections.json +0 -13
  696. package/templates/shopify-theme/templates/product.json +0 -13
  697. package/templates/wordpress/.claude/CLAUDE.md +0 -37
  698. package/templates/wordpress/.claude/skills/wp-block-development/SKILL.md +0 -174
  699. package/templates/wordpress/.claude/skills/wp-block-development/references/attributes-and-serialization.md +0 -22
  700. package/templates/wordpress/.claude/skills/wp-block-development/references/block-json.md +0 -49
  701. package/templates/wordpress/.claude/skills/wp-block-development/references/creating-new-blocks.md +0 -46
  702. package/templates/wordpress/.claude/skills/wp-block-development/references/debugging.md +0 -36
  703. package/templates/wordpress/.claude/skills/wp-block-development/references/deprecations.md +0 -24
  704. package/templates/wordpress/.claude/skills/wp-block-development/references/dynamic-rendering.md +0 -23
  705. package/templates/wordpress/.claude/skills/wp-block-development/references/inner-blocks.md +0 -25
  706. package/templates/wordpress/.claude/skills/wp-block-development/references/registration.md +0 -30
  707. package/templates/wordpress/.claude/skills/wp-block-development/references/supports-and-wrappers.md +0 -18
  708. package/templates/wordpress/.claude/skills/wp-block-development/references/tooling-and-testing.md +0 -21
  709. package/templates/wordpress/.claude/skills/wp-block-development/scripts/list_blocks.mjs +0 -121
  710. package/templates/wordpress/.claude/skills/wp-block-themes/SKILL.md +0 -116
  711. package/templates/wordpress/.claude/skills/wp-block-themes/references/creating-new-block-theme.md +0 -37
  712. package/templates/wordpress/.claude/skills/wp-block-themes/references/debugging.md +0 -24
  713. package/templates/wordpress/.claude/skills/wp-block-themes/references/patterns.md +0 -18
  714. package/templates/wordpress/.claude/skills/wp-block-themes/references/style-variations.md +0 -14
  715. package/templates/wordpress/.claude/skills/wp-block-themes/references/templates-and-parts.md +0 -16
  716. package/templates/wordpress/.claude/skills/wp-block-themes/references/theme-json.md +0 -59
  717. package/templates/wordpress/.claude/skills/wp-block-themes/scripts/detect_block_themes.mjs +0 -117
  718. package/templates/wordpress/.claude/skills/wp-performance/SKILL.md +0 -146
  719. package/templates/wordpress/.claude/skills/wp-performance/references/autoload-options.md +0 -24
  720. package/templates/wordpress/.claude/skills/wp-performance/references/cron.md +0 -20
  721. package/templates/wordpress/.claude/skills/wp-performance/references/database.md +0 -20
  722. package/templates/wordpress/.claude/skills/wp-performance/references/http-api.md +0 -15
  723. package/templates/wordpress/.claude/skills/wp-performance/references/measurement.md +0 -21
  724. package/templates/wordpress/.claude/skills/wp-performance/references/object-cache.md +0 -24
  725. package/templates/wordpress/.claude/skills/wp-performance/references/query-monitor-headless.md +0 -38
  726. package/templates/wordpress/.claude/skills/wp-performance/references/server-timing.md +0 -22
  727. package/templates/wordpress/.claude/skills/wp-performance/references/wp-cli-doctor.md +0 -24
  728. package/templates/wordpress/.claude/skills/wp-performance/references/wp-cli-profile.md +0 -32
  729. package/templates/wordpress/.claude/skills/wp-performance/scripts/perf_inspect.mjs +0 -128
  730. package/templates/wordpress/.claude/skills/wp-plugin-development/SKILL.md +0 -112
  731. package/templates/wordpress/.claude/skills/wp-plugin-development/references/data-and-cron.md +0 -19
  732. package/templates/wordpress/.claude/skills/wp-plugin-development/references/debugging.md +0 -19
  733. package/templates/wordpress/.claude/skills/wp-plugin-development/references/lifecycle.md +0 -33
  734. package/templates/wordpress/.claude/skills/wp-plugin-development/references/security.md +0 -29
  735. package/templates/wordpress/.claude/skills/wp-plugin-development/references/settings-api.md +0 -22
  736. package/templates/wordpress/.claude/skills/wp-plugin-development/references/structure.md +0 -16
  737. package/templates/wordpress/.claude/skills/wp-plugin-development/scripts/detect_plugins.mjs +0 -122
  738. package/templates/wordpress/.claude/skills/wp-rest-api/SKILL.md +0 -114
  739. package/templates/wordpress/.claude/skills/wp-rest-api/references/authentication.md +0 -18
  740. package/templates/wordpress/.claude/skills/wp-rest-api/references/custom-content-types.md +0 -20
  741. package/templates/wordpress/.claude/skills/wp-rest-api/references/discovery-and-params.md +0 -20
  742. package/templates/wordpress/.claude/skills/wp-rest-api/references/responses-and-fields.md +0 -30
  743. package/templates/wordpress/.claude/skills/wp-rest-api/references/routes-and-endpoints.md +0 -36
  744. package/templates/wordpress/.claude/skills/wp-rest-api/references/schema.md +0 -22
  745. package/templates/wordpress/.ddev/docker-compose.packages.yaml +0 -14
  746. package/templates/wordpress/.ddev/docker-compose.redis.yaml +0 -11
  747. package/templates/wordpress/.env.example +0 -33
  748. package/templates/wordpress/CLAUDE.md +0 -34
  749. package/templates/wordpress/_gitignore +0 -33
  750. package/templates/wordpress/composer.lock +0 -1594
  751. package/templates/wordpress/package.json +0 -13
  752. package/templates/wordpress/scripts/seed.sh +0 -64
  753. package/templates/wordpress/skills-lock.json +0 -35
  754. package/templates/wordpress/wp-config.php +0 -89
  755. package/templates/wordpress/wp-content/index.php +0 -2
  756. package/templates/wordpress/wp-content/mu-plugins/baseline-bootstrap.php +0 -26
@@ -0,0 +1,88 @@
1
+ <?php
2
+ /**
3
+ * Baseline Sheet for template code and the acf/sheet block (spec: components/sheet/spec.md). Dialog's machinery drawn as
4
+ * an edge panel: a native <dialog closedby="any"> opened by a Button with command="show-modal" commandfor (no JavaScript).
5
+ * Same markup and classes as the React Sheet (registry/src/ui/sheet/sheet.tsx):
6
+ *
7
+ * echo baseline_sheet(['id' => 'menu', 'trigger' => 'Menu', 'side' => 'left', 'title' => 'Menu', 'body' => $nav]);
8
+ *
9
+ * Class strings are static maps (ADR-0008), kept identical to React's.
10
+ */
11
+
12
+ declare(strict_types=1);
13
+
14
+ const BASELINE_SHEET_CONTENT = 'group/sheet-content fixed m-0 max-h-none max-w-none p-0 hidden open:flex flex-col gap-(--bl-sheet-gap) border-0 border-border bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg outline-none opacity-0 open:opacity-100 open:translate-x-0 open:translate-y-0 starting:open:opacity-0 transition-[opacity,translate,display,overlay] transition-discrete duration-200 ease-in-out motion-reduce:transition-none backdrop:bg-(--overlay) supports-backdrop-filter:backdrop:backdrop-blur-xs backdrop:opacity-0 open:backdrop:opacity-100 starting:open:backdrop:opacity-0 backdrop:transition-[opacity,display,overlay] backdrop:transition-discrete backdrop:duration-150 motion-reduce:backdrop:transition-none';
15
+
16
+ const BASELINE_SHEET_SIDES = [
17
+ 'right' => 'inset-y-0 right-0 left-auto h-full w-3/4 sm:max-w-(--bl-sheet-max-width) border-l-(length:--bl-sheet-border-width) translate-x-10 starting:open:translate-x-10',
18
+ 'left' => 'inset-y-0 left-0 right-auto h-full w-3/4 sm:max-w-(--bl-sheet-max-width) border-r-(length:--bl-sheet-border-width) -translate-x-10 starting:open:-translate-x-10',
19
+ 'top' => 'inset-x-0 top-0 bottom-auto h-auto w-full border-b-(length:--bl-sheet-border-width) -translate-y-10 starting:open:-translate-y-10',
20
+ 'bottom' => 'inset-x-0 bottom-0 top-auto h-auto w-full border-t-(length:--bl-sheet-border-width) translate-y-10 starting:open:translate-y-10',
21
+ ];
22
+
23
+ // The block editor shows the panel in place (a closed <dialog> would hide the blocks editors need to reach).
24
+ const BASELINE_SHEET_PREVIEW = 'relative flex w-full max-w-(--bl-sheet-max-width) flex-col gap-(--bl-sheet-gap) border-(length:--bl-sheet-border-width) border-border bg-popover text-sm text-popover-foreground shadow-lg';
25
+
26
+ const BASELINE_SHEET_HEADER = 'flex flex-col gap-(--bl-sheet-header-gap) p-(--bl-sheet-padding)';
27
+ const BASELINE_SHEET_TITLE = 'm-0 font-heading text-(length:--bl-sheet-title-font-size) leading-(--bl-sheet-title-line-height) font-(--bl-sheet-title-font-weight) text-foreground';
28
+ const BASELINE_SHEET_DESCRIPTION = 'm-0 text-(length:--bl-sheet-description-font-size) leading-(--bl-sheet-description-line-height) text-muted-foreground';
29
+ const BASELINE_SHEET_FOOTER = 'mt-auto flex flex-col gap-(--bl-sheet-footer-gap) p-(--bl-sheet-padding)';
30
+ const BASELINE_SHEET_CLOSE = 'absolute top-(--bl-sheet-close-inset) right-(--bl-sheet-close-inset)';
31
+
32
+ /** The footer: pushed to the bottom, buttons stacked. `$close_label` adds an outline button that closes the sheet. */
33
+ function baseline_sheet_footer(string $actions, string $close_label = '', string $root_attrs = ''): string
34
+ {
35
+ $close = $close_label === '' ? '' : '<form method="dialog" class="contents">'
36
+ . baseline_button(['label' => $close_label, 'variant' => 'outline', 'type' => 'submit']) . '</form>';
37
+ $root = $root_attrs !== '' ? $root_attrs : 'class="' . esc_attr(BASELINE_SHEET_FOOTER) . '"';
38
+ return '<div data-slot="sheet-footer" ' . $root . '>' . $actions . $close . '</div>';
39
+ }
40
+
41
+ /**
42
+ * @param array{
43
+ * id?: string, trigger?: string|false, trigger_variant?: string, trigger_size?: string, side?: string, title?: string,
44
+ * description?: string, body?: string, footer?: string, show_close?: bool, preview?: bool
45
+ * } $args `body` and `footer` are ready markup; `trigger` false leaves the trigger out; `preview` renders the panel in place
46
+ */
47
+ function baseline_sheet(array $args): string
48
+ {
49
+ $id = sanitize_html_class((string) ($args['id'] ?? '')) ?: wp_unique_id('sheet-');
50
+ $side = (string) ($args['side'] ?? 'right');
51
+ $side = isset(BASELINE_SHEET_SIDES[$side]) ? $side : 'right';
52
+ $title = (string) ($args['title'] ?? '');
53
+ $desc = (string) ($args['description'] ?? '');
54
+ $preview = !empty($args['preview']);
55
+
56
+ $header = '';
57
+ if ($title !== '' || $desc !== '') {
58
+ $header = '<div data-slot="sheet-header" class="' . BASELINE_SHEET_HEADER . '">'
59
+ . ($title !== '' ? '<h2 id="' . esc_attr($id . '-title') . '" data-slot="sheet-title" class="' . BASELINE_SHEET_TITLE . '">' . esc_html($title) . '</h2>' : '')
60
+ . ($desc !== '' ? '<p id="' . esc_attr($id . '-description') . '" data-slot="sheet-description" class="' . BASELINE_SHEET_DESCRIPTION . '">' . esc_html($desc) . '</p>' : '')
61
+ . '</div>';
62
+ }
63
+ $close = '';
64
+ if ($args['show_close'] ?? true) {
65
+ $close = baseline_button([
66
+ 'variant' => 'ghost',
67
+ 'size' => 'sm',
68
+ 'class' => 'is-icon-only has-icon ' . BASELINE_SHEET_CLOSE,
69
+ 'children' => baseline_icon('close') . '<span class="sr-only">' . esc_html__('Close', 'baseline') . '</span>',
70
+ 'attrs' => ['command' => 'close', 'commandfor' => $id, 'data-slot' => 'sheet-close'],
71
+ ]);
72
+ }
73
+ $inner = $header . (string) ($args['body'] ?? '') . (string) ($args['footer'] ?? '') . $close;
74
+ $trigger = ($args['trigger'] ?? null) === false ? '' : baseline_button([
75
+ 'label' => (string) ($args['trigger'] ?? __('Open', 'baseline')),
76
+ 'variant' => (string) ($args['trigger_variant'] ?? 'outline'),
77
+ 'size' => (string) ($args['trigger_size'] ?? 'md'),
78
+ 'attrs' => ['command' => 'show-modal', 'commandfor' => $id, 'data-slot' => 'sheet-trigger'],
79
+ ]);
80
+
81
+ if ($preview) {
82
+ return $trigger . '<div data-slot="sheet-content" data-side="' . esc_attr($side) . '" class="' . BASELINE_SHEET_PREVIEW . '">' . $inner . '</div>';
83
+ }
84
+ $labelled = $title !== '' ? ' aria-labelledby="' . esc_attr($id . '-title') . '"' : '';
85
+ $described = $desc !== '' ? ' aria-describedby="' . esc_attr($id . '-description') . '"' : '';
86
+ return $trigger . '<dialog id="' . esc_attr($id) . '" data-slot="sheet-content" data-side="' . esc_attr($side) . '" closedby="any"'
87
+ . $labelled . $described . ' class="' . BASELINE_SHEET_CONTENT . ' ' . BASELINE_SHEET_SIDES[$side] . '">' . $inner . '</dialog>';
88
+ }
@@ -0,0 +1,127 @@
1
+ <?php
2
+ /**
3
+ * Baseline Toggle and Toggle Group for template code (specs: components/toggle/spec.md, components/toggle-group/spec.md).
4
+ * Emits the same markup and classes as the React components (registry/src/ui/toggle, toggle-group): a <label> drawn as
5
+ * a button around a visually hidden <input type="checkbox"> (a toggle), or radios sharing a name (a single-choice
6
+ * group) / checkboxes (multiple). Native (ADR-0030, user 2026-10-06): no JavaScript, and the choice submits with a form.
7
+ *
8
+ * echo baseline_toggle(['label' => 'Bold', 'name' => 'bold', 'pressed' => true]);
9
+ * echo baseline_toggle_group([
10
+ * 'name' => 'weight', 'variant' => 'outline', 'spacing' => 0, 'value' => ['normal'],
11
+ * 'items' => [['value' => 'light', 'label' => 'Light'], ['value' => 'normal', 'label' => 'Normal']],
12
+ * ]);
13
+ *
14
+ * Class strings are static (ADR-0008) and React's, except that icons are always baseline_icon()'s unsized svg, so
15
+ * they are sized with a plain [&_svg] (an escaped quote in a PHP string would not match the class Tailwind compiles).
16
+ * The input is .sr-only, which checkbox.css and radio.css exclude, so the element styling never draws it.
17
+ * Single choice keeps one selected once chosen (radio behaviour, accepted 2026-10-06). The joined group's corners and borders are src/toggle-group.css.
18
+ */
19
+
20
+ declare(strict_types=1);
21
+
22
+ const BASELINE_TOGGLE_BASE = 'group/toggle relative inline-flex shrink-0 cursor-pointer items-center justify-center whitespace-nowrap select-none font-(--bl-toggle-font-weight) transition-all outline-none hover:bg-muted hover:text-foreground has-checked:bg-muted has-focus-visible:z-10 has-focus-visible:border-ring has-focus-visible:ring-(length:--bl-control-ring-width) has-focus-visible:ring-ring has-disabled:pointer-events-none has-disabled:opacity-50 has-[[aria-invalid=true]]:border-destructive has-[[aria-invalid=true]]:ring-(length:--bl-control-ring-width) has-[[aria-invalid=true]]:ring-destructive/20 [&_svg]:pointer-events-none [&_svg]:shrink-0';
23
+
24
+ const BASELINE_TOGGLE_VARIANTS = [
25
+ 'default' => 'bg-transparent',
26
+ 'outline' => 'border-(length:--bl-toggle-border-width) border-input bg-transparent hover:bg-muted',
27
+ ];
28
+
29
+ const BASELINE_TOGGLE_SIZES = [
30
+ 'sm' => 'h-(--bl-toggle-sm-height) min-w-(--bl-toggle-sm-height) gap-(--bl-toggle-sm-gap) px-(--bl-toggle-sm-padding-x) [--toggle-radius:var(--bl-toggle-sm-radius)] rounded-(--toggle-radius) text-(length:--bl-toggle-sm-font-size) leading-(--bl-toggle-sm-line-height) has-data-[icon=inline-start]:ps-(--bl-toggle-sm-padding-x-icon) has-data-[icon=inline-end]:pe-(--bl-toggle-sm-padding-x-icon) [&_svg]:size-(--bl-toggle-sm-icon-size)',
31
+ 'md' => 'h-(--bl-toggle-md-height) min-w-(--bl-toggle-md-height) gap-(--bl-toggle-md-gap) px-(--bl-toggle-md-padding-x) [--toggle-radius:var(--bl-toggle-md-radius)] rounded-(--toggle-radius) text-(length:--bl-toggle-md-font-size) leading-(--bl-toggle-md-line-height) has-data-[icon=inline-start]:ps-(--bl-toggle-md-padding-x-icon) has-data-[icon=inline-end]:pe-(--bl-toggle-md-padding-x-icon) [&_svg]:size-(--bl-toggle-md-icon-size)',
32
+ 'lg' => 'h-(--bl-toggle-lg-height) min-w-(--bl-toggle-lg-height) gap-(--bl-toggle-lg-gap) px-(--bl-toggle-lg-padding-x) [--toggle-radius:var(--bl-toggle-lg-radius)] rounded-(--toggle-radius) text-(length:--bl-toggle-lg-font-size) leading-(--bl-toggle-lg-line-height) has-data-[icon=inline-start]:ps-(--bl-toggle-lg-padding-x-icon) has-data-[icon=inline-end]:pe-(--bl-toggle-lg-padding-x-icon) [&_svg]:size-(--bl-toggle-lg-icon-size)',
33
+ ];
34
+
35
+ const BASELINE_TOGGLE_GROUP = 'group/toggle-group not-typeset flex w-fit flex-row items-center gap-(--bl-toggle-group-gap) data-[spacing=0]:gap-0 data-[orientation=vertical]:flex-col data-[orientation=vertical]:items-stretch';
36
+
37
+ /**
38
+ * @param array{
39
+ * label?: string, children?: string, icon?: string, icon_position?: string, variant?: string, size?: string,
40
+ * pressed?: bool, disabled?: bool, name?: string, value?: string, type?: string, aria_label?: string, id?: string,
41
+ * class?: string, slot?: string
42
+ * } $args `children` is ready markup (it replaces label and icon); `icon` a Baseline system icon name; `type` "radio"
43
+ * for a single-choice group's item; `aria_label` names an icon-only toggle (it goes on the input).
44
+ */
45
+ function baseline_toggle(array $args): string
46
+ {
47
+ $variant = array_key_exists((string) ($args['variant'] ?? ''), BASELINE_TOGGLE_VARIANTS) ? (string) $args['variant'] : 'default';
48
+ $size = array_key_exists((string) ($args['size'] ?? ''), BASELINE_TOGGLE_SIZES) ? (string) $args['size'] : 'md';
49
+ $type = ($args['type'] ?? 'checkbox') === 'radio' ? 'radio' : 'checkbox';
50
+ $label = (string) ($args['label'] ?? '');
51
+
52
+ $inner = (string) ($args['children'] ?? '');
53
+ if ($inner === '') {
54
+ $icon = '';
55
+ if (!empty($args['icon'])) {
56
+ $at = ($args['icon_position'] ?? 'start') === 'end' ? 'inline-end' : 'inline-start';
57
+ // no size-* class: the toggle's size sets the icon size (toggle/<size>/icon-size); data-icon tightens its side
58
+ $icon = baseline_icon((string) $args['icon'], 'shrink-0');
59
+ if ($label !== '') {
60
+ $icon = preg_replace('/^<svg\b/', '<svg data-icon="' . $at . '"', $icon, 1) ?? $icon;
61
+ }
62
+ }
63
+ $text = $label !== '' ? esc_html($label) : '';
64
+ $inner = ($args['icon_position'] ?? 'start') === 'end' ? $text . $icon : $icon . $text;
65
+ }
66
+
67
+ $input = '<input' . baseline_attrs([
68
+ 'type' => $type,
69
+ 'class' => 'sr-only',
70
+ 'name' => $args['name'] ?? null,
71
+ 'value' => $args['value'] ?? null,
72
+ 'id' => $args['id'] ?? null,
73
+ 'checked' => !empty($args['pressed']),
74
+ 'disabled' => !empty($args['disabled']),
75
+ 'aria-label' => $args['aria_label'] ?? null,
76
+ ]) . '>';
77
+
78
+ $classes = trim(BASELINE_TOGGLE_BASE . ' not-typeset ' . BASELINE_TOGGLE_VARIANTS[$variant] . ' ' . BASELINE_TOGGLE_SIZES[$size] . ' ' . (string) ($args['class'] ?? ''));
79
+ return '<label data-slot="' . esc_attr((string) ($args['slot'] ?? 'toggle')) . '" data-variant="' . esc_attr($variant) . '" data-size="' . esc_attr($size) . '" class="' . esc_attr($classes) . '">' . $input . $inner . '</label>';
80
+ }
81
+
82
+ /**
83
+ * @param array{
84
+ * items: array<int, array{value: string, label?: string, icon?: string, aria_label?: string, disabled?: bool, children?: string}>,
85
+ * name?: string, multiple?: bool, value?: string[], variant?: string, size?: string, spacing?: int,
86
+ * orientation?: string, disabled?: bool, aria_label?: string, class?: string
87
+ * } $args `value` lists the items on at first; single choice (the default) is radios sharing `name`.
88
+ */
89
+ function baseline_toggle_group(array $args): string
90
+ {
91
+ $name = sanitize_html_class((string) ($args['name'] ?? '')) ?: wp_unique_id('toggle-group-');
92
+ $multiple = !empty($args['multiple']);
93
+ $value = array_map('strval', (array) ($args['value'] ?? []));
94
+ $spacing = (int) ($args['spacing'] ?? 2);
95
+ $orientation = ($args['orientation'] ?? 'horizontal') === 'vertical' ? 'vertical' : 'horizontal';
96
+ $variant = (string) ($args['variant'] ?? 'default');
97
+ $size = (string) ($args['size'] ?? 'md');
98
+
99
+ $items = '';
100
+ foreach ((array) ($args['items'] ?? []) as $item) {
101
+ $v = (string) ($item['value'] ?? '');
102
+ $items .= baseline_toggle([
103
+ 'slot' => 'toggle-group-item',
104
+ 'type' => $multiple ? 'checkbox' : 'radio',
105
+ 'name' => $name,
106
+ 'value' => $v,
107
+ 'pressed' => in_array($v, $value, true),
108
+ 'variant' => $variant,
109
+ 'size' => $size,
110
+ 'label' => $item['label'] ?? '',
111
+ 'icon' => $item['icon'] ?? '',
112
+ 'children' => $item['children'] ?? '',
113
+ 'aria_label' => $item['aria_label'] ?? null,
114
+ 'disabled' => !empty($item['disabled']) || !empty($args['disabled']),
115
+ 'class' => 'shrink-0',
116
+ ]);
117
+ }
118
+ return '<div role="group"' . baseline_attrs([
119
+ 'data-slot' => 'toggle-group',
120
+ 'data-variant' => $variant,
121
+ 'data-size' => $size,
122
+ 'data-spacing' => (string) $spacing,
123
+ 'data-orientation' => $orientation,
124
+ 'aria-label' => $args['aria_label'] ?? null,
125
+ 'class' => trim(BASELINE_TOGGLE_GROUP . ' ' . (string) ($args['class'] ?? '')),
126
+ ]) . '>' . $items . '</div>';
127
+ }
@@ -0,0 +1,96 @@
1
+ <?php
2
+ /**
3
+ * core/button IS the Baseline button on WordPress (ADR-0018, supersedes ADR-0016; icons: ADR-0020).
4
+ *
5
+ * - Variants are block styles. Core's own `fill` and `outline` ARE the Baseline `default` and `outline` variants;
6
+ * `secondary`, `ghost`, `link` and `destructive` are registered here (PHP, no JavaScript).
7
+ * - Size and icon are server-registered attributes (`baselineSize`, `baselineIcon`, `baselineIconPosition`,
8
+ * `baselineIconOnly`). WordPress lets the server definition win for core blocks, so the client needs no attribute
9
+ * declaration; the inspector controls live in assets/js/core-button-editor.js. Everything is applied at RENDER
10
+ * time (classes on the wrapper, the registered icon's SVG inside the link), so saved markup never changes and
11
+ * existing content keeps validating.
12
+ * - Base look: theme.json `styles.elements.button`; token-controlled panels are switched off in theme.json
13
+ * `settings.blocks`; the rest is src/core-button.css. Both read the button/* component tokens (ADR-0017).
14
+ */
15
+
16
+ declare(strict_types=1);
17
+
18
+ const BASELINE_BUTTON_SIZES = ['xs', 'sm', 'md', 'lg'];
19
+ /** Baseline variant => core/button block style name. */
20
+ const BASELINE_BUTTON_STYLES = [
21
+ 'default' => 'fill',
22
+ 'secondary' => 'secondary',
23
+ 'outline' => 'outline',
24
+ 'ghost' => 'ghost',
25
+ 'link' => 'link',
26
+ 'destructive' => 'destructive',
27
+ ];
28
+
29
+ add_filter('register_block_type_args', static function (array $args, string $name): array {
30
+ if ($name === 'core/button') {
31
+ $args['attributes']['baselineSize'] = ['type' => 'string', 'enum' => BASELINE_BUTTON_SIZES, 'default' => 'md'];
32
+ $args['attributes']['baselineIcon'] = ['type' => 'string', 'default' => '']; // registered handle, e.g. baseline/chevron-down
33
+ $args['attributes']['baselineIconPosition'] = ['type' => 'string', 'enum' => ['start', 'end'], 'default' => 'start'];
34
+ $args['attributes']['baselineIconOnly'] = ['type' => 'boolean', 'default' => false];
35
+ }
36
+ return $args;
37
+ }, 10, 2);
38
+
39
+ /** The four variants core does not ship; `fill` and `outline` already exist and are restyled by src/core-button.css. */
40
+ add_action('init', static function (): void {
41
+ foreach (['secondary' => 'Secondary', 'ghost' => 'Ghost', 'link' => 'Link', 'destructive' => 'Destructive'] as $name => $label) {
42
+ register_block_style('core/button', ['name' => $name, 'label' => __($label, 'baseline')]);
43
+ }
44
+ });
45
+
46
+ /**
47
+ * Render-time axes: size class on the wrapper; icon SVG (from the registry) inside the link, before or after the
48
+ * text; icon-only keeps the text as the accessible name (visually hidden).
49
+ */
50
+ add_filter('render_block_core/button', static function (string $content, array $block): string {
51
+ $attrs = $block['attrs'] ?? [];
52
+ $size = $attrs['baselineSize'] ?? 'md';
53
+ if (!in_array($size, BASELINE_BUTTON_SIZES, true)) {
54
+ $size = 'md';
55
+ }
56
+ // not-typeset: a button inside flowing content must not take typeset's link styling (ADR-0028)
57
+ $classes = ['is-size-' . $size, 'not-typeset'];
58
+
59
+ $icon = (string) ($attrs['baselineIcon'] ?? '');
60
+ $svg = $icon !== '' && function_exists('wp_get_icon') ? wp_get_icon($icon, ['size' => null, 'class' => 'wp-block-button__icon']) : '';
61
+ if ($svg !== '') {
62
+ $end = ($attrs['baselineIconPosition'] ?? 'start') === 'end';
63
+ $only = !empty($attrs['baselineIconOnly']);
64
+ $classes[] = 'has-icon';
65
+ if ($end) {
66
+ $classes[] = 'has-icon-end';
67
+ }
68
+ if ($only) {
69
+ $classes[] = 'is-icon-only';
70
+ }
71
+ $content = preg_replace_callback(
72
+ '/(<(a|button)\b[^>]*\bwp-block-button__link\b[^>]*>)(.*?)(<\/\2>)/s',
73
+ static function (array $m) use ($svg, $end, $only): string {
74
+ $text = '<span class="' . ($only ? 'sr-only' : 'wp-block-button__text') . '">' . $m[3] . '</span>';
75
+ return $m[1] . ($end ? $text . $svg : $svg . $text) . $m[4];
76
+ },
77
+ $content,
78
+ 1
79
+ ) ?? $content;
80
+ }
81
+
82
+ $out = preg_replace('/(<div\b[^>]*\bclass=")([^"]*\bwp-block-button\b[^"]*)"/', '$1$2 ' . implode(' ', $classes) . '"', $content, 1);
83
+ return is_string($out) ? $out : $content;
84
+ }, 10, 2);
85
+
86
+ /** Editor script: Size + Icon controls and the editor-side classes; the icon collection is inlined for the picker. */
87
+ add_action('enqueue_block_editor_assets', static function (): void {
88
+ wp_enqueue_script(
89
+ 'baseline-core-button',
90
+ BASELINE_URI . '/assets/js/core-button-editor.js',
91
+ ['wp-hooks', 'wp-compose', 'wp-element', 'wp-components', 'wp-block-editor', 'wp-i18n'],
92
+ (string) filemtime(BASELINE_DIR . '/assets/js/core-button-editor.js'),
93
+ true
94
+ );
95
+ wp_add_inline_script('baseline-core-button', 'window.baselineIcons = ' . wp_json_encode(baseline_icons_for_editor()) . ';', 'before');
96
+ });
@@ -0,0 +1,30 @@
1
+ <?php
2
+ /**
3
+ * Card on WordPress is core/group (spec: components/card/spec.md; ADR-0018: no core card block, but core/group carries
4
+ * the anatomy). Block styles name the regions; src/core-card.css ports the React Card's rules onto them:
5
+ *
6
+ * is-style-card / is-style-card-sm the root (md / sm spacing); every direct child is padded content
7
+ * is-style-card-header title (a heading), description (a paragraph), action (a core/buttons)
8
+ * is-style-card-header-bordered the same header with Figma's Bordered rule beneath it
9
+ * is-style-card-footer the muted, bordered footer; a Row group lays its buttons out, a Stack stacks them
10
+ *
11
+ * An image block as the first child is the full-bleed media. patterns/card.php inserts the whole card, so editors delete
12
+ * regions rather than assemble them. The styles show on every group, not only inside a card: harmless there, and hiding
13
+ * them would need editor JavaScript.
14
+ */
15
+
16
+ declare(strict_types=1);
17
+
18
+ add_action('init', static function (): void {
19
+ $styles = [
20
+ 'card' => __('Card', 'baseline'),
21
+ 'card-sm' => __('Card (small)', 'baseline'),
22
+ 'card-header' => __('Card header', 'baseline'),
23
+ 'card-header-bordered' => __('Card header (bordered)', 'baseline'),
24
+ 'card-footer' => __('Card footer', 'baseline'),
25
+ ];
26
+ foreach ($styles as $name => $label) {
27
+ register_block_style('core/group', ['name' => $name, 'label' => $label]);
28
+ }
29
+ register_block_pattern_category('baseline', ['label' => __('GC Baseline', 'baseline')]);
30
+ });
@@ -0,0 +1,76 @@
1
+ <?php
2
+ /**
3
+ * Layout on WordPress (B5; specs: components/section, container, columns, panel). Core blocks carry all four
4
+ * (ADR-0018), so this file only adds what core lacks:
5
+ *
6
+ * Section core/group, tagName section, align full. `baselineScheme` (server-registered, ADR-0018 §3) renders as
7
+ * data-scheme on the group, `baselineSurface` as has-surface-<mode> (Figma's Surface mode: muted for an
8
+ * announcement bar); padding top / bottom are the spacing presets theme.json generates from
9
+ * spacing/responsive/*.
10
+ * Container no block: core's constrained layout. Content = an unaligned child, Wide = alignwide, Full = alignfull;
11
+ * theme.json contentSize / wideSize read layout/*, the inline padding is the root padding.
12
+ * Columns core/columns. `baselineInvertOrder` renders as is-inverted-on-mobile: once stacked, the last column
13
+ * comes first. src/core-layout.css sets the gap and shows four columns as 2 x 2 until xl.
14
+ * Panel block style `panel` on core/group: Card's surface around a section's content.
15
+ *
16
+ * Render-time only: saved markup never changes, so content keeps validating (ADR-0018).
17
+ */
18
+
19
+ declare(strict_types=1);
20
+
21
+ const BASELINE_SCHEMES = ['scheme-1', 'scheme-2', 'error', 'success', 'warning'];
22
+ const BASELINE_SURFACES = ['muted', 'card', 'primary', 'secondary', 'accent', 'inverse'];
23
+
24
+ add_filter('register_block_type_args', static function (array $args, string $name): array {
25
+ if ($name === 'core/group') {
26
+ $args['attributes']['baselineScheme'] = ['type' => 'string', 'enum' => array_merge([''], BASELINE_SCHEMES), 'default' => ''];
27
+ $args['attributes']['baselineSurface'] = ['type' => 'string', 'enum' => array_merge([''], BASELINE_SURFACES), 'default' => ''];
28
+ }
29
+ if ($name === 'core/columns') {
30
+ $args['attributes']['baselineInvertOrder'] = ['type' => 'boolean', 'default' => false];
31
+ }
32
+ return $args;
33
+ }, 10, 2);
34
+
35
+ add_action('init', static function (): void {
36
+ register_block_style('core/group', ['name' => 'panel', 'label' => __('Panel', 'baseline')]);
37
+ });
38
+
39
+ /** Adds an attribute string to the first opening tag of a block's markup. */
40
+ function baseline_first_tag_attr(string $content, string $attr): string
41
+ {
42
+ $out = preg_replace('/^(\s*<[a-z][a-z0-9-]*\b)/i', '$1 ' . $attr, $content, 1);
43
+ return is_string($out) ? $out : $content;
44
+ }
45
+
46
+ add_filter('render_block_core/group', static function (string $content, array $block): string {
47
+ $scheme = (string) ($block['attrs']['baselineScheme'] ?? '');
48
+ $surface = (string) ($block['attrs']['baselineSurface'] ?? '');
49
+ if (in_array($surface, BASELINE_SURFACES, true)) {
50
+ $out = preg_replace('/(<[a-z][a-z0-9-]*\b[^>]*\bclass=")([^"]*\bwp-block-group\b[^"]*)"/i', '$1$2 has-surface-' . $surface . '"', $content, 1);
51
+ $content = is_string($out) ? $out : $content;
52
+ }
53
+ if (in_array($scheme, BASELINE_SCHEMES, true)) {
54
+ $content = baseline_first_tag_attr($content, 'data-scheme="' . esc_attr($scheme) . '"');
55
+ }
56
+ return $content;
57
+ }, 10, 2);
58
+
59
+ add_filter('render_block_core/columns', static function (string $content, array $block): string {
60
+ if (empty($block['attrs']['baselineInvertOrder'])) {
61
+ return $content;
62
+ }
63
+ $out = preg_replace('/(<div\b[^>]*\bclass=")([^"]*\bwp-block-columns\b[^"]*)"/', '$1$2 is-inverted-on-mobile"', $content, 1);
64
+ return is_string($out) ? $out : $content;
65
+ }, 10, 2);
66
+
67
+ /** Editor: the Scheme select (groups), the Invert order toggle (columns), the two ratio variations core lacks. */
68
+ add_action('enqueue_block_editor_assets', static function (): void {
69
+ wp_enqueue_script(
70
+ 'baseline-core-layout',
71
+ BASELINE_URI . '/assets/js/core-layout-editor.js',
72
+ ['wp-hooks', 'wp-compose', 'wp-element', 'wp-components', 'wp-block-editor', 'wp-blocks', 'wp-i18n', 'wp-dom-ready'],
73
+ (string) filemtime(BASELINE_DIR . '/assets/js/core-layout-editor.js'),
74
+ true
75
+ );
76
+ });
@@ -0,0 +1,31 @@
1
+ <?php
2
+ /**
3
+ * core/navigation IS the Baseline Navigation Menu on WordPress (ADR-0018; spec: components/navigation-menu/spec.md):
4
+ * src/core-navigation.css styles it, its mobile overlay as the Sidebar's Sheet (spec: components/sidebar/spec.md).
5
+ * This file adds `not-typeset` to the <nav>, so a menu placed in post content keeps its own look instead of typeset's
6
+ * list and link rules (ADR-0028), as core/button's render filter does; and, where the menu has an overlay, enqueues
7
+ * assets/js/core-navigation.js (a click on the dimmed page closes it).
8
+ */
9
+
10
+ declare(strict_types=1);
11
+
12
+ add_action('wp_enqueue_scripts', static function (): void {
13
+ wp_register_script(
14
+ 'baseline-core-navigation',
15
+ BASELINE_URI . '/assets/js/core-navigation.js',
16
+ [],
17
+ (string) filemtime(BASELINE_DIR . '/assets/js/core-navigation.js'),
18
+ ['in_footer' => true, 'strategy' => 'defer']
19
+ );
20
+ });
21
+
22
+ add_filter('render_block_core/navigation', static function (string $content): string {
23
+ $tags = new WP_HTML_Tag_Processor($content);
24
+ if ($tags->next_tag(['tag_name' => 'nav', 'class_name' => 'wp-block-navigation'])) {
25
+ $tags->add_class('not-typeset');
26
+ }
27
+ if ($tags->next_tag(['class_name' => 'wp-block-navigation__responsive-container'])) {
28
+ wp_enqueue_script('baseline-core-navigation');
29
+ }
30
+ return $tags->get_updated_html();
31
+ });
@@ -0,0 +1,87 @@
1
+ <?php
2
+ /**
3
+ * Pagination on WordPress (spec: components/pagination/spec.md; ADR-0018): Previous and Next are always rendered, as in
4
+ * React and Shopify (user, 2026-10-02). Core drops Previous on the first page and Next on the last, which shifts the row;
5
+ * here the missing one comes back as a disabled link (no href, role="link", aria-disabled="true"), styled by
6
+ * src/core-pagination.css. A single page still renders nothing: a control is added only beside its counterpart.
7
+ *
8
+ * The looks themselves are generated (ADR-0031): src/looks.generated.css and inc/looks.generated.php.
9
+ */
10
+
11
+ declare(strict_types=1);
12
+
13
+ /** Core's arrow characters by paginationArrow (get_query_pagination_arrow()); the stylesheet masks them as chevrons. */
14
+ function baseline_pagination_arrow(string $type, string $direction): string
15
+ {
16
+ $arrows = [
17
+ 'arrow' => ['previous' => '←', 'next' => '→'],
18
+ 'chevron' => ['previous' => '«', 'next' => '»'],
19
+ ];
20
+ if (!isset($arrows[$type])) {
21
+ return '';
22
+ }
23
+ return sprintf(
24
+ '<span class="wp-block-query-pagination-%1$s-arrow is-arrow-%2$s" aria-hidden="true">%3$s</span>',
25
+ $direction,
26
+ esc_attr($type),
27
+ $arrows[$type][$direction]
28
+ );
29
+ }
30
+
31
+ /** core/query-pagination: put back the Previous or Next that core left out, as a disabled link in its place. */
32
+ add_filter('render_block_core/query-pagination', static function (string $content, array $block): string {
33
+ if (trim($content) === '') {
34
+ return $content;
35
+ }
36
+ $has = static fn (string $d): bool => str_contains($content, "wp-block-query-pagination-{$d}\"")
37
+ || str_contains($content, "wp-block-query-pagination-{$d} ");
38
+ $inner = [];
39
+ foreach ($block['innerBlocks'] ?? [] as $child) {
40
+ $inner[$child['blockName'] ?? ''] = $child['attrs'] ?? [];
41
+ }
42
+ $arrow = (string) ($block['attrs']['paginationArrow'] ?? 'none');
43
+ $show_label = (bool) ($block['attrs']['showLabel'] ?? true);
44
+ $disabled = static function (string $direction) use ($inner, $arrow, $show_label): string {
45
+ $attrs = $inner["core/query-pagination-{$direction}"];
46
+ $label = !empty($attrs['label']) ? esc_html($attrs['label']) : ($direction === 'previous' ? __('Previous Page') : __('Next Page'));
47
+ $arrow_html = baseline_pagination_arrow($arrow, $direction);
48
+ $text = $show_label ? $label : '';
49
+ $body = $direction === 'previous' ? $arrow_html . $text : $text . $arrow_html;
50
+ return sprintf(
51
+ '<a class="wp-block-query-pagination-%1$s" role="link" aria-disabled="true"%2$s>%3$s</a>',
52
+ $direction,
53
+ $show_label ? '' : ' aria-label="' . $label . '"',
54
+ $body
55
+ );
56
+ };
57
+ $has_previous = $has('previous');
58
+ $has_next = $has('next');
59
+ if (!$has_previous && $has_next && isset($inner['core/query-pagination-previous'])) {
60
+ $content = preg_replace('/(<nav\b[^>]*>)/', '$1' . $disabled('previous'), $content, 1) ?? $content;
61
+ }
62
+ if ($has_previous && !$has_next && isset($inner['core/query-pagination-next'])) {
63
+ $pos = strrpos($content, '</nav>');
64
+ if ($pos !== false) {
65
+ $content = substr($content, 0, $pos) . $disabled('next') . substr($content, $pos);
66
+ }
67
+ }
68
+ return $content;
69
+ }, 10, 2);
70
+
71
+ /**
72
+ * The classic paginate_links() output (the_posts_pagination(), paginate_comments_links()): the same, for the plain
73
+ * type. The list type is left as core prints it.
74
+ */
75
+ add_filter('paginate_links_output', static function (string $output, array $args): string {
76
+ if ($output === '' || empty($args['prev_next']) || ($args['type'] ?? 'plain') !== 'plain' || (int) ($args['total'] ?? 1) < 2) {
77
+ return $output;
78
+ }
79
+ $current = (int) ($args['current'] ?? 1);
80
+ if ($current <= 1 && !str_contains($output, 'prev page-numbers')) {
81
+ $output = '<a class="prev page-numbers" role="link" aria-disabled="true">' . $args['prev_text'] . "</a>\n" . $output;
82
+ }
83
+ if ($current >= (int) $args['total'] && !str_contains($output, 'next page-numbers')) {
84
+ $output .= "\n" . '<a class="next page-numbers" role="link" aria-disabled="true">' . $args['next_text'] . '</a>';
85
+ }
86
+ return $output;
87
+ }, 10, 2);
@@ -0,0 +1,39 @@
1
+ <?php
2
+ /**
3
+ * The site header on WordPress (B5; spec: components/header/spec.md). Core blocks only (ADR-0018): header.php renders
4
+ * the `header` template part (parts/header.html, editable in the Site Editor), and patterns/header-inline.php and
5
+ * header-stacked.php are the two Figma layouts an editor can swap in. src/header.css lays them out.
6
+ *
7
+ * Search in a Dialog (user, 2026-10-07): the `dialog` block style on core/search renders a ghost search button that
8
+ * opens a Baseline Dialog (baseline_dialog()) holding core's own search form, unchanged. No account link (user: almost
9
+ * never needed on WordPress) and no cart.
10
+ */
11
+
12
+ declare(strict_types=1);
13
+
14
+ add_action('init', static function (): void {
15
+ register_block_style('core/search', ['name' => 'dialog', 'label' => __('In a dialog', 'baseline')]);
16
+ register_block_pattern_category('header', ['label' => __('Headers', 'baseline')]);
17
+ });
18
+
19
+ add_filter('render_block_core/search', static function (string $content, array $block): string {
20
+ $class = (string) ($block['attrs']['className'] ?? '');
21
+ if (!preg_match('/(^|\s)is-style-dialog(\s|$)/', $class)) {
22
+ return $content;
23
+ }
24
+ $id = wp_unique_id('search-dialog-');
25
+ $trigger = baseline_button([
26
+ 'variant' => 'ghost',
27
+ 'size' => 'md',
28
+ 'class' => 'is-icon-only has-icon',
29
+ 'children' => baseline_icon('search') . '<span class="sr-only">' . esc_html__('Search', 'baseline') . '</span>',
30
+ 'attrs' => ['command' => 'show-modal', 'commandfor' => $id, 'aria-label' => __('Search', 'baseline')],
31
+ ]);
32
+ $dialog = baseline_dialog([
33
+ 'id' => $id,
34
+ 'trigger' => false,
35
+ 'title' => __('Search', 'baseline'),
36
+ 'body' => $content,
37
+ ]);
38
+ return '<div class="bl-search-dialog not-typeset">' . $trigger . $dialog . '</div>';
39
+ }, 10, 2);