@inneranimalmedia/agentsam-sdk 2.6.11 → 2.6.12

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 (411) hide show
  1. package/apps/cad-creator/shared/cad/package.json +1 -1
  2. package/apps/client-cms-editor/backend/package.json +2 -2
  3. package/apps/client-cms-editor/frontend/package.json +3 -3
  4. package/apps/client-cms-editor/frontend/src/adapters/http-authoring.test.ts +161 -0
  5. package/apps/client-cms-editor/frontend/src/adapters/http.ts +296 -65
  6. package/apps/client-cms-editor/frontend/src/editor/CmsEditor.tsx +47 -16
  7. package/apps/client-cms-editor/frontend/src/editor/composition-groups.test.ts +40 -0
  8. package/apps/client-cms-editor/frontend/src/editor/legacy/CmsEditorPrototype.tsx +28 -28
  9. package/apps/client-cms-editor/frontend/src/editor/useCmsEditorController.ts +3 -3
  10. package/apps/client-cms-editor/frontend/src/styles/agentsam-drawer.css +5 -4
  11. package/apps/client-cms-editor/frontend/src/styles/studio.css +150 -149
  12. package/apps/client-cms-editor/package.json +1 -1
  13. package/apps/client-cms-editor/reference/harvest/plans/INNERANIMALS-CONTENT-001.md +1 -1
  14. package/apps/client-cms-editor/shared/cms/package.json +1 -1
  15. package/apps/client-cms-editor/shared/cms/src/editor-types.ts +42 -1
  16. package/docs/CMS_CONTEXTUAL_COMPOSER.md +4 -4
  17. package/docs/PRODUCT_LIFECYCLE.md +38 -38
  18. package/docs/REPO_FILE_MAP.txt +2 -2
  19. package/docs/THEME_REFINERY.md +6 -6
  20. package/docs/WINDOWS_RUNTIME_INSTALL.md +1 -1
  21. package/docs/adr/ADR-0002-brand-campaign-plugin-boundaries.md +603 -0
  22. package/docs/adr/ADR-0003-copro-clean-room-product-architecture.md +34 -0
  23. package/docs/adr/ADR-0003-product-portfolio-and-package-taxonomy.md +146 -0
  24. package/docs/adr/ADR-0004-product-composition-and-provider-neutrality.md +56 -0
  25. package/docs/adr/ADR-0005-offer-graduation-standard.md +66 -0
  26. package/docs/adr/README.md +25 -0
  27. package/docs/architecture/AGENTSAM_APPLICATION_CONTRACT.md +1 -1
  28. package/docs/architecture/DUAL_ANALYTICS_PRODUCT.md +1 -1
  29. package/docs/content-studio/HOST_MOUNT_CHECKLIST.md +1 -1
  30. package/docs/content-studio/REVISION_GATE_2026-09-27.md +3 -3
  31. package/docs/contracts/google-cloud-oauth-setup.md +1 -1
  32. package/docs/local-studio/WORKMODE_DONOR_NOTES.md +3 -3
  33. package/docs/plans/ASTRA-BRIEF-2026-09-18.md +1 -1
  34. package/docs/plans/LOCAL-STUDIO-REAL-APP-CONTRACT-ADDENDUM-2026-09-27.md +2 -2
  35. package/docs/plans/MACHINE-FIRST-APPS-TUI-2026-09-24.md +1 -1
  36. package/docs/plans/NEXT-AGENT-HANDOFF.md +2 -2
  37. package/docs/plans/TOMORROW-EXTENSIVE-TODO-2026-09-26.md +68 -68
  38. package/docs/plans/TOMORROW-MACHINE-FIRST-BRIEFING.md +1 -1
  39. package/docs/plans/UNIVERSAL-INGEST-MACHINE-FIRST-2026-09-24.md +1 -1
  40. package/docs/prd/PRD-agentsam-analytics.md +174 -0
  41. package/docs/prd/PRD-agentsam-brand.md +181 -0
  42. package/docs/prd/PRD-agentsam-browser.md +177 -0
  43. package/docs/prd/PRD-agentsam-cad-studio.md +177 -0
  44. package/docs/prd/PRD-agentsam-campaign.md +1178 -0
  45. package/docs/prd/PRD-agentsam-commerce-studio.md +180 -0
  46. package/docs/prd/PRD-agentsam-content-studio.md +179 -0
  47. package/docs/prd/PRD-agentsam-copro.md +39 -0
  48. package/docs/prd/PRD-agentsam-database-studio.md +175 -0
  49. package/docs/prd/PRD-agentsam-developer-studio.md +175 -0
  50. package/docs/prd/PRD-agentsam-hosted-runtime.md +180 -0
  51. package/docs/prd/PRD-agentsam-knowledge.md +174 -0
  52. package/docs/prd/PRD-agentsam-local-studio.md +180 -0
  53. package/docs/prd/PRD-agentsam-merch.md +177 -0
  54. package/docs/prd/PRD-agentsam-platform.md +179 -0
  55. package/docs/prd/PRD-agentsam-site-studio.md +180 -0
  56. package/docs/prd/PRD-agentsam-work.md +180 -0
  57. package/docs/prd/README.md +39 -0
  58. package/docs/product/COPRO-DONOR-AUDIT.md +9 -0
  59. package/docs/product/COPRO-EXECUTION-PLAN.md +81 -0
  60. package/docs/product/COPRO-UI-QUALITY-GATE.md +119 -0
  61. package/docs/product/OFFER-PORTFOLIO.md +158 -0
  62. package/docs/product/PACKAGE-TAXONOMY.md +78 -0
  63. package/examples/hyperspace-demo/dist/assets/index-SZ2LfOpJ.js +242 -0
  64. package/examples/hyperspace-demo/dist/index.html +13 -0
  65. package/native/agentsam-machine/core/src/lib.rs +2 -2
  66. package/package.json +55 -35
  67. package/packages/agentsam-brand/package.json +3 -2
  68. package/packages/agentsam-brand/src/public.js +192 -0
  69. package/packages/agentsam-contracts/README.md +1 -1
  70. package/packages/agentsam-contracts/package.json +1 -1
  71. package/packages/agentsam-errors/package.json +1 -1
  72. package/packages/agentsam-goap/package.json +2 -2
  73. package/packages/agentsam-hooks/package.json +1 -1
  74. package/packages/agentsam-knowledge/package.json +1 -1
  75. package/packages/agentsam-merch/package.json +1 -1
  76. package/packages/agentsam-merch/test/merch.test.mjs +1 -1
  77. package/packages/agentsam-nav/dist/browser.global.js +34 -71
  78. package/packages/agentsam-nav/dist/browser.js +759 -3157
  79. package/packages/agentsam-nav/dist/index.js +751 -3149
  80. package/packages/agentsam-nav/package.json +1 -1
  81. package/packages/agentsam-queue-control/package.json +1 -1
  82. package/packages/agentsam-repository/package.json +1 -1
  83. package/packages/agentsam-repository/src/goap.js.bak-20260922011251 +670 -0
  84. package/packages/agentsam-vault/package.json +1 -1
  85. package/packages/agentsam-workbench/package.json +5 -4
  86. package/packages/agentsam-workbench/src/agent/MiniAgentSam.tsx +28 -4
  87. package/packages/agentsam-workbench/src/agent/contextual-composer.css +72 -70
  88. package/packages/agentsam-workbench/src/agent/mini-agentsam.css +228 -10
  89. package/packages/connectors/cfoa/package.json +1 -1
  90. package/packages/heuristic-theme/package.json +1 -1
  91. package/packages/identity/package.json +1 -1
  92. package/packages/identity/src/frontend/auth-portal/pages/login.html +1 -1
  93. package/packages/identity/src/frontend/auth-portal/pages/reset.html +1 -1
  94. package/packages/identity/src/frontend/auth-portal/pages/signup.html +1 -1
  95. package/packages/identity/tests/chatgpt-provider.test.mjs +3 -3
  96. package/packages/identity/tests/oauth-consent-view.test.mjs +11 -11
  97. package/packages/providers/completeful/README.md +3 -3
  98. package/packages/providers/completeful/package.json +1 -1
  99. package/packages/theme-cypress/README.md +11 -0
  100. package/packages/{theme-church-site → theme-cypress}/package.json +14 -11
  101. package/packages/theme-cypress/prebuild.json +23 -0
  102. package/packages/theme-cypress/site/assets/generated/favicon.svg +7 -0
  103. package/packages/theme-cypress/site/assets/generated/media-044ba16613.webp +0 -0
  104. package/packages/theme-cypress/site/assets/generated/media-0a1ea6f6d9.webp +0 -0
  105. package/packages/theme-cypress/site/assets/generated/media-0c06778307.webp +0 -0
  106. package/packages/theme-cypress/site/assets/generated/media-1539ed373a.webp +0 -0
  107. package/packages/theme-cypress/site/assets/generated/media-2df479fd2d.webp +0 -0
  108. package/packages/theme-cypress/site/assets/generated/media-2e8bd0d9bc.webp +0 -0
  109. package/packages/theme-cypress/site/assets/generated/media-41d4e2643c.webp +0 -0
  110. package/packages/theme-cypress/site/assets/generated/media-46205bfde8.webp +0 -0
  111. package/packages/theme-cypress/site/assets/generated/media-50c5f3e279.webp +0 -0
  112. package/packages/theme-cypress/site/assets/generated/media-5f1467778c.webp +0 -0
  113. package/packages/theme-cypress/site/assets/generated/media-6703642b22.webp +0 -0
  114. package/packages/theme-cypress/site/assets/generated/media-87a490bc8e.webp +0 -0
  115. package/packages/theme-cypress/site/assets/generated/media-997c10ef39.webp +0 -0
  116. package/packages/theme-cypress/site/assets/generated/media-a423735c21.webp +0 -0
  117. package/packages/theme-cypress/site/assets/generated/media-c9cea5245b.webp +0 -0
  118. package/packages/theme-cypress/site/assets/generated/media-cab3c84c60.webp +0 -0
  119. package/packages/theme-cypress/site/assets/generated/media-ce06595d59.webp +0 -0
  120. package/packages/theme-cypress/site/assets/generated/media-d268905e7e.webp +0 -0
  121. package/packages/theme-cypress/site/assets/generated/media-f6711b5053.webp +0 -0
  122. package/packages/theme-cypress/site/assets/generated/media-manifest.json +226 -0
  123. package/packages/theme-cypress/site/assets/generated/social-card.webp +0 -0
  124. package/packages/theme-cypress/site/assets/generated/theme-mark-192.png +0 -0
  125. package/packages/theme-cypress/site/assets/generated/theme-mark-512.png +0 -0
  126. package/packages/theme-cypress/site/assets/generated/theme-mark.svg +7 -0
  127. package/packages/theme-cypress/site/beliefs.html +175 -0
  128. package/packages/theme-cypress/site/community.html +175 -0
  129. package/packages/theme-cypress/site/connect.html +319 -0
  130. package/packages/theme-cypress/site/donate.html +106 -0
  131. package/packages/theme-cypress/site/groups.html +1352 -0
  132. package/packages/theme-cypress/site/help.html +1 -0
  133. package/packages/theme-cypress/site/icons/clock.svg +4 -0
  134. package/packages/theme-cypress/site/icons/email.svg +4 -0
  135. package/packages/theme-cypress/site/icons/giving.svg +4 -0
  136. package/packages/theme-cypress/site/icons/home.svg +4 -0
  137. package/packages/theme-cypress/site/icons/location.svg +4 -0
  138. package/packages/theme-cypress/site/icons/media.svg +4 -0
  139. package/packages/theme-cypress/site/icons/ministries.svg +6 -0
  140. package/packages/theme-cypress/site/icons/prayer.svg +5 -0
  141. package/packages/theme-cypress/site/icons/visit.svg +6 -0
  142. package/packages/theme-cypress/site/index.html +1013 -0
  143. package/packages/theme-cypress/site/mensgroup.html +477 -0
  144. package/packages/theme-cypress/site/mission.html +512 -0
  145. package/packages/theme-cypress/site/unified-footer.css +172 -0
  146. package/packages/theme-cypress/site/unified-footer.js +175 -0
  147. package/packages/theme-cypress/site/unified-header.css +226 -0
  148. package/packages/theme-cypress/site/unified-header.js +111 -0
  149. package/packages/theme-cypress/site/womansgroup.html +452 -0
  150. package/packages/{theme-church-site → theme-cypress}/src/index.js +22 -35
  151. package/packages/theme-cypress/src/node.js +69 -0
  152. package/packages/theme-cypress/test/theme.test.mjs +47 -0
  153. package/packages/theme-ember/README.md +11 -0
  154. package/packages/{theme-fuelnfree-site → theme-ember}/package.json +14 -11
  155. package/packages/theme-ember/prebuild.json +23 -0
  156. package/packages/theme-ember/site/about.html +1840 -0
  157. package/packages/theme-ember/site/assets/generated/favicon.svg +7 -0
  158. package/packages/theme-ember/site/assets/generated/media-1e0b1e6ee6.webp +0 -0
  159. package/packages/theme-ember/site/assets/generated/media-2371dcb426.webp +0 -0
  160. package/packages/theme-ember/site/assets/generated/media-2db4f5ff9e.webp +0 -0
  161. package/packages/theme-ember/site/assets/generated/media-4ed07a756e.webp +0 -0
  162. package/packages/theme-ember/site/assets/generated/media-58182cf167.webp +0 -0
  163. package/packages/theme-ember/site/assets/generated/media-5b8b8472ae.webp +0 -0
  164. package/packages/theme-ember/site/assets/generated/media-71f4bd16a1.webp +0 -0
  165. package/packages/theme-ember/site/assets/generated/media-7c1c8120bc.webp +0 -0
  166. package/packages/theme-ember/site/assets/generated/media-832b176433.webp +0 -0
  167. package/packages/theme-ember/site/assets/generated/media-931439701c.webp +0 -0
  168. package/packages/theme-ember/site/assets/generated/media-c2860d40d1.webp +0 -0
  169. package/packages/theme-ember/site/assets/generated/media-c56974d198.webp +0 -0
  170. package/packages/theme-ember/site/assets/generated/media-cb83a44ff4.webp +0 -0
  171. package/packages/theme-ember/site/assets/generated/media-df02ccdfcf.webp +0 -0
  172. package/packages/theme-ember/site/assets/generated/media-fab72cd344.webp +0 -0
  173. package/packages/theme-ember/site/assets/generated/media-manifest.json +190 -0
  174. package/packages/theme-ember/site/assets/generated/social-card.webp +0 -0
  175. package/packages/theme-ember/site/assets/generated/theme-mark-192.png +0 -0
  176. package/packages/theme-ember/site/assets/generated/theme-mark-512.png +0 -0
  177. package/packages/theme-ember/site/assets/generated/theme-mark.svg +7 -0
  178. package/packages/theme-ember/site/community.html +1664 -0
  179. package/packages/theme-ember/site/index.html +2044 -0
  180. package/packages/theme-ember/site/shop.html +2104 -0
  181. package/packages/{theme-fuelnfree-site → theme-ember}/src/index.js +23 -33
  182. package/packages/theme-ember/src/node.js +69 -0
  183. package/packages/theme-ember/test/theme.test.mjs +47 -0
  184. package/packages/theme-forge/README.md +11 -0
  185. package/packages/theme-forge/package.json +44 -0
  186. package/packages/theme-forge/prebuild.json +23 -0
  187. package/packages/theme-forge/site/apple-touch-icon.png +0 -0
  188. package/packages/theme-forge/site/assets/generated/favicon.svg +7 -0
  189. package/packages/theme-forge/site/assets/generated/media-manifest.json +17 -0
  190. package/packages/theme-forge/site/assets/generated/social-card.webp +0 -0
  191. package/packages/theme-forge/site/assets/generated/theme-mark-192.png +0 -0
  192. package/packages/theme-forge/site/assets/generated/theme-mark-512.png +0 -0
  193. package/packages/theme-forge/site/assets/generated/theme-mark.svg +7 -0
  194. package/packages/theme-forge/site/assets/index-DBOqQVsA.css +1 -0
  195. package/packages/theme-forge/site/assets/index-pXC0o9jp.js +241 -0
  196. package/packages/theme-forge/site/assets/workbox-window.prod.es5-Bd17z0YL.js +2 -0
  197. package/packages/theme-forge/site/index.html +5 -0
  198. package/packages/theme-forge/site/manifest.webmanifest +1 -0
  199. package/packages/theme-forge/site/pwa-192x192.png +0 -0
  200. package/packages/theme-forge/site/pwa-512x512.png +0 -0
  201. package/packages/theme-forge/site/sw.js +107 -0
  202. package/packages/theme-forge/site/workbox-7e5eb42b.js +3395 -0
  203. package/packages/theme-forge/src/index.js +76 -0
  204. package/packages/theme-forge/src/node.js +69 -0
  205. package/packages/theme-forge/test/theme.test.mjs +47 -0
  206. package/packages/theme-grove/README.md +11 -0
  207. package/packages/{theme-floors-site → theme-grove}/package.json +14 -11
  208. package/packages/theme-grove/prebuild.json +23 -0
  209. package/packages/theme-grove/site/assets/generated/favicon.svg +7 -0
  210. package/packages/theme-grove/site/assets/generated/media-098b13d75a.webp +0 -0
  211. package/packages/theme-grove/site/assets/generated/media-0c064db1aa.webp +0 -0
  212. package/packages/theme-grove/site/assets/generated/media-0fbfef655e.webp +0 -0
  213. package/packages/theme-grove/site/assets/generated/media-14759c7460.webp +0 -0
  214. package/packages/theme-grove/site/assets/generated/media-19b23d2a8f.webp +0 -0
  215. package/packages/theme-grove/site/assets/generated/media-2012f04243.webp +0 -0
  216. package/packages/theme-grove/site/assets/generated/media-23b8c5e2bb.webp +0 -0
  217. package/packages/theme-grove/site/assets/generated/media-2bffb1a6ef.webp +0 -0
  218. package/packages/theme-grove/site/assets/generated/media-2e1523a5b0.webp +0 -0
  219. package/packages/theme-grove/site/assets/generated/media-31107c21f2.webp +0 -0
  220. package/packages/theme-grove/site/assets/generated/media-31373ec865.webp +0 -0
  221. package/packages/theme-grove/site/assets/generated/media-45e8e27542.webp +0 -0
  222. package/packages/theme-grove/site/assets/generated/media-4aa9846fe7.webp +0 -0
  223. package/packages/theme-grove/site/assets/generated/media-5476b24219.webp +0 -0
  224. package/packages/theme-grove/site/assets/generated/media-7a227d3e4b.webp +0 -0
  225. package/packages/theme-grove/site/assets/generated/media-b183eed550.webp +0 -0
  226. package/packages/theme-grove/site/assets/generated/media-b2c650f9ab.webp +0 -0
  227. package/packages/theme-grove/site/assets/generated/media-b5d7471694.webp +0 -0
  228. package/packages/theme-grove/site/assets/generated/media-c86498fdb4.webp +0 -0
  229. package/packages/theme-grove/site/assets/generated/media-ce2cfff9a1.webp +0 -0
  230. package/packages/theme-grove/site/assets/generated/media-cf41a5f324.webp +0 -0
  231. package/packages/theme-grove/site/assets/generated/media-ec6c01bf8d.webp +0 -0
  232. package/packages/theme-grove/site/assets/generated/media-manifest.json +267 -0
  233. package/packages/theme-grove/site/assets/generated/social-card.webp +0 -0
  234. package/packages/theme-grove/site/assets/generated/theme-mark-192.png +0 -0
  235. package/packages/theme-grove/site/assets/generated/theme-mark-512.png +0 -0
  236. package/packages/theme-grove/site/assets/generated/theme-mark.svg +7 -0
  237. package/packages/theme-grove/site/index.html +1429 -0
  238. package/packages/theme-grove/site/pages/contact.html +664 -0
  239. package/packages/theme-grove/site/pages/gallery.html +216 -0
  240. package/packages/theme-grove/site/pages/privacy.html +180 -0
  241. package/packages/theme-grove/site/pages/process.html +592 -0
  242. package/packages/theme-grove/site/pages/services.html +567 -0
  243. package/packages/theme-grove/site/pages/terms.html +189 -0
  244. package/packages/theme-grove/site/shared/footer.css +140 -0
  245. package/packages/theme-grove/site/shared/footer.html +41 -0
  246. package/packages/{theme-floors-site → theme-grove}/src/index.js +24 -35
  247. package/packages/theme-grove/src/node.js +69 -0
  248. package/packages/theme-grove/test/theme.test.mjs +47 -0
  249. package/packages/theme-harbor/README.md +11 -0
  250. package/packages/{theme-insurance-site → theme-harbor}/package.json +14 -11
  251. package/packages/theme-harbor/prebuild.json +23 -0
  252. package/packages/theme-harbor/site/assets/generated/favicon.svg +7 -0
  253. package/packages/theme-harbor/site/assets/generated/media-manifest.json +17 -0
  254. package/packages/theme-harbor/site/assets/generated/social-card.webp +0 -0
  255. package/packages/theme-harbor/site/assets/generated/theme-mark-192.png +0 -0
  256. package/packages/theme-harbor/site/assets/generated/theme-mark-512.png +0 -0
  257. package/packages/theme-harbor/site/assets/generated/theme-mark.svg +7 -0
  258. package/packages/theme-harbor/site/assets/index-D58RKkr-.js +239 -0
  259. package/packages/theme-harbor/site/assets/index-Dd3YN9Mf.css +1 -0
  260. package/packages/theme-harbor/site/index.html +15 -0
  261. package/packages/theme-harbor/src/index.js +76 -0
  262. package/packages/theme-harbor/src/node.js +69 -0
  263. package/packages/theme-harbor/test/theme.test.mjs +47 -0
  264. package/packages/theme-resolve/README.md +11 -0
  265. package/packages/theme-resolve/package.json +44 -0
  266. package/packages/theme-resolve/prebuild.json +23 -0
  267. package/packages/theme-resolve/site/assets/generated/favicon.svg +7 -0
  268. package/packages/theme-resolve/site/assets/generated/media-216610d365.webp +0 -0
  269. package/packages/theme-resolve/site/assets/generated/media-2a9e0f623f.webp +0 -0
  270. package/packages/theme-resolve/site/assets/generated/media-a70660bfa9.webp +0 -0
  271. package/packages/theme-resolve/site/assets/generated/media-bc1322e813.webp +0 -0
  272. package/packages/theme-resolve/site/assets/generated/media-ced60fcecc.webp +0 -0
  273. package/packages/theme-resolve/site/assets/generated/media-manifest.json +72 -0
  274. package/packages/theme-resolve/site/assets/generated/social-card.webp +0 -0
  275. package/packages/theme-resolve/site/assets/generated/theme-mark-192.png +0 -0
  276. package/packages/theme-resolve/site/assets/generated/theme-mark-512.png +0 -0
  277. package/packages/theme-resolve/site/assets/generated/theme-mark.svg +7 -0
  278. package/packages/theme-resolve/site/assets/index-BSaLpPG1.css +2 -0
  279. package/packages/theme-resolve/site/assets/index-D8au46Z5.js +17 -0
  280. package/packages/theme-resolve/site/index.html +22 -0
  281. package/packages/theme-resolve/src/index.js +69 -0
  282. package/packages/theme-resolve/src/node.js +69 -0
  283. package/packages/theme-resolve/test/theme.test.mjs +47 -0
  284. package/packages/theme-scenes/package.json +1 -1
  285. package/packages/theme-scenes/src/registry.js +32 -49
  286. package/packages/theme-summit/README.md +11 -0
  287. package/packages/{theme-shinshu-site → theme-summit}/package.json +14 -11
  288. package/packages/theme-summit/prebuild.json +23 -0
  289. package/packages/theme-summit/site/adventures.html +450 -0
  290. package/packages/theme-summit/site/assets/generated/favicon.svg +7 -0
  291. package/packages/theme-summit/site/assets/generated/media-1e958ea679.webp +0 -0
  292. package/packages/theme-summit/site/assets/generated/media-9d4521abba.webp +0 -0
  293. package/packages/theme-summit/site/assets/generated/media-manifest.json +39 -0
  294. package/packages/theme-summit/site/assets/generated/social-card.webp +0 -0
  295. package/packages/theme-summit/site/assets/generated/theme-mark-192.png +0 -0
  296. package/packages/theme-summit/site/assets/generated/theme-mark-512.png +0 -0
  297. package/packages/theme-summit/site/assets/generated/theme-mark.svg +7 -0
  298. package/packages/theme-summit/site/business-card.html +315 -0
  299. package/packages/theme-summit/site/chatbot.js +312 -0
  300. package/packages/theme-summit/site/gallery.html +524 -0
  301. package/packages/theme-summit/site/i18n.js +947 -0
  302. package/packages/theme-summit/site/icons.svg +87 -0
  303. package/packages/theme-summit/site/index.html +2415 -0
  304. package/packages/theme-summit/site/pages/about.html +100 -0
  305. package/packages/theme-summit/site/pages/contact.html +117 -0
  306. package/packages/theme-summit/site/pages/dashboard.html +111 -0
  307. package/packages/theme-summit/site/pages/index.html +129 -0
  308. package/packages/theme-summit/site/pages/services.html +125 -0
  309. package/packages/theme-summit/site/shared/footer.html +41 -0
  310. package/packages/theme-summit/site/shared/layout.js +315 -0
  311. package/packages/theme-summit/site/shared/nav.html +19 -0
  312. package/packages/theme-summit/site/shared/styles.css +696 -0
  313. package/packages/theme-summit/site/theme-styles.css +131 -0
  314. package/packages/theme-summit/site/themes.js +442 -0
  315. package/packages/{theme-shinshu-site → theme-summit}/src/index.js +23 -35
  316. package/packages/theme-summit/src/node.js +69 -0
  317. package/packages/theme-summit/test/theme.test.mjs +47 -0
  318. package/packages/theme-violet/README.md +11 -0
  319. package/packages/{theme-companions-site → theme-violet}/package.json +14 -11
  320. package/packages/theme-violet/prebuild.json +23 -0
  321. package/packages/theme-violet/site/assets/generated/favicon.svg +7 -0
  322. package/packages/theme-violet/site/assets/generated/media-07b46d6457.webp +0 -0
  323. package/packages/theme-violet/site/assets/generated/media-09d38ddffc.webp +0 -0
  324. package/packages/theme-violet/site/assets/generated/media-254b0e2ad3.webp +0 -0
  325. package/packages/theme-violet/site/assets/generated/media-3a1b5c0a8d.webp +0 -0
  326. package/packages/theme-violet/site/assets/generated/media-3a78eb7d9d.webp +0 -0
  327. package/packages/theme-violet/site/assets/generated/media-49076977d8.webp +0 -0
  328. package/packages/theme-violet/site/assets/generated/media-6342d50dbd.webp +0 -0
  329. package/packages/theme-violet/site/assets/generated/media-646c65381e.webp +0 -0
  330. package/packages/theme-violet/site/assets/generated/media-7a5fb7c91a.webp +0 -0
  331. package/packages/theme-violet/site/assets/generated/media-9bbd133220.webp +0 -0
  332. package/packages/theme-violet/site/assets/generated/media-9e73307c2a.webp +0 -0
  333. package/packages/theme-violet/site/assets/generated/media-af382146a0.webp +0 -0
  334. package/packages/theme-violet/site/assets/generated/media-b2ae348b43.webp +0 -0
  335. package/packages/theme-violet/site/assets/generated/media-b8f43a3887.webp +0 -0
  336. package/packages/theme-violet/site/assets/generated/media-c96a3e1979.webp +0 -0
  337. package/packages/theme-violet/site/assets/generated/media-cd07daa54a.webp +0 -0
  338. package/packages/theme-violet/site/assets/generated/media-e03ab6b5fe.webp +0 -0
  339. package/packages/theme-violet/site/assets/generated/media-eae4917d25.webp +0 -0
  340. package/packages/theme-violet/site/assets/generated/media-f227ec5690.webp +0 -0
  341. package/packages/theme-violet/site/assets/generated/media-fb57ffd474.webp +0 -0
  342. package/packages/theme-violet/site/assets/generated/media-manifest.json +245 -0
  343. package/packages/theme-violet/site/assets/generated/social-card.webp +0 -0
  344. package/packages/theme-violet/site/assets/generated/theme-mark-192.png +0 -0
  345. package/packages/theme-violet/site/assets/generated/theme-mark-512.png +0 -0
  346. package/packages/theme-violet/site/assets/generated/theme-mark.svg +7 -0
  347. package/packages/theme-violet/site/global/cpas-contact.css +405 -0
  348. package/packages/theme-violet/site/global/cpas-donate-v2.css +931 -0
  349. package/packages/theme-violet/site/global/cpas-drawer-override.css +1 -0
  350. package/packages/theme-violet/site/global/cpas-footer.html +38 -0
  351. package/packages/theme-violet/site/global/cpas-header.html +30 -0
  352. package/packages/theme-violet/site/global/cpas-hero-watercolor.css +275 -0
  353. package/packages/theme-violet/site/global/cpas-modals.js +802 -0
  354. package/packages/theme-violet/site/global/cpas-public-surface.css +982 -0
  355. package/packages/theme-violet/site/global/cpas-shell.css +3980 -0
  356. package/packages/theme-violet/site/global/cpas-shell.js +107 -0
  357. package/packages/theme-violet/site/global/cpas-shelter-hub.css +326 -0
  358. package/packages/theme-violet/site/index.html +141 -0
  359. package/packages/theme-violet/site/pages/about/campaigns.html +28 -0
  360. package/packages/theme-violet/site/pages/about/cta.html +25 -0
  361. package/packages/theme-violet/site/pages/about/hero.html +46 -0
  362. package/packages/theme-violet/site/pages/about/paths.html +24 -0
  363. package/packages/theme-violet/site/pages/about/why_we_exist.html +28 -0
  364. package/packages/theme-violet/site/pages/home/campaigns.html +67 -0
  365. package/packages/theme-violet/site/pages/home/hero.html +42 -0
  366. package/packages/theme-violet/site/pages/home/how-it-helps.html +32 -0
  367. package/packages/theme-violet/site/pages/home/impact-stats.html +31 -0
  368. package/packages/theme-violet/site/pages/home/mission.html +36 -0
  369. package/packages/theme-violet/site/pages/home/newsletter.html +29 -0
  370. package/packages/theme-violet/site/pages/home/transport-win.html +22 -0
  371. package/packages/theme-violet/site/pages/index.html +141 -0
  372. package/packages/theme-violet/src/index.js +76 -0
  373. package/packages/theme-violet/src/node.js +69 -0
  374. package/packages/theme-violet/test/theme.test.mjs +47 -0
  375. package/packages/work-graph/package.json +1 -1
  376. package/protocol/features/README.md +1 -1
  377. package/protocol/features/catalog.json +12 -12
  378. package/protocol/features/examples/provider-resend.feature.json +2 -2
  379. package/protocol/presets/catalog.json +1 -1
  380. package/protocol/theme-refinery/prebuild-registry.json +45 -0
  381. package/protocol/theme-refinery/product-metadata.schema.json +63 -26
  382. package/protocol/theme-refinery/receipts/prebuild-remaster-20261004.json +21 -0
  383. package/src/plugins/completeful.js +2 -2
  384. package/packages/theme-church-site/README.md +0 -10
  385. package/packages/theme-church-site/src/harvest.json +0 -16
  386. package/packages/theme-church-site/test/theme.test.mjs +0 -21
  387. package/packages/theme-companions-site/README.md +0 -10
  388. package/packages/theme-companions-site/src/harvest.json +0 -14
  389. package/packages/theme-companions-site/src/index.js +0 -87
  390. package/packages/theme-companions-site/test/theme.test.mjs +0 -21
  391. package/packages/theme-floors-site/README.md +0 -10
  392. package/packages/theme-floors-site/src/harvest.json +0 -16
  393. package/packages/theme-floors-site/test/theme.test.mjs +0 -21
  394. package/packages/theme-fuelnfree-site/README.md +0 -10
  395. package/packages/theme-fuelnfree-site/src/harvest.json +0 -15
  396. package/packages/theme-fuelnfree-site/test/theme.test.mjs +0 -21
  397. package/packages/theme-handyman-site/README.md +0 -10
  398. package/packages/theme-handyman-site/package.json +0 -41
  399. package/packages/theme-handyman-site/src/harvest.json +0 -12
  400. package/packages/theme-handyman-site/src/index.js +0 -88
  401. package/packages/theme-handyman-site/test/theme.test.mjs +0 -21
  402. package/packages/theme-insurance-site/README.md +0 -10
  403. package/packages/theme-insurance-site/src/harvest.json +0 -12
  404. package/packages/theme-insurance-site/src/index.js +0 -88
  405. package/packages/theme-insurance-site/test/theme.test.mjs +0 -21
  406. package/packages/theme-shinshu-site/README.md +0 -10
  407. package/packages/theme-shinshu-site/src/harvest.json +0 -14
  408. package/packages/theme-shinshu-site/test/theme.test.mjs +0 -21
  409. package/protocol/theme-refinery/lineage-registry.json +0 -105
  410. package/protocol/theme-refinery/receipts/products-registry-batch-20260924.json +0 -318
  411. package/protocol/theme-refinery/receipts/theme-harvest-20260924.json +0 -472
