@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,919 @@
1
+ /* Gravity Forms (theme framework / Orbital) buttons follow the Baseline button (spec: components/button/spec.md).
2
+ Gravity Forms' stylesheet is unlayered, so it would beat Tailwind's layered utilities on its own selectors; the
3
+ supported override path is the CSS API (--gf-* custom properties), which we set to Baseline tokens. This file is
4
+ imported unlayered into app.css and editor.css. Reference: https://docs.css.gravity.com/ (controls > button).
5
+
6
+ Every block that sets --gf-* variables carries `:is(#bl-gform, .gform_wrapper)`. Gravity Forms prints a <style> per
7
+ form, keyed on the form's id (`#gform_wrapper_1[data-form-index="0"].gform-theme`, specificity 1,2,0), which sets
8
+ the same variables from the form's style settings (its primary colour, a gray secondary border ...), and an id
9
+ beats any number of classes. `:is()` takes the specificity of its strongest argument whether or not that argument
10
+ matches, so the never-present #bl-gform lifts these blocks to (1,3,0) while .gform_wrapper does the matching
11
+ (found 2026-10-01: Previous kept GF's #686e77 border on a #f5f5f5 fill). */
12
+
13
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) {
14
+ /* geometry: the button/* component tokens (ADR-0017); GF's xl reuses lg */
15
+ --gf-ctrl-btn-radius: var(--bl-button-md-radius);
16
+ --gf-ctrl-btn-shadow: none;
17
+ --gf-ctrl-btn-shadow-hover: none;
18
+ --gf-ctrl-btn-shadow-focus: 0 0 0 var(--bl-control-ring-width) var(--ring);
19
+ /* GF also draws a focus OUTLINE on buttons and controls (3px of its primary at 65 %, offset 1px) over the ring above;
20
+ Baseline's ring is the box-shadow alone, as on core/button, so the outline goes (found 2026-10-01) */
21
+ --gf-ctrl-outline-width-focus: 0;
22
+ --gf-ctrl-outline-color-focus: transparent;
23
+ --gf-ctrl-btn-shadow-disabled: none;
24
+ --gf-ctrl-btn-opacity-disabled: 0.5;
25
+ --gf-ctrl-btn-size-xs: var(--bl-button-xs-height);
26
+ --gf-ctrl-btn-size-sm: var(--bl-button-sm-height);
27
+ --gf-ctrl-btn-size-md: var(--bl-button-md-height);
28
+ --gf-ctrl-btn-size-lg: var(--bl-button-lg-height);
29
+ --gf-ctrl-btn-size-xl: var(--bl-button-lg-height);
30
+ --gf-ctrl-btn-padding-x-xs: var(--bl-button-xs-padding-x);
31
+ --gf-ctrl-btn-padding-x-sm: var(--bl-button-sm-padding-x);
32
+ --gf-ctrl-btn-padding-x-md: var(--bl-button-md-padding-x);
33
+ --gf-ctrl-btn-padding-x-lg: var(--bl-button-lg-padding-x);
34
+ --gf-ctrl-btn-padding-x-xl: var(--bl-button-lg-padding-x);
35
+ --gf-ctrl-btn-padding-y: 0;
36
+ --gf-ctrl-btn-font-family: var(--bl-button-font-family);
37
+ --gf-ctrl-btn-font-size-xs: var(--bl-button-xs-font-size);
38
+ --gf-ctrl-btn-font-size-sm: var(--bl-button-sm-font-size);
39
+ --gf-ctrl-btn-font-size-md: var(--bl-button-md-font-size);
40
+ --gf-ctrl-btn-font-size-lg: var(--bl-button-lg-font-size);
41
+ --gf-ctrl-btn-font-size-xl: var(--bl-button-lg-font-size);
42
+ --gf-ctrl-btn-font-weight: var(--bl-button-font-weight);
43
+ --gf-ctrl-btn-line-height: var(--bl-button-md-line-height);
44
+ --gf-ctrl-btn-letter-spacing: normal;
45
+ --gf-ctrl-btn-icon-gap: var(--bl-button-md-gap);
46
+
47
+ /* primary = Baseline `default` variant (hover: primary at 90%, shadcn) */
48
+ --gf-ctrl-btn-bg-color-primary: var(--primary);
49
+ --gf-ctrl-btn-bg-color-hover-primary: color-mix(in oklab, var(--primary) 90%, transparent);
50
+ --gf-ctrl-btn-bg-color-focus-primary: var(--primary);
51
+ --gf-ctrl-btn-bg-color-disabled-primary: var(--primary);
52
+ --gf-ctrl-btn-border-color-primary: transparent;
53
+ --gf-ctrl-btn-border-color-hover-primary: transparent;
54
+ --gf-ctrl-btn-border-color-focus-primary: transparent;
55
+ --gf-ctrl-btn-border-color-disabled-primary: transparent;
56
+ --gf-ctrl-btn-color-primary: var(--primary-foreground);
57
+ --gf-ctrl-btn-color-hover-primary: var(--primary-foreground);
58
+ --gf-ctrl-btn-icon-color-primary: var(--primary-foreground);
59
+
60
+ /* secondary (Previous, Save & Continue) = Baseline `secondary` variant (hover: 80%) */
61
+ --gf-ctrl-btn-bg-color-secondary: var(--secondary);
62
+ --gf-ctrl-btn-bg-color-hover-secondary: color-mix(in oklab, var(--secondary) 80%, transparent);
63
+ --gf-ctrl-btn-bg-color-focus-secondary: var(--secondary);
64
+ --gf-ctrl-btn-bg-color-disabled-secondary: var(--secondary);
65
+ --gf-ctrl-btn-border-color-secondary: transparent;
66
+ --gf-ctrl-btn-border-color-hover-secondary: transparent;
67
+ --gf-ctrl-btn-border-color-focus-secondary: transparent;
68
+ --gf-ctrl-btn-border-color-disabled-secondary: transparent;
69
+ --gf-ctrl-btn-color-secondary: var(--secondary-foreground);
70
+ --gf-ctrl-btn-color-hover-secondary: var(--secondary-foreground);
71
+ --gf-ctrl-btn-icon-color-secondary: var(--secondary-foreground);
72
+
73
+ /* simple (text-only links) = Baseline `link` variant */
74
+ --gf-ctrl-btn-color-simple: var(--primary);
75
+ --gf-ctrl-btn-color-hover-simple: var(--primary);
76
+ --gf-ctrl-btn-icon-color-simple: var(--primary);
77
+ }
78
+
79
+ /* ---------------------------------------------------------------------------------------------------------
80
+ Text controls (spec: components/input/spec.md). Most real client inputs are Gravity Forms fields, so Input
81
+ is only half-implemented on WordPress until these match the theme's own controls exactly.
82
+
83
+ Read from the installed plugin (Gravity Forms 3.1.2,
84
+ `assets/css/dist/gravity-forms-theme-framework.min.css`) rather than guessed:
85
+
86
+ - GF paints a control with `border: var(--gf-ctrl-border-width) var(--gf-ctrl-border-style)
87
+ var(--gf-local-border-color)`, where the local property is assigned per state from the global
88
+ `--gf-ctrl-border-color*` family. So overriding the globals is the right lever.
89
+ - The globals are declared exactly once, on `.gform-theme--api,.gform-theme--framework` (specificity 0,1,0).
90
+ - Hover is real: a rule sets `--gf-local-border-color: var(--gf-ctrl-border-color-hover)`, which is why a
91
+ hover colour change appears unless that global is overridden too.
92
+
93
+ Two things this file does about it.
94
+
95
+ (1) The CSS API, the supported override path, for everything GF drives through variables.
96
+ (2) Explicit declarations on the controls themselves, so the border does not depend on the variable chain
97
+ resolving. GF's own paint rules reach 0,3,1, so the wrapper class is repeated to sit above them without
98
+ `!important`.
99
+
100
+ Both are scoped to `.gform_wrapper` rather than to `.gform-theme--framework`, because **which theme a form
101
+ uses is a per-form setting** (theme framework, the 2.5 `gravity-theme`, or legacy) and the wrapper classes
102
+ differ for each. Scoping to the framework class styled only some forms, which is the likeliest reason the
103
+ first attempt did not take effect on a real form.
104
+
105
+ Still unverified against a running form: DDEV is not reachable from this shell. If a border still looks
106
+ wrong, the decisive evidence is the wrapper's class list and which rule wins in the inspector.
107
+ --------------------------------------------------------------------------------------------------------- */
108
+
109
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) {
110
+ /* box: Baseline controls are transparent and take their colour from the scheme behind them */
111
+ --gf-ctrl-bg-color: transparent;
112
+ --gf-ctrl-bg-color-hover: transparent;
113
+ --gf-ctrl-bg-color-focus: transparent;
114
+ --gf-ctrl-bg-color-error: transparent;
115
+ --gf-ctrl-bg-color-disabled: transparent;
116
+
117
+ --gf-ctrl-border-width: var(--bl-input-md-border-width);
118
+ --gf-ctrl-radius: var(--bl-input-md-radius);
119
+ --gf-ctrl-border-color: var(--input);
120
+ --gf-ctrl-border-color-hover: var(--input); /* Baseline controls have no hover state */
121
+ --gf-ctrl-border-color-focus: var(--primary);
122
+ --gf-ctrl-border-color-error: var(--destructive);
123
+ --gf-ctrl-border-color-disabled: var(--input);
124
+ --gf-ctrl-shadow: none;
125
+
126
+ /* text: invalid colours the value destructive, matching the component and the Figma set */
127
+ --gf-ctrl-color: var(--foreground);
128
+ --gf-ctrl-color-hover: var(--foreground);
129
+ --gf-ctrl-color-focus: var(--foreground);
130
+ --gf-ctrl-color-error: var(--destructive);
131
+ --gf-ctrl-placeholder-color: var(--muted-foreground);
132
+
133
+ /* GF has no opacity hook for disabled, so the 50% Baseline look is mixed into the colours it does expose */
134
+ --gf-ctrl-color-disabled: color-mix(in oklab, var(--foreground) 50%, transparent);
135
+
136
+ /* size: Baseline Input has exactly one size, so all four GF control sizes resolve to it rather than invent
137
+ heights the design system does not define. When Input gains sizes these point at input/<size>/height.
138
+ control/height/* stays Figma-only and is never emitted, so it cannot be referenced here. */
139
+ --gf-ctrl-size-sm: var(--bl-input-md-height);
140
+ --gf-ctrl-size-md: var(--bl-input-md-height);
141
+ --gf-ctrl-size-lg: var(--bl-input-md-height);
142
+ --gf-ctrl-size-xl: var(--bl-input-md-height);
143
+ --gf-ctrl-size: var(--bl-input-md-height);
144
+ --gf-ctrl-padding-x: var(--bl-input-md-padding-x);
145
+ --gf-ctrl-padding-y: var(--bl-input-md-padding-y);
146
+
147
+ --gf-ctrl-font-family: var(--bl-font-sans);
148
+ --gf-ctrl-font-size: var(--bl-input-md-font-size);
149
+ --gf-ctrl-font-weight: 400;
150
+
151
+ /* Label and description, so a GF field reads like a Baseline Field (spec: components/field/spec.md).
152
+ Names verified against docs.css.gravity.com (controls > label, controls > description) on 2026-09-25.
153
+ Weights are literals because font-weight/* is a Figma-only scale that is never emitted (ADR-0022 §1):
154
+ 500 is FieldLabel's font-medium, 400 is FieldDescription's font-normal. */
155
+ --gf-ctrl-label-color-primary: var(--foreground);
156
+ --gf-ctrl-label-color-secondary: var(--foreground);
157
+ --gf-ctrl-label-color-tertiary: var(--muted-foreground);
158
+ --gf-ctrl-label-color-quaternary: var(--muted-foreground);
159
+ --gf-ctrl-label-color-req: var(--destructive);
160
+ --gf-ctrl-label-font-size-primary: var(--bl-input-md-font-size);
161
+ --gf-ctrl-label-font-size-secondary: var(--bl-input-md-font-size);
162
+ --gf-ctrl-label-font-weight-primary: 500;
163
+ --gf-ctrl-label-font-weight-secondary: 500;
164
+
165
+ --gf-ctrl-desc-color: var(--muted-foreground);
166
+ --gf-ctrl-desc-color-error: var(--destructive);
167
+ --gf-ctrl-desc-font-family: var(--bl-font-sans);
168
+ --gf-ctrl-desc-font-size: var(--bl-input-md-font-size);
169
+ --gf-ctrl-desc-font-style: normal;
170
+ --gf-ctrl-desc-font-weight: 400;
171
+ --gf-ctrl-desc-line-height: var(--bl-input-md-line-height);
172
+
173
+ /* Choice controls: checkbox and radio (spec: components/checkbox/spec.md, components/radio/spec.md).
174
+ Gravity Forms tints the NATIVE control with `accent-color` and overlays a check from its own icon font.
175
+ That was mapped through the API at first and it does not work: Baseline sets `appearance: none`, which
176
+ kills `accent-color` outright, and GF's icon-font `::before` then fights Baseline's mask on the same
177
+ pseudo-element -- the box lost its fill and no glyph rendered. The CSS API has no hook for the box's
178
+ border, radius or fill on a choice control, so it cannot express Baseline's design either way.
179
+ Baseline therefore takes ownership of choice controls below, the same way it already owns the text box. */
180
+ --gf-ctrl-choice-size: var(--bl-checkbox-size);
181
+
182
+ /* Inline labels (the label beside a checkbox, radio or consent box). `-y-secondary` is the label's top
183
+ margin: mapping it to the field gap, as the stacked label wants, pushed every choice label 8px down and
184
+ broke its alignment with the control. An inline label needs no vertical offset -- the gap it does need is
185
+ horizontal, and GF leaves the grid column gap at 0 and takes it from the label's own margin. */
186
+ --gf-label-space-x-secondary: var(--bl-label-gap);
187
+ --gf-label-space-y-secondary: 0;
188
+ --gf-label-space-y-sm-secondary: 0;
189
+ --gf-label-space-y-md-secondary: 0;
190
+ --gf-label-space-y-lg-secondary: 0;
191
+ --gf-label-space-y-xl-secondary: 0;
192
+
193
+ /* Section break. GF draws a rule under it; Baseline's FieldSet legend is text with no underline, so the
194
+ border goes and the title takes the legend tokens instead (see the rules below). */
195
+ --gf-field-section-border-width: 0;
196
+ --gf-field-section-padding-y-end: 0;
197
+
198
+ /* The list field's add/remove buttons, styled as an icon Button at md: square, button radius, no padding.
199
+ --gf-field-list-btn-font-size stays at GF's 0: the button has a real text label ("Add another row") and
200
+ 0 is what hides it, so raising it to the icon size put the words back on screen. The glyph is drawn on
201
+ ::before as a Baseline mask below, at its own explicit size, so a 0 font-size costs it nothing.
202
+ GF exposes no colour hook for these buttons, so the fill is a real rule below.
203
+ --gf-field-list-btns-width is sized for ONE of GF's 16px buttons; two md buttons and the gap need more. */
204
+ --gf-field-list-btn-size: var(--bl-button-md-height);
205
+ --gf-field-list-btn-radius: var(--bl-button-md-radius);
206
+ --gf-field-list-btn-font-size: 0;
207
+ --gf-field-list-btn-padding-x: 0;
208
+ --gf-field-list-btn-padding-y: 0;
209
+ --gf-field-list-btns-width: calc(
210
+ 2 * var(--bl-button-md-height) + var(--gf-field-list-btns-gap) + var(--gf-field-gap-x)
211
+ );
212
+ }
213
+
214
+ /* (2) the box itself. `:where()` is deliberately NOT used here: these must beat the framework's own layer. */
215
+ .gform_wrapper.gform_wrapper.gform_wrapper
216
+ :is(input:not([type="submit"]):not([type="button"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]), select, textarea) {
217
+ border: var(--bl-input-md-border-width) solid var(--input);
218
+ border-radius: var(--bl-input-md-radius);
219
+ background-color: transparent;
220
+ /* NO `box-shadow: none` here. Those five :not()s make this rule (0,9,1), while the focus and invalid
221
+ ring rules below are (0,4,1) and (0,5,1) -- so a resting `none` beat both and no ring ever rendered
222
+ inside a Gravity Forms field. Killing GF's own shadow is `--gf-ctrl-shadow: none` in the variable
223
+ block above, which is the CSS API's job and carries no specificity at all. */
224
+ color: var(--foreground);
225
+ font-family: var(--bl-font-sans);
226
+ font-size: var(--bl-input-md-font-size);
227
+ line-height: var(--bl-input-md-line-height);
228
+ transition: color 150ms, border-color 150ms, box-shadow 150ms;
229
+ }
230
+
231
+ /* Padding is a rule of its own so type=file, the single-select and the textarea can be carved out of it:
232
+ each needs a padding of its own and this rule is (0,9,1), which no plainly written override beats. */
233
+ .gform_wrapper.gform_wrapper.gform_wrapper
234
+ :is(input:not([type="submit"]):not([type="button"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]):not([type="file"]), select[multiple]) {
235
+ padding: var(--bl-input-md-padding-y) var(--bl-input-md-padding-x);
236
+ }
237
+
238
+ /* Paragraph Text. The box above already gives it the border, radius, colour and type, all of which Textarea
239
+ shares with Input; these are the three values that differ (spec: components/textarea/spec.md). Everything
240
+ resolves to the same variables as src/textarea.css, so the theme's comment box and a Gravity Forms
241
+ paragraph field cannot drift apart. */
242
+ /* four classes: GF's foundation theme sets `.gform-theme--foundation .gfield textarea.medium { min-block-size: 12rem }`
243
+ at (0,3,1), later in the cascade, which kept every paragraph field 192px tall so field-sizing never showed (found
244
+ 2026-10-01). min-block-size is named too, since that is the property GF sets. */
245
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper textarea {
246
+ field-sizing: content;
247
+ min-height: var(--bl-textarea-md-min-height);
248
+ min-block-size: var(--bl-textarea-md-min-height);
249
+ /* GF's framework also fixes the height (block-size: var(--gf-ctrl-textarea-height), 130px); a fixed height wins over
250
+ field-sizing, so it goes back to auto */
251
+ height: auto;
252
+ block-size: auto;
253
+ padding: var(--bl-textarea-md-padding-y) var(--bl-textarea-md-padding-x);
254
+ border-radius: var(--bl-textarea-md-radius);
255
+ }
256
+
257
+ /* single-line controls take the control height; textarea and a multi-select keep their own, as in Baseline */
258
+ .gform_wrapper.gform_wrapper.gform_wrapper
259
+ :is(input:not([type="submit"]):not([type="button"]):not([type="image"]):not([type="checkbox"]):not([type="radio"]), select:not([multiple])) {
260
+ height: var(--bl-input-md-height);
261
+ align-content: center;
262
+ }
263
+
264
+ /* hover must change nothing: this is the rule that was failing */
265
+ .gform_wrapper.gform_wrapper.gform_wrapper
266
+ :is(input, select, textarea):hover {
267
+ border-color: var(--input);
268
+ background-color: transparent;
269
+ }
270
+
271
+ .gform_wrapper.gform_wrapper.gform_wrapper
272
+ :is(input, select, textarea)::placeholder {
273
+ color: var(--muted-foreground);
274
+ opacity: 1;
275
+ }
276
+
277
+ /* GF uses :focus rather than :focus-visible on its controls, so both are covered */
278
+ .gform_wrapper.gform_wrapper.gform_wrapper
279
+ :is(input, select, textarea):is(:focus, :focus-visible) {
280
+ border-color: var(--primary);
281
+ box-shadow: 0 0 0 var(--bl-control-ring-width) var(--ring);
282
+ outline: none;
283
+ }
284
+
285
+ /* invalid: GF marks the wrapper .gfield_error and sets aria-invalid on the control */
286
+ .gform_wrapper.gform_wrapper.gform_wrapper .gfield_error :is(input, select, textarea),
287
+ .gform_wrapper.gform_wrapper.gform_wrapper :is(input, select, textarea)[aria-invalid="true"] {
288
+ border-color: var(--destructive);
289
+ color: var(--destructive);
290
+ }
291
+ .gform_wrapper.gform_wrapper.gform_wrapper .gfield_error :is(input, select, textarea):is(:focus, :focus-visible),
292
+ .gform_wrapper.gform_wrapper.gform_wrapper :is(input, select, textarea)[aria-invalid="true"]:is(:focus, :focus-visible) {
293
+ box-shadow: 0 0 0 var(--bl-control-ring-width) var(--ring-invalid);
294
+ }
295
+
296
+ .gform_wrapper.gform_wrapper.gform_wrapper
297
+ :is(input, select, textarea):disabled {
298
+ opacity: 0.5;
299
+ cursor: not-allowed;
300
+ }
301
+
302
+ /* file upload: the browser's own button, styled as Button secondary xs like everywhere else */
303
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="file"]::file-selector-button {
304
+ display: inline-flex;
305
+ align-items: center;
306
+ margin-inline-end: var(--bl-input-md-gap);
307
+ height: var(--bl-button-xs-height);
308
+ padding-inline: var(--bl-button-xs-padding-x);
309
+ border: 0;
310
+ border-radius: var(--bl-button-xs-radius);
311
+ background-color: var(--secondary);
312
+ color: var(--secondary-foreground);
313
+ font-family: inherit;
314
+ font-size: var(--bl-button-xs-font-size);
315
+ font-weight: var(--bl-button-font-weight);
316
+ line-height: var(--bl-input-md-line-height);
317
+ cursor: pointer;
318
+ }
319
+
320
+ /* ---------------------------------------------------------------------------------------------------------
321
+ Field (spec: components/field/spec.md). On WordPress the Field component emits no markup of its own: Gravity
322
+ Forms already renders the wrapper, label, description and validation message for every field, and WordPress
323
+ renders its own for search, comments and the password form (src/field.css). So Field here is the mapping
324
+ that makes both look like the Baseline component.
325
+
326
+ Property names and their defaults read from the installed plugin (Gravity Forms 3.1.2), not from the docs:
327
+ --gf-field-gap-y 12px gap between fields -> field/group/gap (16px)
328
+ --gf-label-space-primary 8px label to control -> field/gap (8px)
329
+ --gf-desc-space 8px description spacing -> field/gap (8px)
330
+ --gf-field-choice-gap 12px gap between choices -> field/group/gap-compact (12px)
331
+ --gf-desc-choice-field-space 12px choice field description -> field/gap
332
+ --------------------------------------------------------------------------------------------------------- */
333
+
334
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) {
335
+ /* between fields, and between the parts of one field */
336
+ --gf-field-gap-y: var(--bl-field-group-gap);
337
+ --gf-field-gap-x: var(--bl-field-group-gap);
338
+ --gf-label-space-primary: var(--bl-field-gap);
339
+ --gf-label-space-tertiary: var(--bl-field-gap);
340
+ /* --gf-label-space-*-secondary is the INLINE label (beside a checkbox, radio or consent box) and is set
341
+ with the choice controls above, not here: it is 0 there, and a second copy at this same specificity
342
+ would win on source order and put the 8px offset back. */
343
+ --gf-desc-space: var(--bl-field-gap);
344
+
345
+ /* choice lists (checkbox and radio groups) use the compact group gap, as a Baseline checkbox group does */
346
+ --gf-field-choice-gap: var(--bl-field-group-gap-compact);
347
+ --gf-desc-choice-field-space: var(--bl-field-gap);
348
+
349
+ /* the required marker is part of the label, and destructive is the Baseline colour for it */
350
+ --gf-ctrl-label-color-req: var(--destructive);
351
+ --gf-ctrl-label-font-size-req: var(--bl-label-font-size);
352
+ }
353
+
354
+ /* The validation message is Baseline's FieldError: same size, weight and colour, so a Gravity Forms error and
355
+ a Field error are indistinguishable. GF renders it as .gfield_validation_message inside the field. */
356
+ .gform_wrapper.gform_wrapper.gform_wrapper :is(.gfield_validation_message, .validation_message) {
357
+ color: var(--destructive);
358
+ font-family: var(--bl-font-sans);
359
+ font-size: var(--bl-field-error-font-size);
360
+ line-height: var(--bl-field-error-line-height);
361
+ font-weight: var(--bl-field-error-font-weight);
362
+ background: none;
363
+ border: 0;
364
+ padding: 0;
365
+ margin-block-start: var(--bl-field-gap);
366
+ }
367
+
368
+ /* The form-level error summary keeps GF's own layout but takes Baseline's colours and type. */
369
+ .gform_wrapper.gform_wrapper.gform_wrapper .gform_validation_errors {
370
+ border: var(--bl-input-md-border-width) solid var(--destructive);
371
+ border-radius: var(--bl-input-md-radius);
372
+ background-color: transparent;
373
+ box-shadow: none;
374
+ }
375
+ .gform_wrapper.gform_wrapper.gform_wrapper .gform_validation_errors :is(h2, .gform_submission_error) {
376
+ color: var(--destructive);
377
+ font-family: var(--bl-font-sans);
378
+ font-size: var(--bl-field-error-font-size);
379
+ line-height: var(--bl-field-error-line-height);
380
+ font-weight: var(--bl-field-error-font-weight);
381
+ }
382
+
383
+ /* ---------------------------------------------------------------------------------------------------------
384
+ Choice controls, section breaks, multi-select, file upload and the list buttons.
385
+
386
+ `:where()` is deliberately NOT used in this block: like the text box above, these must beat the framework's
387
+ own layer. The tripled .gform_wrapper keeps them above GF without reaching for !important.
388
+ --------------------------------------------------------------------------------------------------------- */
389
+
390
+ /* Checkbox and radio: Baseline draws the box, because GF's CSS API exposes no border, radius or fill for one.
391
+ Mirrors src/checkbox.css and src/radio.css, and through them registry/src/ui/{checkbox,radio}. The rules
392
+ live here rather than there because a choice control needs the extra specificity to beat the plugin. */
393
+ .gform_wrapper.gform_wrapper.gform_wrapper :is(input[type="checkbox"], input[type="radio"]) {
394
+ appearance: none;
395
+ position: relative;
396
+ flex-shrink: 0;
397
+ width: var(--bl-checkbox-size);
398
+ height: var(--bl-checkbox-size);
399
+ margin: 0;
400
+ padding: 0;
401
+ border: 1px solid var(--input);
402
+ background-color: transparent;
403
+ box-shadow: none;
404
+ transition: background-color 150ms, border-color 150ms, box-shadow 150ms;
405
+ }
406
+
407
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="checkbox"] {
408
+ border-radius: var(--bl-checkbox-radius);
409
+ }
410
+
411
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="radio"] {
412
+ width: var(--bl-radio-size);
413
+ height: var(--bl-radio-size);
414
+ border-radius: 9999px;
415
+ }
416
+
417
+ .gform_wrapper.gform_wrapper.gform_wrapper :is(input[type="checkbox"], input[type="radio"]):checked {
418
+ border-color: var(--primary);
419
+ background-color: var(--primary);
420
+ }
421
+
422
+ /* The glyph. `content: ""` replaces GF's icon-font character outright, so the two cannot fight over the same
423
+ pseudo-element; the mask follows the ACTIVE icon set through icons.generated.css. */
424
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="checkbox"]::before {
425
+ content: "";
426
+ position: absolute;
427
+ inset: 0;
428
+ font-size: 0;
429
+ background-color: var(--primary-foreground);
430
+ mask-image: var(--bl-icon-check);
431
+ mask-repeat: no-repeat;
432
+ mask-size: 100% 100%;
433
+ mask-position: center;
434
+ opacity: 0;
435
+ }
436
+
437
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="checkbox"]:checked::before {
438
+ opacity: 1;
439
+ }
440
+
441
+ /* The radio dot is drawn, not masked: it is a circle, so it needs no glyph. */
442
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="radio"]::before {
443
+ content: "";
444
+ position: absolute;
445
+ inset: 0;
446
+ margin: auto;
447
+ width: var(--bl-radio-dot-size);
448
+ height: var(--bl-radio-dot-size);
449
+ border-radius: 9999px;
450
+ background-color: var(--primary-foreground);
451
+ opacity: 0;
452
+ }
453
+
454
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="radio"]:checked::before {
455
+ opacity: 1;
456
+ }
457
+
458
+ .gform_wrapper.gform_wrapper.gform_wrapper
459
+ :is(input[type="checkbox"], input[type="radio"]):is(:focus, :focus-visible) {
460
+ border-color: var(--primary);
461
+ box-shadow: 0 0 0 var(--bl-control-ring-width) var(--ring);
462
+ outline: none;
463
+ }
464
+
465
+ /* invalid does not override checked: a ticked-but-invalid box still has to read as ticked */
466
+ .gform_wrapper.gform_wrapper.gform_wrapper
467
+ :is(input[type="checkbox"], input[type="radio"])[aria-invalid="true"] {
468
+ border-color: var(--destructive);
469
+ }
470
+
471
+ .gform_wrapper.gform_wrapper.gform_wrapper
472
+ :is(input[type="checkbox"], input[type="radio"])[aria-invalid="true"]:checked {
473
+ border-color: var(--primary);
474
+ }
475
+
476
+ .gform_wrapper.gform_wrapper.gform_wrapper
477
+ :is(input[type="checkbox"], input[type="radio"]):disabled {
478
+ cursor: not-allowed;
479
+ opacity: 0.5;
480
+ }
481
+
482
+ /* GF lays each choice out as a two-column grid. Centring the row is what aligns a single-line label with its
483
+ control, and is what Field orientation="horizontal" does in the React component. */
484
+ .gform_wrapper.gform_wrapper.gform_wrapper
485
+ :is(.gfield--type-choice .gchoice, .gfield--type-choice .ginput_container_consent) {
486
+ align-items: center;
487
+ }
488
+
489
+ /* Section break: no rule, and the title reads as a Baseline legend. */
490
+ .gform_wrapper.gform_wrapper.gform_wrapper .gsection_title {
491
+ font-family: var(--bl-font-sans);
492
+ font-size: var(--bl-field-legend-font-size);
493
+ line-height: var(--bl-field-legend-line-height);
494
+ font-weight: var(--bl-field-legend-font-weight);
495
+ color: var(--foreground);
496
+ margin-block: 0;
497
+ }
498
+
499
+ .gform_wrapper.gform_wrapper.gform_wrapper .gsection_description {
500
+ font-size: var(--bl-field-description-font-size);
501
+ line-height: var(--bl-field-description-line-height);
502
+ color: var(--muted-foreground);
503
+ margin-block-start: var(--bl-field-content-gap);
504
+ }
505
+
506
+ /* A multi-select shows several rows, so it grows with them. The height rule above excludes it rather than
507
+ this rule overriding it: those five :not()s make the height rule (0,9,1), which this cannot beat. */
508
+ .gform_wrapper.gform_wrapper.gform_wrapper select[multiple] {
509
+ /* field-sizing sizes the box to the option list instead of the UA's fixed four rows. Where it is not
510
+ supported yet the height:auto/min-height pair below is still a correct box, so this is an enhancement
511
+ rather than a dependency. */
512
+ field-sizing: content;
513
+ height: auto;
514
+ min-height: var(--bl-input-md-height);
515
+ align-content: normal;
516
+ }
517
+
518
+ /* The chevron. Gravity Forms paints its own glyph as a background-image on the select, which means it can
519
+ never follow a colour scheme and is not the icon set Figma names. Baseline turns it off and draws
520
+ chevron-down from the active set as a mask, where background-color is a live scheme colour.
521
+
522
+ The mask goes on whatever element wraps the select, because a <select> is a replaced element and cannot
523
+ carry a pseudo-element of its own. `:has(> select)` matches only the select's immediate parent, so one
524
+ rule covers the Drop Down field and the sub-selects of Date, Time and Address alike without naming any of
525
+ their container classes. Multi-selects are excluded: they have no chevron. */
526
+ .gform_wrapper.gform_wrapper.gform_wrapper select:not([multiple]) {
527
+ appearance: none;
528
+ background-image: none;
529
+ padding: var(--bl-input-md-padding-y) var(--bl-input-md-padding-x);
530
+ padding-inline-end: calc(
531
+ var(--bl-select-md-padding-x) + var(--bl-select-md-icon-size) + var(--bl-select-md-gap)
532
+ );
533
+ }
534
+
535
+ .gform_wrapper.gform_wrapper.gform_wrapper .gfield *:has(> select:not([multiple])) {
536
+ position: relative;
537
+ }
538
+
539
+ .gform_wrapper.gform_wrapper.gform_wrapper .gfield *:has(> select:not([multiple]))::after {
540
+ content: "";
541
+ position: absolute;
542
+ inset-block-start: 50%;
543
+ inset-inline-end: var(--bl-select-md-padding-x);
544
+ translate: 0 -50%;
545
+ width: var(--bl-select-md-icon-size);
546
+ height: var(--bl-select-md-icon-size);
547
+ background-color: var(--foreground);
548
+ mask-image: var(--bl-icon-chevron-down);
549
+ mask-repeat: no-repeat;
550
+ mask-position: center;
551
+ mask-size: 100% 100%;
552
+ /* the chevron is decoration on top of the control; the click has to reach the select */
553
+ pointer-events: none;
554
+ }
555
+
556
+ /* the whole control fades together, chevron included */
557
+ .gform_wrapper.gform_wrapper.gform_wrapper .gfield *:has(> select:not([multiple]):disabled)::after {
558
+ opacity: 0.5;
559
+ }
560
+
561
+ /* The number spinner is browser chrome Figma does not draw, and in Blink it appears on hover and shifts the
562
+ value. Hidden here as it is on every other platform (spec: components/input/spec.md). */
563
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="number"] {
564
+ appearance: textfield;
565
+ }
566
+
567
+ /* GF also paints its own up/down chevrons as a background-image on the spin button (--gf-icon-ctrl-number), which
568
+ `appearance: none` leaves in place, so the image, width and box go too (found 2026-10-01). */
569
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="number"]::-webkit-inner-spin-button,
570
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="number"]::-webkit-outer-spin-button {
571
+ appearance: none;
572
+ display: none;
573
+ width: 0;
574
+ margin: 0;
575
+ background-image: none;
576
+ opacity: 0;
577
+ }
578
+
579
+ /* type=file lays its button and "no file chosen" text out as in-flow content, so block padding pushes the
580
+ button past the bottom of a fixed-height box. It keeps the inline padding and drops the block padding;
581
+ align-content on the height rule above does the centring. Again the exclusion is in the padding rule
582
+ itself, because that rule is (0,9,1) and this one is (0,4,1). */
583
+ .gform_wrapper.gform_wrapper.gform_wrapper input[type="file"] {
584
+ padding: 0 var(--bl-input-md-padding-x) 0 calc(var(--bl-input-group-md-padding-x) - 0.3rem); /* start: Input Group's leading-button padding */
585
+ }
586
+
587
+ /* The list field's add/remove buttons as an icon Button, secondary at md. GF sizes them from the variables
588
+ above; the fill has no API hook, so it is set here.
589
+ Four .gform_wrapper on purpose: GF's own rule is
590
+ `.gform-theme--framework.gform-theme.gform_wrapper .gfield:where(...) button.add_list_item`, which is
591
+ (0,5,1) -- the same weight three of them give -- and its stylesheet is enqueued after this one, so the tie
592
+ went to Gravity Forms and the buttons stayed primary-coloured. */
593
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper
594
+ .gfield :is(button.add_list_item, button.delete_list_item) {
595
+ display: inline-flex;
596
+ align-items: center;
597
+ justify-content: center;
598
+ /* 1px literal, as core-button.css does: button/border-width is a Figma-only token and never emits, so
599
+ var(--bl-button-border-width) resolved to nothing and dropped the whole declaration. */
600
+ border: 1px solid transparent;
601
+ background-color: var(--secondary);
602
+ color: var(--secondary-foreground);
603
+ cursor: pointer;
604
+ transition: background-color 150ms, border-color 150ms, box-shadow 150ms;
605
+ }
606
+
607
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper
608
+ .gfield :is(button.add_list_item, button.delete_list_item):is(:focus, :focus-visible) {
609
+ border-color: var(--primary);
610
+ box-shadow: 0 0 0 var(--bl-control-ring-width) var(--ring);
611
+ outline: none;
612
+ }
613
+
614
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper
615
+ .gfield :is(button.add_list_item, button.delete_list_item):hover {
616
+ background-color: color-mix(in oklab, var(--secondary) 80%, transparent);
617
+ }
618
+
619
+ /* The glyph. GF draws it from its own icon font through `content: var(--gf-local-content)`, which is not
620
+ Baseline's icon set; these redraw it as a mask from the active set (src/icons.generated.css), the same way
621
+ the checkbox tick is drawn, so a designer switching sets in Figma moves these too. */
622
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper
623
+ .gfield :is(button.add_list_item, button.delete_list_item)::before {
624
+ /* `color` is set here, not left to inherit from the button: Gravity Forms' own ::before rule sets
625
+ `color: var(--gf-local-color)` DIRECTLY on this pseudo-element, and a declaration that matches the
626
+ element always beats a value inherited from its parent, whatever the specificity. currentColor was
627
+ therefore resolving to --gf-ctrl-btn-icon-color-primary (primary-foreground, white) and the mask came
628
+ out white on the near-white secondary fill. */
629
+ color: var(--secondary-foreground);
630
+ content: "";
631
+ display: block;
632
+ width: var(--bl-button-md-icon-size);
633
+ height: var(--bl-button-md-icon-size);
634
+ background-color: currentColor;
635
+ mask-repeat: no-repeat;
636
+ mask-position: center;
637
+ mask-size: 100% 100%;
638
+ }
639
+
640
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gfield button.add_list_item::before {
641
+ mask-image: var(--bl-icon-plus);
642
+ }
643
+
644
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gfield button.delete_list_item::before {
645
+ mask-image: var(--bl-icon-minus);
646
+ }
647
+
648
+ /* The submit spinner (Spinner spec, 2026-09-30). On submit, Gravity Forms' theme script appends
649
+ <span class="gform-loader" aria-hidden="true"> to the submit button, adds .gform-has-spinner and aria-busy, and
650
+ its framework / 2.5 stylesheets draw that span as a two-colour border ring while the label goes transparent.
651
+ Baseline draws its own Spinner there instead: the active icon set's `loader` glyph (src/icons.generated.css)
652
+ at the button's icon size, turning once a second, slowed rather than stopped under reduced motion. The colour
653
+ is set explicitly, not currentColor, because GF makes the button's text transparent while it spins. Scoped to
654
+ .gform_wrapper, repeated, so it wins over GF's (0,3,0) loader rule on every form theme without !important. */
655
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gform-has-spinner {
656
+ position: relative;
657
+ color: transparent;
658
+ }
659
+
660
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gform-loader {
661
+ position: absolute;
662
+ inset: 0;
663
+ display: block;
664
+ width: var(--bl-button-md-icon-size);
665
+ height: var(--bl-button-md-icon-size);
666
+ margin: auto;
667
+ border: 0;
668
+ border-radius: 0;
669
+ font-size: inherit;
670
+ transform: none;
671
+ background-color: var(--primary-foreground);
672
+ mask-image: var(--bl-icon-loader);
673
+ mask-repeat: no-repeat;
674
+ mask-position: center;
675
+ mask-size: 100% 100%;
676
+ animation: bl-gform-spin 1s linear infinite;
677
+ }
678
+
679
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gform-theme-button--secondary .gform-loader {
680
+ background-color: var(--secondary-foreground);
681
+ }
682
+
683
+ @media (prefers-reduced-motion: reduce) {
684
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gform-loader {
685
+ animation-duration: 3s;
686
+ }
687
+ }
688
+
689
+ @keyframes bl-gform-spin {
690
+ to {
691
+ transform: rotate(360deg);
692
+ }
693
+ }
694
+
695
+ /* The multi-page progress bar is Baseline's Progress (spec: components/progress/spec.md; no WordPress block, user
696
+ decision 2026-09-30). Gravity Forms renders
697
+ div.gf_progressbar_wrapper > p.gf_progressbar_title ("Step 1 of 3" + page name)
698
+ + div.gf_progressbar > div.gf_progressbar_percentage[style=width:N%] > span ("N%")
699
+ and hides the span visually. Baseline's anatomy is label left, value right, track beneath: the title is the label,
700
+ and the span is un-hidden and placed at the title's end as the value (the bar stays aria-hidden, as GF made it;
701
+ the title already says which step this is). Every one of GF's named colours (blue, gray, green, the gradients)
702
+ becomes `primary`: colour is the scheme. A "Custom" colour set in the form editor is an inline style and still
703
+ wins, which is the editor's explicit choice. Five classes beat the 2.5 theme's (0,4,0) colour rules. */
704
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gf_progressbar_wrapper {
705
+ position: relative;
706
+ }
707
+
708
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gf_progressbar_title {
709
+ margin: 0 0 var(--bl-progress-gap);
710
+ padding-inline-end: 4em; /* room for the value */
711
+ color: var(--foreground);
712
+ font-family: var(--bl-font-sans);
713
+ font-size: var(--bl-progress-label-font-size);
714
+ font-weight: var(--bl-progress-label-font-weight);
715
+ line-height: var(--bl-progress-label-line-height);
716
+ }
717
+
718
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gf_progressbar {
719
+ position: static; /* the value is placed against the wrapper, not the track */
720
+ overflow: hidden;
721
+ height: var(--bl-progress-track-height);
722
+ border-radius: var(--bl-progress-track-radius);
723
+ background: var(--muted);
724
+ }
725
+
726
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gf_progressbar .gf_progressbar_percentage {
727
+ height: 100%;
728
+ border-radius: 0; /* the track clips it, as the native bar is clipped */
729
+ background: var(--primary);
730
+ }
731
+
732
+ .gform_wrapper.gform_wrapper.gform_wrapper.gform_wrapper .gf_progressbar .gf_progressbar_percentage span {
733
+ position: absolute;
734
+ top: 0;
735
+ inset-inline-end: 0;
736
+ float: none;
737
+ width: auto;
738
+ min-width: 0;
739
+ height: auto;
740
+ margin: 0;
741
+ overflow: visible;
742
+ clip: auto;
743
+ white-space: nowrap;
744
+ color: var(--muted-foreground);
745
+ font-family: var(--bl-font-sans);
746
+ font-size: var(--bl-progress-value-font-size);
747
+ line-height: var(--bl-progress-value-line-height);
748
+ font-variant-numeric: tabular-nums;
749
+ text-shadow: none;
750
+ }
751
+
752
+ /* Phone (international format): GF renders a country selector button and the number input side by side, each with its
753
+ own sub-label. Baseline draws them as one group, the way ButtonGroup joins a button and an input (spec:
754
+ components/button-group/spec.md): the selector is an outline button on Input's box (same height, border and radius,
755
+ start corners only); the input loses its start border and corners, so the two share one seam. GF's own country list
756
+ stays as it is. These rules carry the same `:is(#bl-gform, .gform_wrapper)` lift as the variable blocks: our own
757
+ control rule above (`.gform_wrapper×3 :is(input:not(...)×5, select)`) is (0,8,1), because :is() takes its strongest
758
+ argument, and it would otherwise win the input's border and corners back. */
759
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-selector {
760
+ display: inline-flex;
761
+ align-items: center;
762
+ gap: var(--bl-input-md-gap);
763
+ height: var(--bl-input-md-height);
764
+ padding: 0 var(--bl-input-md-padding-x);
765
+ border: var(--bl-input-md-border-width) solid var(--input);
766
+ border-start-start-radius: var(--bl-input-md-radius);
767
+ border-end-start-radius: var(--bl-input-md-radius);
768
+ border-start-end-radius: 0;
769
+ border-end-end-radius: 0;
770
+ background-color: transparent;
771
+ box-shadow: none;
772
+ color: var(--foreground);
773
+ font-size: var(--bl-input-md-font-size);
774
+ line-height: var(--bl-input-md-line-height);
775
+ }
776
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-selector:hover,
777
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-selector[aria-expanded="true"] {
778
+ background-color: var(--muted);
779
+ }
780
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-selector:focus-visible {
781
+ position: relative;
782
+ z-index: 1;
783
+ outline: none;
784
+ border-color: var(--ring);
785
+ box-shadow: 0 0 0 var(--bl-control-ring-width) var(--ring);
786
+ }
787
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__input {
788
+ border-inline-start-width: 0;
789
+ border-start-start-radius: 0;
790
+ border-end-start-radius: 0;
791
+ }
792
+
793
+ /* The phone field's country list is GF's own listbox: Baseline styles it as the Select panel (spec:
794
+ components/select/spec.md; React's SelectContent / SelectItem), though Select itself is not a WordPress component
795
+ (only Native select is). GF fills it with --gf-ctrl-bg-color, which Baseline sets transparent for controls, so it
796
+ had no background at all (found 2026-10-01). The shadow is Tailwind's shadow-md, the value React's panel uses. */
797
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__dropdown {
798
+ padding: var(--bl-select-panel-padding);
799
+ border: var(--bl-select-panel-border-width) solid var(--border);
800
+ border-radius: var(--bl-select-panel-radius);
801
+ background-color: var(--popover);
802
+ color: var(--popover-foreground);
803
+ box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
804
+ }
805
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__search-wrapper {
806
+ margin: 0 0 var(--bl-select-panel-padding);
807
+ padding: 0;
808
+ background-color: transparent;
809
+ }
810
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-list {
811
+ padding: 0;
812
+ }
813
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-item {
814
+ position: relative;
815
+ display: flex;
816
+ align-items: center;
817
+ gap: var(--bl-select-item-gap);
818
+ padding-block: var(--bl-select-item-padding-y);
819
+ padding-inline: var(--bl-select-item-padding-x) calc(var(--bl-select-item-padding-x) + var(--bl-select-item-icon-size) + var(--bl-select-item-gap));
820
+ border-radius: var(--bl-select-item-radius);
821
+ color: var(--popover-foreground);
822
+ font-size: var(--bl-select-item-font-size);
823
+ line-height: var(--bl-select-item-line-height);
824
+ cursor: default;
825
+ }
826
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-item:hover,
827
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-item--focused {
828
+ background-color: var(--accent);
829
+ color: var(--accent-foreground);
830
+ }
831
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-item--active {
832
+ box-shadow: none;
833
+ }
834
+ /* the selected country gets Select's check at the inline end */
835
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-item--active::after {
836
+ content: "";
837
+ position: absolute;
838
+ inset-inline-end: var(--bl-select-item-padding-x);
839
+ width: var(--bl-select-item-icon-size);
840
+ height: var(--bl-select-item-icon-size);
841
+ background-color: currentColor;
842
+ mask-image: var(--bl-icon-check);
843
+ mask-repeat: no-repeat;
844
+ mask-position: center;
845
+ mask-size: 100% 100%;
846
+ }
847
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__country-code {
848
+ margin-inline-start: auto;
849
+ color: var(--muted-foreground);
850
+ }
851
+ /* GF draws a magnifier in the search field as a background image at its own padding; Baseline's input padding put the
852
+ placeholder on top of it. The icon sits at the input's padding, the text after it, as Input Group's leading addon. */
853
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gform-phone__search-wrapper input.gform-phone__search {
854
+ padding-inline-start: calc(var(--bl-input-md-padding-x) + var(--bl-control-addon-icon-size) + var(--bl-control-addon-gap));
855
+ background-position: var(--bl-input-md-padding-x) center;
856
+ background-size: var(--bl-control-addon-icon-size) var(--bl-control-addon-icon-size);
857
+ }
858
+
859
+ /* Image Select (GF's image_choice field, "card" appearance) is Baseline's option card (user decision 2026-10-01;
860
+ spec: components/field/spec.md): React's FieldLabel wrapping a Field, the field/option-card/* tokens. The whole choice
861
+ is the click target; border, radius and the selected tint (primary at 5 % / 30 %, on :has(:checked)) are the option
862
+ card's; hover fills muted at 50 %; keyboard focus rings the card. The image runs full bleed across the top as Card's
863
+ media does (Square style; a Circle image stays round and inset). GF's shadow and its check badge (::after, which
864
+ repeats the radio or checkbox) go. The "no card" appearance, an image with nothing around it, stays GF's. */
865
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gchoice {
866
+ overflow: hidden;
867
+ border: var(--bl-field-option-card-border-width) solid var(--border);
868
+ border-radius: var(--bl-field-option-card-radius);
869
+ background-color: transparent;
870
+ box-shadow: none;
871
+ transition: background-color 150ms, border-color 150ms, box-shadow 150ms;
872
+ }
873
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gchoice:not(:has(:disabled)):hover {
874
+ background-color: color-mix(in oklab, var(--muted) 50%, transparent);
875
+ }
876
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gchoice:has(:checked) {
877
+ border-color: var(--bl-field-option-card-border-selected);
878
+ background-color: var(--bl-field-option-card-background-selected);
879
+ }
880
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gchoice:has(:focus-visible) {
881
+ border-color: var(--ring);
882
+ box-shadow: 0 0 0 var(--bl-control-ring-width) var(--ring);
883
+ }
884
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card.gfield_error .gchoice {
885
+ border-color: var(--destructive);
886
+ }
887
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gchoice::after {
888
+ display: none;
889
+ }
890
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gfield-image-choice-wrapper-outer {
891
+ padding: 0;
892
+ }
893
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card.gfield--image-choice-style-square .gfield-choice-image-wrapper {
894
+ border-radius: 0;
895
+ }
896
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card.gfield--image-choice-style-circle .gfield-image-choice-wrapper-outer {
897
+ padding: var(--bl-field-option-card-padding) var(--bl-field-option-card-padding) 0;
898
+ }
899
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gfield-image-choice-wrapper-inner {
900
+ padding: var(--bl-field-option-card-padding);
901
+ column-gap: var(--bl-field-option-card-column-gap);
902
+ }
903
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gchoice .gform-field-label {
904
+ margin: 0; /* GF's own inline margin doubled the gap: the option card's column gap is the space */
905
+ color: var(--foreground);
906
+ }
907
+ /* the image fills its frame edge to edge: GF's Square frame letterboxed a landscape photo, and typeset's prose image
908
+ rule (the form sits in post content) rounded it inside the card */
909
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card .gfield-choice-image-wrapper {
910
+ margin: 0;
911
+ }
912
+ .gform_wrapper.gform_wrapper.gform_wrapper:is(#bl-gform, .gform_wrapper) .gfield--image-choice-appearance-card.gfield--image-choice-style-square .gfield-choice-image {
913
+ display: block;
914
+ width: 100%;
915
+ height: 100%;
916
+ margin: 0;
917
+ border-radius: 0;
918
+ object-fit: cover;
919
+ }