@@ -0,0 +1,1429 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html lang="en">
4
+ <head>
5
+ <meta charset="utf-8"/>
6
+ <meta content="width=device-width, initial-scale=1.0" name="viewport"/>
7
+ <title>Grove Surface Co. — Grove</title>
8
+ <meta content="A tactile home-services website prebuild for flooring and interiors, with project galleries, material details, process storytelling, reviews, and estimate requests." name="description"/>
9
+ <!-- Fonts - Bold, Clean, Legible (Cloudflare hosted) -->
10
+ <link href="https://fonts.googleapis.com" rel="preconnect"/>
11
+ <link crossorigin="" href="https://fonts.gstatic.com" rel="preconnect"/>
12
+ <link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&amp;family=DM+Sans:wght@400;500;600;700&amp;display=swap" rel="stylesheet"/>
13
+ <style>
14
+ * {
15
+ margin: 0;
16
+ padding: 0;
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ :root {
21
+ /* Primary green from estimate section: linear-gradient(135deg, #2d4a3e 0%, #3d5a4e 100%) */
22
+ --primary-green: #3a5a4d;
23
+ --primary-green-light: #4a6b5d;
24
+ --secondary-green: #4a7462;
25
+ --light-green: #5a8472;
26
+ --accent-green: #6a9482;
27
+ --cream: #f5f3ef;
28
+ --warm-gray: #4a4a4a;
29
+ --light-gray: #e8e8e8;
30
+ --gold: #c9a961;
31
+ --white: #ffffff;
32
+ --off-white: #fafafa;
33
+ --dark: #1a1a1a;
34
+ }
35
+
36
+ body {
37
+ font-family: 'DM Sans', -apple-system, BlinkMacSystemFont, sans-serif;
38
+ color: var(--warm-gray);
39
+ line-height: 1.6;
40
+ overflow-x: hidden;
41
+ background: linear-gradient(to bottom,
42
+ var(--white) 0%,
43
+ #fcfcfc 15%,
44
+ #f9faf9 30%,
45
+ #f6f8f6 50%,
46
+ #f3f6f4 70%,
47
+ #f0f4f2 85%,
48
+ var(--cream) 100%);
49
+ }
50
+
51
+ h1,
52
+ h2,
53
+ h3,
54
+ h4 {
55
+ font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif;
56
+ color: var(--dark);
57
+ font-weight: 700;
58
+ letter-spacing: -0.02em;
59
+ }
60
+
61
+ /* Navigation - Desktop Minimal */
62
+ .navbar {
63
+ position: fixed;
64
+ top: 0;
65
+ left: 0;
66
+ width: 100%;
67
+ background: rgba(255, 255, 255, 0.85);
68
+ backdrop-filter: blur(20px);
69
+ -webkit-backdrop-filter: blur(20px);
70
+ border-bottom: 1px solid rgba(58, 90, 77, 0.08);
71
+ z-index: 1000;
72
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
73
+ }
74
+
75
+ .navbar.scrolled {
76
+ background: rgba(255, 255, 255, 0.95);
77
+ box-shadow: 0 4px 30px rgba(58, 90, 77, 0.08);
78
+ }
79
+
80
+ .nav-container {
81
+ max-width: 1400px;
82
+ margin: 0 auto;
83
+ padding: 1.25rem 2rem;
84
+ display: flex;
85
+ justify-content: space-between;
86
+ align-items: center;
87
+ }
88
+
89
+ .logo {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 0.75rem;
93
+ text-decoration: none;
94
+ }
95
+
96
+ .logo img {
97
+ height: 100px;
98
+ width: auto;
99
+ object-fit: contain;
100
+ transition: transform 0.3s ease;
101
+ }
102
+
103
+ .logo:hover img {
104
+ transform: scale(1.05);
105
+ }
106
+
107
+ @media (max-width: 640px) {
108
+ .logo img {
109
+ height: 80px;
110
+ }
111
+ }
112
+
113
+ .nav-menu {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: 2.5rem;
117
+ list-style: none;
118
+ }
119
+
120
+ .nav-link {
121
+ color: var(--warm-gray);
122
+ text-decoration: none;
123
+ font-weight: 600;
124
+ font-size: 0.95rem;
125
+ letter-spacing: -0.01em;
126
+ position: relative;
127
+ transition: color 0.3s ease;
128
+ }
129
+
130
+ .nav-link::after {
131
+ content: '';
132
+ position: absolute;
133
+ bottom: -4px;
134
+ left: 0;
135
+ width: 0;
136
+ height: 2px;
137
+ background: var(--primary-green);
138
+ transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
139
+ }
140
+
141
+ .nav-link:hover,
142
+ .nav-link.active {
143
+ color: var(--primary-green);
144
+ }
145
+
146
+ .nav-link:hover::after,
147
+ .nav-link.active::after {
148
+ width: 100%;
149
+ }
150
+
151
+ .nav-cta {
152
+ background: var(--primary-green);
153
+ color: var(--white);
154
+ padding: 0.8rem 1.8rem;
155
+ border-radius: 8px;
156
+ font-weight: 700;
157
+ font-size: 0.9rem;
158
+ text-decoration: none;
159
+ letter-spacing: -0.01em;
160
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
161
+ cursor: pointer;
162
+ }
163
+
164
+ .nav-cta:hover {
165
+ background: var(--primary-green-light);
166
+ transform: translateY(-2px);
167
+ box-shadow: 0 8px 20px rgba(58, 90, 77, 0.25);
168
+ }
169
+
170
+ .mobile-toggle {
171
+ display: none;
172
+ flex-direction: column;
173
+ gap: 0.4rem;
174
+ background: none;
175
+ border: none;
176
+ cursor: pointer;
177
+ padding: 0.6rem;
178
+ z-index: 1001;
179
+ }
180
+
181
+ .hamburger {
182
+ width: 26px;
183
+ height: 2.5px;
184
+ background: var(--primary-green);
185
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
186
+ border-radius: 2px;
187
+ }
188
+
189
+ .mobile-toggle.active .hamburger:nth-child(1) {
190
+ transform: rotate(45deg) translate(6px, 6px);
191
+ }
192
+
193
+ .mobile-toggle.active .hamburger:nth-child(2) {
194
+ opacity: 0;
195
+ transform: translateX(-10px);
196
+ }
197
+
198
+ .mobile-toggle.active .hamburger:nth-child(3) {
199
+ transform: rotate(-45deg) translate(6px, -6px);
200
+ }
201
+
202
+ /* Hero Section */
203
+ .hero {
204
+ position: relative;
205
+ min-height: 95vh;
206
+ display: flex;
207
+ align-items: center;
208
+ overflow: hidden;
209
+ margin-top: 80px;
210
+ }
211
+
212
+ .hero-background {
213
+ position: absolute;
214
+ top: 0;
215
+ left: 0;
216
+ width: 100%;
217
+ height: 100%;
218
+ z-index: 0;
219
+ }
220
+
221
+ .hero-image {
222
+ width: 100%;
223
+ height: 100%;
224
+ object-fit: cover;
225
+ filter: brightness(1.05) contrast(1.1);
226
+ }
227
+
228
+ .hero-overlay {
229
+ position: absolute;
230
+ top: 0;
231
+ left: 0;
232
+ width: 100%;
233
+ height: 100%;
234
+ background: linear-gradient(135deg,
235
+ rgba(58, 90, 77, 0.92) 0%,
236
+ rgba(74, 107, 93, 0.85) 40%,
237
+ rgba(0, 0, 0, 0.7) 100%);
238
+ z-index: 1;
239
+ }
240
+
241
+ .hero-content {
242
+ position: relative;
243
+ z-index: 2;
244
+ max-width: 1400px;
245
+ margin: 0 auto;
246
+ padding: 3rem 2rem;
247
+ color: var(--white);
248
+ }
249
+
250
+ .hero h2 {
251
+ font-size: clamp(2.5rem, 7vw, 4.5rem);
252
+ color: var(--white);
253
+ margin-bottom: 1.5rem;
254
+ line-height: 1.1;
255
+ max-width: 900px;
256
+ font-weight: 700;
257
+ letter-spacing: -0.03em;
258
+ }
259
+
260
+ .hero-subtitle {
261
+ font-size: clamp(1.1rem, 2.5vw, 1.6rem);
262
+ margin-bottom: 2rem;
263
+ color: rgba(255, 255, 255, 0.95);
264
+ font-weight: 500;
265
+ max-width: 700px;
266
+ letter-spacing: -0.01em;
267
+ }
268
+
269
+ .hero-description {
270
+ font-size: clamp(1rem, 2vw, 1.15rem);
271
+ margin-bottom: 2.5rem;
272
+ max-width: 650px;
273
+ line-height: 1.7;
274
+ color: rgba(255, 255, 255, 0.88);
275
+ }
276
+
277
+ .hero-buttons {
278
+ display: flex;
279
+ gap: 1.2rem;
280
+ margin-bottom: 3.5rem;
281
+ flex-wrap: wrap;
282
+ }
283
+
284
+ .primary-button {
285
+ background: var(--white);
286
+ color: var(--primary-green);
287
+ padding: 1.3rem 2.8rem;
288
+ border-radius: 10px;
289
+ text-decoration: none;
290
+ font-weight: 700;
291
+ font-size: 1.05rem;
292
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
293
+ border: 2px solid transparent;
294
+ display: inline-block;
295
+ letter-spacing: -0.01em;
296
+ cursor: pointer;
297
+ }
298
+
299
+ .primary-button:hover {
300
+ background: var(--cream);
301
+ transform: translateY(-3px);
302
+ box-shadow: 0 12px 30px rgba(0, 0, 0, 0.35);
303
+ }
304
+
305
+ .secondary-button {
306
+ background: transparent;
307
+ color: var(--white);
308
+ padding: 1.3rem 2.8rem;
309
+ border-radius: 10px;
310
+ text-decoration: none;
311
+ font-weight: 700;
312
+ font-size: 1.05rem;
313
+ border: 2px solid rgba(255, 255, 255, 0.4);
314
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
315
+ display: inline-block;
316
+ letter-spacing: -0.01em;
317
+ backdrop-filter: blur(10px);
318
+ }
319
+
320
+ .secondary-button:hover {
321
+ background: rgba(255, 255, 255, 0.15);
322
+ border-color: var(--white);
323
+ transform: translateY(-3px);
324
+ }
325
+
326
+ .trust-signals {
327
+ display: flex;
328
+ align-items: center;
329
+ gap: 3rem;
330
+ flex-wrap: wrap;
331
+ }
332
+
333
+ .trust-item {
334
+ display: flex;
335
+ flex-direction: column;
336
+ gap: 0.3rem;
337
+ }
338
+
339
+ .stars {
340
+ color: var(--gold);
341
+ font-size: 1.3rem;
342
+ letter-spacing: 3px;
343
+ }
344
+
345
+ .trust-number {
346
+ font-size: 2rem;
347
+ font-weight: 700;
348
+ color: var(--white);
349
+ font-family: 'Space Grotesk', sans-serif;
350
+ letter-spacing: -0.02em;
351
+ }
352
+
353
+ .trust-text {
354
+ font-size: 0.85rem;
355
+ color: rgba(255, 255, 255, 0.8);
356
+ font-weight: 500;
357
+ letter-spacing: 0.02em;
358
+ }
359
+
360
+ /* Services Section - Staggered Grid */
361
+ .services {
362
+ padding: 8rem 2rem;
363
+ background: transparent;
364
+ }
365
+
366
+ .section-header {
367
+ text-align: center;
368
+ max-width: 800px;
369
+ margin: 0 auto 5rem;
370
+ }
371
+
372
+ .section-header h2 {
373
+ font-size: clamp(2.5rem, 5vw, 3.5rem);
374
+ margin-bottom: 1.2rem;
375
+ color: var(--primary-green);
376
+ font-weight: 700;
377
+ letter-spacing: -0.03em;
378
+ }
379
+
380
+ .section-subtitle {
381
+ font-size: clamp(1.1rem, 2.5vw, 1.3rem);
382
+ color: var(--warm-gray);
383
+ font-weight: 500;
384
+ letter-spacing: -0.01em;
385
+ }
386
+
387
+ .services-grid {
388
+ max-width: 1400px;
389
+ margin: 0 auto;
390
+ display: grid;
391
+ grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
392
+ gap: 2.5rem;
393
+ }
394
+
395
+ .service-card:nth-child(even) {
396
+ margin-top: 3rem;
397
+ }
398
+
399
+ .service-card {
400
+ background: var(--white);
401
+ border-radius: 16px;
402
+ overflow: hidden;
403
+ box-shadow: 0 4px 20px rgba(58, 90, 77, 0.08);
404
+ transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
405
+ border: 1px solid rgba(58, 90, 77, 0.06);
406
+ }
407
+
408
+ .service-card:hover {
409
+ transform: translateY(-12px);
410
+ box-shadow: 0 20px 50px rgba(58, 90, 77, 0.15);
411
+ border-color: rgba(58, 90, 77, 0.12);
412
+ }
413
+
414
+ .service-image {
415
+ position: relative;
416
+ width: 100%;
417
+ height: 280px;
418
+ overflow: hidden;
419
+ }
420
+
421
+ .service-image img {
422
+ width: 100%;
423
+ height: 100%;
424
+ object-fit: cover;
425
+ transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
426
+ }
427
+
428
+ .service-card:hover .service-image img {
429
+ transform: scale(1.08);
430
+ }
431
+
432
+ .service-overlay {
433
+ position: absolute;
434
+ top: 0;
435
+ left: 0;
436
+ width: 100%;
437
+ height: 100%;
438
+ background: linear-gradient(to bottom, transparent 40%, rgba(58, 90, 77, 0.5));
439
+ opacity: 0.7;
440
+ transition: opacity 0.4s ease;
441
+ }
442
+
443
+ .service-card:hover .service-overlay {
444
+ opacity: 0.5;
445
+ }
446
+
447
+ .service-content {
448
+ padding: 2.2rem;
449
+ }
450
+
451
+ .service-content h3 {
452
+ font-size: 1.6rem;
453
+ margin-bottom: 1rem;
454
+ color: var(--primary-green);
455
+ font-weight: 700;
456
+ letter-spacing: -0.02em;
457
+ }
458
+
459
+ .service-content p {
460
+ color: var(--warm-gray);
461
+ margin-bottom: 1.5rem;
462
+ line-height: 1.7;
463
+ font-size: 1rem;
464
+ }
465
+
466
+ .learn-more {
467
+ color: var(--primary-green);
468
+ text-decoration: none;
469
+ font-weight: 700;
470
+ font-size: 0.95rem;
471
+ display: inline-flex;
472
+ align-items: center;
473
+ gap: 0.6rem;
474
+ transition: gap 0.3s cubic-bezier(0.4, 0, 0.2, 1);
475
+ letter-spacing: -0.01em;
476
+ }
477
+
478
+ .learn-more:hover {
479
+ gap: 1.2rem;
480
+ }
481
+
482
+ /* Why Choose Us - Masonry Style */
483
+ .why-us {
484
+ padding: 8rem 2rem;
485
+ background: transparent;
486
+ }
487
+
488
+ .features-grid {
489
+ max-width: 1400px;
490
+ margin: 0 auto;
491
+ display: grid;
492
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
493
+ gap: 2.5rem;
494
+ }
495
+
496
+ .feature:nth-child(odd) {
497
+ margin-top: 2rem;
498
+ }
499
+
500
+ .feature {
501
+ text-align: center;
502
+ transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
503
+ }
504
+
505
+ .feature:hover {
506
+ transform: translateY(-8px);
507
+ }
508
+
509
+ .feature-image {
510
+ width: 100%;
511
+ height: 260px;
512
+ border-radius: 16px;
513
+ overflow: hidden;
514
+ margin-bottom: 1.8rem;
515
+ box-shadow: 0 8px 30px rgba(58, 90, 77, 0.1);
516
+ border: 1px solid rgba(58, 90, 77, 0.08);
517
+ }
518
+
519
+ .feature-image img {
520
+ width: 100%;
521
+ height: 100%;
522
+ object-fit: cover;
523
+ transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
524
+ }
525
+
526
+ .feature:hover .feature-image img {
527
+ transform: scale(1.1);
528
+ }
529
+
530
+ .feature h3 {
531
+ font-size: 1.5rem;
532
+ margin-bottom: 1rem;
533
+ color: var(--primary-green);
534
+ font-weight: 700;
535
+ letter-spacing: -0.02em;
536
+ }
537
+
538
+ .feature p {
539
+ color: var(--warm-gray);
540
+ line-height: 1.7;
541
+ font-size: 1rem;
542
+ }
543
+
544
+ /* Process Section - Asymmetric Grid */
545
+ .process {
546
+ padding: 8rem 2rem;
547
+ background: transparent;
548
+ }
549
+
550
+ .process-container {
551
+ max-width: 1300px;
552
+ margin: 0 auto;
553
+ display: grid;
554
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
555
+ gap: 3rem;
556
+ }
557
+
558
+ .process-step {
559
+ position: relative;
560
+ text-align: center;
561
+ transition: transform 0.4s cubic-bezier(0.4, 0, 0.2, 1);
562
+ }
563
+
564
+ .process-step:nth-child(2) {
565
+ margin-top: 2.5rem;
566
+ }
567
+
568
+ .process-step:hover {
569
+ transform: translateY(-10px);
570
+ }
571
+
572
+ .step-number {
573
+ position: absolute;
574
+ top: -25px;
575
+ left: 50%;
576
+ transform: translateX(-50%);
577
+ width: 70px;
578
+ height: 70px;
579
+ background: linear-gradient(135deg, var(--gold), #d4a956);
580
+ color: var(--dark);
581
+ border-radius: 50%;
582
+ display: flex;
583
+ align-items: center;
584
+ justify-content: center;
585
+ font-size: 1.6rem;
586
+ font-weight: 700;
587
+ font-family: 'Space Grotesk', sans-serif;
588
+ box-shadow: 0 8px 25px rgba(201, 169, 97, 0.3);
589
+ z-index: 1;
590
+ letter-spacing: -0.02em;
591
+ }
592
+
593
+ .process-image {
594
+ width: 100%;
595
+ height: 260px;
596
+ border-radius: 16px;
597
+ overflow: hidden;
598
+ margin-bottom: 2rem;
599
+ box-shadow: 0 8px 30px rgba(58, 90, 77, 0.1);
600
+ border: 1px solid rgba(58, 90, 77, 0.08);
601
+ }
602
+
603
+ .process-image img {
604
+ width: 100%;
605
+ height: 100%;
606
+ object-fit: cover;
607
+ transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
608
+ }
609
+
610
+ .process-step:hover .process-image img {
611
+ transform: scale(1.08);
612
+ }
613
+
614
+ .process-step h3 {
615
+ font-size: 1.6rem;
616
+ margin-bottom: 1rem;
617
+ color: var(--primary-green);
618
+ font-weight: 700;
619
+ letter-spacing: -0.02em;
620
+ }
621
+
622
+ .process-step p {
623
+ color: var(--warm-gray);
624
+ line-height: 1.7;
625
+ font-size: 1rem;
626
+ }
627
+
628
+ /* CTA Section */
629
+ .cta-section {
630
+ padding: 8rem 2rem;
631
+ background: linear-gradient(135deg,
632
+ rgba(58, 90, 77, 0.03) 0%,
633
+ rgba(74, 107, 93, 0.05) 50%,
634
+ rgba(90, 132, 114, 0.08) 100%);
635
+ text-align: center;
636
+ color: var(--primary-green);
637
+ }
638
+
639
+ .cta-content h2 {
640
+ font-size: clamp(2.5rem, 6vw, 3.8rem);
641
+ color: var(--primary-green);
642
+ margin-bottom: 1.5rem;
643
+ font-weight: 700;
644
+ letter-spacing: -0.03em;
645
+ }
646
+
647
+ .cta-content p {
648
+ font-size: clamp(1.2rem, 3vw, 1.6rem);
649
+ margin-bottom: 3rem;
650
+ color: var(--warm-gray);
651
+ }
652
+
653
+ .cta-contact {
654
+ display: flex;
655
+ justify-content: center;
656
+ gap: 4rem;
657
+ flex-wrap: wrap;
658
+ margin-top: 3rem;
659
+ }
660
+
661
+ .contact-info {
662
+ font-size: clamp(1.3rem, 3vw, 1.7rem);
663
+ color: var(--primary-green);
664
+ text-decoration: none;
665
+ font-weight: 700;
666
+ display: block;
667
+ margin-bottom: 0.5rem;
668
+ letter-spacing: -0.01em;
669
+ transition: color 0.3s ease;
670
+ }
671
+
672
+ .contact-info:hover {
673
+ color: var(--gold);
674
+ }
675
+
676
+ .contact-label {
677
+ font-size: 0.95rem;
678
+ color: var(--warm-gray);
679
+ font-weight: 500;
680
+ }
681
+
682
+ /* Modal Styles */
683
+ .modal-overlay {
684
+ display: none;
685
+ position: fixed;
686
+ top: 0;
687
+ left: 0;
688
+ width: 100%;
689
+ height: 100%;
690
+ background: rgba(0, 0, 0, 0.7);
691
+ backdrop-filter: blur(8px);
692
+ -webkit-backdrop-filter: blur(8px);
693
+ z-index: 2000;
694
+ align-items: center;
695
+ justify-content: center;
696
+ padding: 2rem;
697
+ animation: fadeIn 0.3s ease;
698
+ }
699
+
700
+ .modal-overlay.active {
701
+ display: flex;
702
+ }
703
+
704
+ @keyframes fadeIn {
705
+ from {
706
+ opacity: 0;
707
+ }
708
+
709
+ to {
710
+ opacity: 1;
711
+ }
712
+ }
713
+
714
+ @keyframes slideUp {
715
+ from {
716
+ opacity: 0;
717
+ transform: translateY(30px);
718
+ }
719
+
720
+ to {
721
+ opacity: 1;
722
+ transform: translateY(0);
723
+ }
724
+ }
725
+
726
+ .modal-content {
727
+ background: var(--white);
728
+ border-radius: 20px;
729
+ max-width: 600px;
730
+ width: 100%;
731
+ max-height: 90vh;
732
+ overflow-y: auto;
733
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
734
+ animation: slideUp 0.4s cubic-bezier(0.4, 0, 0.2, 1);
735
+ position: relative;
736
+ }
737
+
738
+ .modal-header {
739
+ padding: 2.5rem 2.5rem 1rem;
740
+ border-bottom: 1px solid rgba(58, 90, 77, 0.1);
741
+ }
742
+
743
+ .modal-close {
744
+ position: absolute;
745
+ top: 1.5rem;
746
+ right: 1.5rem;
747
+ background: none;
748
+ border: none;
749
+ font-size: 2rem;
750
+ color: var(--warm-gray);
751
+ cursor: pointer;
752
+ width: 40px;
753
+ height: 40px;
754
+ display: flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ border-radius: 50%;
758
+ transition: all 0.3s ease;
759
+ }
760
+
761
+ .modal-close:hover {
762
+ background: rgba(58, 90, 77, 0.1);
763
+ color: var(--primary-green);
764
+ }
765
+
766
+ .modal-header h3 {
767
+ color: var(--primary-green);
768
+ font-size: 2rem;
769
+ margin-bottom: 0.5rem;
770
+ font-weight: 700;
771
+ letter-spacing: -0.02em;
772
+ }
773
+
774
+ .modal-header p {
775
+ color: var(--warm-gray);
776
+ font-size: 1rem;
777
+ }
778
+
779
+ .modal-body {
780
+ padding: 2rem 2.5rem 2.5rem;
781
+ }
782
+
783
+ .form-group {
784
+ margin-bottom: 1.5rem;
785
+ }
786
+
787
+ .form-group label {
788
+ display: block;
789
+ color: var(--dark);
790
+ font-weight: 700;
791
+ margin-bottom: 0.6rem;
792
+ font-size: 0.95rem;
793
+ letter-spacing: -0.01em;
794
+ }
795
+
796
+ .form-group input,
797
+ .form-group select,
798
+ .form-group textarea {
799
+ width: 100%;
800
+ padding: 1rem;
801
+ border: 2px solid var(--light-gray);
802
+ border-radius: 10px;
803
+ font-size: 1rem;
804
+ font-family: 'DM Sans', sans-serif;
805
+ transition: all 0.3s ease;
806
+ background: var(--white);
807
+ }
808
+
809
+ .form-group input:focus,
810
+ .form-group select:focus,
811
+ .form-group textarea:focus {
812
+ outline: none;
813
+ border-color: var(--primary-green);
814
+ box-shadow: 0 0 0 4px rgba(58, 90, 77, 0.1);
815
+ }
816
+
817
+ .form-group textarea {
818
+ resize: vertical;
819
+ min-height: 120px;
820
+ }
821
+
822
+ .submit-button {
823
+ width: 100%;
824
+ background: var(--primary-green);
825
+ color: var(--white);
826
+ padding: 1.3rem;
827
+ border: none;
828
+ border-radius: 10px;
829
+ font-size: 1.1rem;
830
+ font-weight: 700;
831
+ cursor: pointer;
832
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
833
+ letter-spacing: -0.01em;
834
+ }
835
+
836
+ .submit-button:hover {
837
+ background: var(--primary-green-light);
838
+ transform: translateY(-2px);
839
+ box-shadow: 0 8px 20px rgba(58, 90, 77, 0.25);
840
+ }
841
+
842
+ /* Footer - Glassmorphic Green */
843
+ .footer {
844
+ background: linear-gradient(135deg,
845
+ rgba(58, 90, 77, 0.95) 0%,
846
+ rgba(74, 107, 93, 0.98) 100%);
847
+ backdrop-filter: blur(20px);
848
+ -webkit-backdrop-filter: blur(20px);
849
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
850
+ color: rgba(255, 255, 255, 0.9);
851
+ padding: 4rem 2rem 2rem;
852
+ }
853
+
854
+ .footer-content {
855
+ max-width: 1400px;
856
+ margin: 0 auto;
857
+ display: grid;
858
+ grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
859
+ gap: 3rem;
860
+ margin-bottom: 3rem;
861
+ }
862
+
863
+ .footer-section h4 {
864
+ color: var(--white);
865
+ font-size: 1.2rem;
866
+ margin-bottom: 1.5rem;
867
+ font-weight: 700;
868
+ letter-spacing: -0.01em;
869
+ }
870
+
871
+ .footer-section p {
872
+ line-height: 1.8;
873
+ margin-bottom: 0.5rem;
874
+ color: rgba(255, 255, 255, 0.85);
875
+ }
876
+
877
+ .footer-owner {
878
+ font-style: italic;
879
+ color: var(--gold);
880
+ font-weight: 500;
881
+ }
882
+
883
+ .footer-section a {
884
+ color: rgba(255, 255, 255, 0.85);
885
+ text-decoration: none;
886
+ line-height: 2;
887
+ display: block;
888
+ transition: color 0.3s ease;
889
+ }
890
+
891
+ .footer-section a:hover {
892
+ color: var(--gold);
893
+ }
894
+
895
+ .footer-bottom {
896
+ border-top: 1px solid rgba(255, 255, 255, 0.15);
897
+ padding-top: 2rem;
898
+ text-align: center;
899
+ font-size: 0.9rem;
900
+ color: rgba(255, 255, 255, 0.7);
901
+ }
902
+
903
+ /* Mobile Responsive - Glassmorphic Nav */
904
+ @media (max-width: 968px) {
905
+ .nav-menu {
906
+ position: fixed;
907
+ top: 0;
908
+ left: -70%;
909
+ width: 70%;
910
+ height: 100vh;
911
+ background: rgba(58, 90, 77, 0.95);
912
+ backdrop-filter: blur(20px);
913
+ -webkit-backdrop-filter: blur(20px);
914
+ flex-direction: column;
915
+ align-items: flex-start;
916
+ padding: 6rem 2.5rem 2rem;
917
+ gap: 1.5rem;
918
+ transition: left 0.4s cubic-bezier(0.4, 0, 0.2, 1);
919
+ box-shadow: 4px 0 40px rgba(0, 0, 0, 0.3);
920
+ z-index: 999;
921
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
922
+ }
923
+
924
+ .nav-menu.active {
925
+ left: 0;
926
+ }
927
+
928
+ .nav-link {
929
+ color: rgba(255, 255, 255, 0.9);
930
+ font-size: 1.1rem;
931
+ font-weight: 600;
932
+ width: 100%;
933
+ padding: 0.5rem 0;
934
+ }
935
+
936
+ .nav-link::after {
937
+ background: var(--gold);
938
+ }
939
+
940
+ .nav-link:hover,
941
+ .nav-link.active {
942
+ color: var(--white);
943
+ }
944
+
945
+ .nav-cta {
946
+ width: 100%;
947
+ text-align: center;
948
+ background: var(--gold);
949
+ margin-top: 1rem;
950
+ }
951
+
952
+ .mobile-toggle {
953
+ display: flex;
954
+ }
955
+
956
+ .service-card:nth-child(even),
957
+ .feature:nth-child(odd),
958
+ .process-step:nth-child(2) {
959
+ margin-top: 0;
960
+ }
961
+ }
962
+
963
+ @media (max-width: 640px) {
964
+ .hero-buttons {
965
+ flex-direction: column;
966
+ width: 100%;
967
+ }
968
+
969
+ .primary-button,
970
+ .secondary-button {
971
+ width: 100%;
972
+ text-align: center;
973
+ }
974
+
975
+ .services-grid,
976
+ .features-grid,
977
+ .process-container {
978
+ grid-template-columns: 1fr;
979
+ gap: 2rem;
980
+ }
981
+
982
+ .cta-contact {
983
+ flex-direction: column;
984
+ gap: 2rem;
985
+ }
986
+
987
+ .modal-content {
988
+ margin: 1rem;
989
+ }
990
+
991
+ .modal-header,
992
+ .modal-body {
993
+ padding: 1.5rem;
994
+ }
995
+ }
996
+
997
+ /* Scroll animations */
998
+ @keyframes fadeInUp {
999
+ from {
1000
+ opacity: 0;
1001
+ transform: translateY(30px);
1002
+ }
1003
+
1004
+ to {
1005
+ opacity: 1;
1006
+ transform: translateY(0);
1007
+ }
1008
+ }
1009
+
1010
+ .animate-in {
1011
+ animation: fadeInUp 0.6s ease-out forwards;
1012
+ }
1013
+ </style>
1014
+ <link href="https://example.com/" rel="canonical"/><meta content="index,follow,max-image-preview:large" name="robots"/><meta content="#182018" name="theme-color"/><meta content="website" property="og:type"/><meta content="Grove Surface Co. — Grove" property="og:title"/><meta content="A tactile home-services website prebuild for flooring and interiors, with project galleries, material details, process storytelling, reviews, and estimate requests." property="og:description"/><meta content="https://example.com/" property="og:url"/><meta content="https://example.com/assets/generated/social-card.webp" property="og:image"/><meta content="summary_large_image" name="twitter:card"/><meta content="Grove Surface Co. — Grove" name="twitter:title"/><meta content="A tactile home-services website prebuild for flooring and interiors, with project galleries, material details, process storytelling, reviews, and estimate requests." name="twitter:description"/><meta content="https://example.com/assets/generated/social-card.webp" name="twitter:image"/><script data-agentsam-seo="theme-remaster" type="application/ld+json">{"@context": "https://schema.org", "@type": "WebSite", "name": "Grove Surface Co.", "description": "A tactile home-services website prebuild for flooring and interiors, with project galleries, material details, process storytelling, reviews, and estimate requests.", "url": "https://example.com/", "isPartOf": {"@type": "CreativeWork", "name": "Grove AgentSam Prebuild"}}</script></head>
1015
+ <body>
1016
+ <!-- Navigation -->
1017
+ <nav class="navbar" id="navbar">
1018
+ <div class="nav-container">
1019
+ <a class="logo" href="/">
1020
+ <img alt="Grove Surface and More Logo" class="logo-image" src="/assets/generated/media-31107c21f2.webp"/>
1021
+ </a>
1022
+ <button aria-label="Toggle navigation" class="mobile-toggle" id="mobile-toggle">
1023
+ <span class="hamburger"></span>
1024
+ <span class="hamburger"></span>
1025
+ <span class="hamburger"></span>
1026
+ </button>
1027
+ <ul class="nav-menu" id="nav-menu">
1028
+ <li><a class="nav-link active" href="/">Home</a></li>
1029
+ <li><a class="nav-link" href="./services">Services</a></li>
1030
+ <li><a class="nav-link" href="./process">Process</a></li>
1031
+ <li><a class="nav-link" href="./gallery">Gallery</a></li>
1032
+ <li><a class="nav-link" href="./contact">Contact</a></li>
1033
+ <li><a class="nav-cta" href="./contact">Contact Us</a></li>
1034
+ </ul>
1035
+ </div>
1036
+ </nav>
1037
+ <!-- Contact Us Modal -->
1038
+ <div class="modal-overlay" id="modal-overlay">
1039
+ <div class="modal-content">
1040
+ <div class="modal-header">
1041
+ <button class="modal-close" id="modal-close">×</button>
1042
+ <h3>Contact Us</h3>
1043
+ <p>Send us a message and we'll get back to you soon.</p>
1044
+ </div>
1045
+ <div class="modal-body">
1046
+ <form id="contact-form">
1047
+ <div class="form-group">
1048
+ <label for="contact-name">Name</label>
1049
+ <input id="contact-name" name="name" placeholder="Your name" required="" type="text"/>
1050
+ </div>
1051
+ <div class="form-group">
1052
+ <label for="contact-email">Email</label>
1053
+ <input id="contact-email" name="email" placeholder="your@email.com" required="" type="email"/>
1054
+ </div>
1055
+ <div class="form-group">
1056
+ <label for="contact-phone">Phone</label>
1057
+ <input id="contact-phone" name="phone" placeholder="202-555-0100" required="" type="tel"/>
1058
+ </div>
1059
+ <div class="form-group">
1060
+ <label for="contact-message">Message</label>
1061
+ <textarea id="contact-message" name="message" placeholder="How can we help?" required=""></textarea>
1062
+ </div>
1063
+ <button class="submit-button" type="submit">Submit</button>
1064
+ </form>
1065
+ </div>
1066
+ </div>
1067
+ </div>
1068
+ <!-- Hero Section -->
1069
+ <section class="hero" id="home">
1070
+ <div class="hero-background">
1071
+ <img alt="Professional flooring installation" class="hero-image" src="/assets/generated/media-0c064db1aa.webp"/>
1072
+ </div>
1073
+ <div class="hero-overlay"></div>
1074
+ <div class="hero-content">
1075
+ <h2>Flooring Done Right — From Quote to Final Walkthrough</h2>
1076
+ <p class="hero-subtitle">Precision craftsmanship, transparent pricing, and modern flooring solutions for
1077
+ River Parish homes and businesses.</p>
1078
+ <p class="hero-description">
1079
+ Transform your space with expert installation of hardwood, tile, luxury vinyl, and complete renovation
1080
+ services. Dylan Hollier and team bring over a decade of experience to every project.
1081
+ </p>
1082
+ <div class="hero-buttons">
1083
+ <a class="primary-button" href="#" id="hero-cta">Get a Free Estimate</a>
1084
+ <a class="secondary-button" href="tel:202-555-0100">Call 202-555-0100</a>
1085
+ </div>
1086
+ <div class="trust-signals">
1087
+ <div class="trust-item">
1088
+ <span class="stars">★★★★★</span>
1089
+ <span class="trust-text">5.0 Rating</span>
1090
+ </div>
1091
+ <div class="trust-item">
1092
+ <span class="trust-number">62+</span>
1093
+ <span class="trust-text">Google Reviews</span>
1094
+ </div>
1095
+ <div class="trust-item">
1096
+ <span class="trust-number">500+</span>
1097
+ <span class="trust-text">Projects Completed</span>
1098
+ </div>
1099
+ </div>
1100
+ </div>
1101
+ </section>
1102
+ <!-- Services Section -->
1103
+ <section class="services" id="services">
1104
+ <div class="section-header">
1105
+ <h2>Our Flooring Solutions</h2>
1106
+ <p class="section-subtitle">Premium materials and expert installation for every project</p>
1107
+ </div>
1108
+ <div class="services-grid">
1109
+ <div class="service-card">
1110
+ <div class="service-image">
1111
+ <img alt="Hardwood flooring installation" src="/assets/generated/media-b2c650f9ab.webp"/>
1112
+ <div class="service-overlay"></div>
1113
+ </div>
1114
+ <div class="service-content">
1115
+ <h3>Hardwood Flooring</h3>
1116
+ <p>Premium solid and engineered hardwood installation, refinishing, and restoration services with
1117
+ custom staining options.</p>
1118
+ <a class="learn-more open-modal-link" href="#">Get Estimate →</a>
1119
+ </div>
1120
+ </div>
1121
+ <div class="service-card">
1122
+ <div class="service-image">
1123
+ <img alt="Luxury vinyl plank flooring" src="/assets/generated/media-5476b24219.webp"/>
1124
+ <div class="service-overlay"></div>
1125
+ </div>
1126
+ <div class="service-content">
1127
+ <h3>Luxury Vinyl Plank</h3>
1128
+ <p>Waterproof, durable LVP with the look of real wood. Perfect for high-traffic areas and
1129
+ moisture-prone spaces.</p>
1130
+ <a class="learn-more open-modal-link" href="#">Get Estimate →</a>
1131
+ </div>
1132
+ </div>
1133
+ <div class="service-card">
1134
+ <div class="service-image">
1135
+ <img alt="Tile flooring installation" src="/assets/generated/media-c86498fdb4.webp"/>
1136
+ <div class="service-overlay"></div>
1137
+ </div>
1138
+ <div class="service-content">
1139
+ <h3>Tile Installation</h3>
1140
+ <p>Ceramic, porcelain, and natural stone tile for kitchens, bathrooms, and elegant living spaces.
1141
+ </p>
1142
+ <a class="learn-more open-modal-link" href="#">Get Estimate →</a>
1143
+ </div>
1144
+ </div>
1145
+ <div class="service-card">
1146
+ <div class="service-image">
1147
+ <img alt="Complete home renovation" src="/assets/generated/media-45e8e27542.webp"/>
1148
+ <div class="service-overlay"></div>
1149
+ </div>
1150
+ <div class="service-content">
1151
+ <h3>Complete Renovations</h3>
1152
+ <p>Full-scale home transformations from concept to completion with expert project management
1153
+ included.</p>
1154
+ <a class="learn-more open-modal-link" href="#">Get Estimate →</a>
1155
+ </div>
1156
+ </div>
1157
+ </div>
1158
+ </section>
1159
+ <!-- Why Choose Us -->
1160
+ <section class="why-us">
1161
+ <div class="section-header">
1162
+ <h2>Why River Parish Chooses Us</h2>
1163
+ <p class="section-subtitle">Local expertise, transparent pricing, guaranteed craftsmanship</p>
1164
+ </div>
1165
+ <div class="features-grid">
1166
+ <div class="feature">
1167
+ <div class="feature-image">
1168
+ <img alt="Professional measurement and consultation" src="/assets/generated/media-2e1523a5b0.webp"/>
1169
+ </div>
1170
+ <h3>Precise Measurement</h3>
1171
+ <p>Professional site assessment and accurate measurements ensure perfect material ordering and zero
1172
+ waste on every project.</p>
1173
+ </div>
1174
+ <div class="feature">
1175
+ <div class="feature-image">
1176
+ <img alt="Customer consultation and planning" src="/assets/generated/media-2012f04243.webp"/>
1177
+ </div>
1178
+ <h3>Transparent Quotes</h3>
1179
+ <p>Detailed quotes with no hidden fees. You'll know exactly what to expect from start to finish on your
1180
+ project.</p>
1181
+ </div>
1182
+ <div class="feature">
1183
+ <div class="feature-image">
1184
+ <img alt="Clean and professional job site" src="/assets/generated/media-ec6c01bf8d.webp"/>
1185
+ </div>
1186
+ <h3>Clean Job Sites</h3>
1187
+ <p>We treat your home with respect. Daily cleanup and protection of your property throughout the entire
1188
+ project.</p>
1189
+ </div>
1190
+ <div class="feature">
1191
+ <div class="feature-image">
1192
+ <img alt="Quality guarantee and warranty" src="/assets/generated/media-7a227d3e4b.webp"/>
1193
+ </div>
1194
+ <h3>Guaranteed Work</h3>
1195
+ <p>All installations backed by our satisfaction guarantee and full manufacturer warranties for your
1196
+ peace of mind.</p>
1197
+ </div>
1198
+ </div>
1199
+ </section>
1200
+ <!-- Process Section -->
1201
+ <section class="process" id="process">
1202
+ <div class="section-header">
1203
+ <h2>Our Proven Process</h2>
1204
+ <p class="section-subtitle">From consultation to final walkthrough, we make it seamless</p>
1205
+ </div>
1206
+ <div class="process-container">
1207
+ <div class="process-step">
1208
+ <div class="step-number">01</div>
1209
+ <div class="process-image">
1210
+ <img alt="Initial consultation and measurement" src="/assets/generated/media-b183eed550.webp"/>
1211
+ </div>
1212
+ <h3>Consultation &amp; Measure</h3>
1213
+ <p>We visit your property for a detailed assessment, discuss your vision, and take precise measurements
1214
+ for accurate quotes.</p>
1215
+ </div>
1216
+ <div class="process-step">
1217
+ <div class="step-number">02</div>
1218
+ <div class="process-image">
1219
+ <img alt="Material selection and quote" src="/assets/generated/media-098b13d75a.webp"/>
1220
+ </div>
1221
+ <h3>Quote &amp; Select Materials</h3>
1222
+ <p>Receive a detailed transparent quote and select from premium materials that perfectly fit your style
1223
+ and budget.</p>
1224
+ </div>
1225
+ <div class="process-step">
1226
+ <div class="step-number">03</div>
1227
+ <div class="process-image">
1228
+ <img alt="Professional installation" src="/assets/generated/media-14759c7460.webp"/>
1229
+ </div>
1230
+ <h3>Expert Installation</h3>
1231
+ <p>Our skilled team completes the installation with precision craftsmanship, keeping you informed every
1232
+ step of the way.</p>
1233
+ </div>
1234
+ </div>
1235
+ </section>
1236
+ <!-- CTA Section -->
1237
+ <section class="cta-section" id="contact">
1238
+ <div class="cta-content">
1239
+ <h2>Ready to Transform Your Space?</h2>
1240
+ <p>Let's discuss your flooring project today</p>
1241
+ <a class="primary-button open-modal-link" href="#" style="background: var(--primary-green); color: var(--white);">Get Free Estimate</a>
1242
+ <div class="cta-contact">
1243
+ <div class="contact-item">
1244
+ <a class="contact-info" href="tel:202-555-0100">202-555-0100</a>
1245
+ <div class="contact-label">Call Now</div>
1246
+ </div>
1247
+ <div class="contact-item">
1248
+ <a class="contact-info" href="mailto:hello@grove.example">hello@grove.example</a>
1249
+ <div class="contact-label">Email Us</div>
1250
+ </div>
1251
+ </div>
1252
+ </div>
1253
+ </section>
1254
+ <!-- Footer - Glassmorphic Green -->
1255
+ <footer class="footer">
1256
+ <div class="footer-content">
1257
+ <div class="footer-section">
1258
+ <h4>Grove Surface and More</h4>
1259
+ <p>Premium flooring and renovation services serving River Parish and the Gulf South region.</p>
1260
+ <p class="footer-owner">Owned and operated by Dylan Hollier</p>
1261
+ </div>
1262
+ <div class="footer-section">
1263
+ <h4>Services</h4>
1264
+ <a href="#services">Hardwood Flooring</a>
1265
+ <a href="#services">Luxury Vinyl Plank</a>
1266
+ <a href="#services">Tile Installation</a>
1267
+ <a href="#services">Complete Renovations</a>
1268
+ <a href="#services">Floor Refinishing</a>
1269
+ </div>
1270
+ <div class="footer-section">
1271
+ <h4>Service Area</h4>
1272
+ <p>River Parish, LA</p>
1273
+ <p>Gulf South Region</p>
1274
+ <p>Mon-Fri: 8AM - 6PM</p>
1275
+ <p>Saturday by Appointment</p>
1276
+ </div>
1277
+ <div class="footer-section">
1278
+ <h4>Contact</h4>
1279
+ <a href="tel:202-555-0100">202-555-0100</a>
1280
+ <a href="mailto:hello@grove.example">hello@grove.example</a>
1281
+ <a class="open-modal-link" href="#">Get Free Estimate</a>
1282
+ </div>
1283
+ </div>
1284
+ <div class="footer-bottom">
1285
+ <p>© 2025 Grove Surface and More. All rights reserved.</p>
1286
+ </div>
1287
+ </footer>
1288
+ <script>
1289
+ // Modal functionality
1290
+ const modalOverlay = document.getElementById('modal-overlay');
1291
+ const modalClose = document.getElementById('modal-close');
1292
+ const openModalButtons = document.querySelectorAll('#open-modal, #hero-cta, .open-modal-link');
1293
+
1294
+ openModalButtons.forEach(button => {
1295
+ button.addEventListener('click', (e) => {
1296
+ e.preventDefault();
1297
+ modalOverlay.classList.add('active');
1298
+ document.body.style.overflow = 'hidden';
1299
+ });
1300
+ });
1301
+
1302
+ modalClose.addEventListener('click', () => {
1303
+ modalOverlay.classList.remove('active');
1304
+ document.body.style.overflow = '';
1305
+ });
1306
+
1307
+ modalOverlay.addEventListener('click', (e) => {
1308
+ if (e.target === modalOverlay) {
1309
+ modalOverlay.classList.remove('active');
1310
+ document.body.style.overflow = '';
1311
+ }
1312
+ });
1313
+
1314
+ // Mobile navigation
1315
+ const navbar = document.getElementById('navbar');
1316
+ const mobileToggle = document.getElementById('mobile-toggle');
1317
+ const navMenu = document.getElementById('nav-menu');
1318
+
1319
+ mobileToggle.addEventListener('click', () => {
1320
+ navMenu.classList.toggle('active');
1321
+ mobileToggle.classList.toggle('active');
1322
+ });
1323
+
1324
+ document.querySelectorAll('.nav-link').forEach(link => {
1325
+ link.addEventListener('click', () => {
1326
+ navMenu.classList.remove('active');
1327
+ mobileToggle.classList.remove('active');
1328
+ });
1329
+ });
1330
+
1331
+ // Navbar scroll effect
1332
+ window.addEventListener('scroll', () => {
1333
+ if (window.scrollY > 100) {
1334
+ navbar.classList.add('scrolled');
1335
+ } else {
1336
+ navbar.classList.remove('scrolled');
1337
+ }
1338
+ });
1339
+
1340
+ // Nav links go to full pages (/services, /process, /gallery, /contact) — no smooth-scroll needed
1341
+
1342
+ // Contact form submission — sends to hello@grove.example
1343
+ const contactForm = document.getElementById('contact-form');
1344
+ const contactEmailTo = 'hello@grove.example';
1345
+ const submitBtn = contactForm.querySelector('.submit-button');
1346
+ document.getElementById('contact-form').addEventListener('submit', async function (e) {
1347
+ e.preventDefault();
1348
+
1349
+ const name = document.getElementById('contact-name').value.trim();
1350
+ const email = document.getElementById('contact-email').value.trim();
1351
+ const phone = document.getElementById('contact-phone').value.trim();
1352
+ const message = document.getElementById('contact-message').value.trim();
1353
+
1354
+ if (!name || !email || !message) {
1355
+ alert('Please fill in Name, Email, and Message.');
1356
+ return;
1357
+ }
1358
+
1359
+ const originalText = submitBtn.textContent;
1360
+ submitBtn.disabled = true;
1361
+ submitBtn.textContent = 'Sending…';
1362
+
1363
+ try {
1364
+ const res = await fetch('/api/contact', {
1365
+ method: 'POST',
1366
+ headers: { 'Content-Type': 'application/json' },
1367
+ body: JSON.stringify({ name, email, phone, message, to: contactEmailTo })
1368
+ });
1369
+ const data = await res.json().catch(() => ({}));
1370
+
1371
+ if (!res.ok) {
1372
+ throw new Error(data.message || data.error || 'Send failed');
1373
+ }
1374
+ alert(data.message || "Message sent! We'll get back to you soon.");
1375
+ modalOverlay.classList.remove('active');
1376
+ document.body.style.overflow = '';
1377
+ this.reset();
1378
+ } catch (err) {
1379
+ // Fallback: open mailto so the message still goes to hello@grove.example
1380
+ const subject = encodeURIComponent('Grove Surface – Contact from ' + name);
1381
+ const body = encodeURIComponent(
1382
+ 'Name: ' + name + '\nEmail: ' + email + '\nPhone: ' + (phone || '—') + '\n\nMessage:\n' + message
1383
+ );
1384
+ window.location.href = 'mailto:' + contactEmailTo + '?subject=' + subject + '&body=' + body;
1385
+ alert("Your email app will open. Send the message to reach us, or call 202-555-0100.");
1386
+ modalOverlay.classList.remove('active');
1387
+ document.body.style.overflow = '';
1388
+ this.reset();
1389
+ } finally {
1390
+ submitBtn.disabled = false;
1391
+ submitBtn.textContent = originalText;
1392
+ }
1393
+ });
1394
+
1395
+ // Phone formatting for contact form
1396
+ const phoneInput = document.getElementById('contact-phone');
1397
+ phoneInput.addEventListener('input', (e) => {
1398
+ let value = e.target.value.replace(/\D/g, '');
1399
+ if (value.length > 10) value = value.slice(0, 10);
1400
+
1401
+ if (value.length >= 6) {
1402
+ e.target.value = `(${value.slice(0, 3)}) ${value.slice(3, 6)}-${value.slice(6)}`;
1403
+ } else if (value.length >= 3) {
1404
+ e.target.value = `(${value.slice(0, 3)}) ${value.slice(3)}`;
1405
+ } else {
1406
+ e.target.value = value;
1407
+ }
1408
+ });
1409
+
1410
+ // Scroll animations
1411
+ const observerOptions = {
1412
+ threshold: 0.1,
1413
+ rootMargin: '0px 0px -50px 0px'
1414
+ };
1415
+
1416
+ const observer = new IntersectionObserver((entries) => {
1417
+ entries.forEach(entry => {
1418
+ if (entry.isIntersecting) {
1419
+ entry.target.classList.add('animate-in');
1420
+ }
1421
+ });
1422
+ }, observerOptions);
1423
+
1424
+ document.querySelectorAll('.service-card, .feature, .process-step').forEach(el => {
1425
+ observer.observe(el);
1426
+ });
1427
+ </script>
1428
+ </body>
1429
+ </html>