@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,2415 @@
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>Summit Practice — Summit</title>
8
+ <meta content="Summit is a restrained consulting portfolio prebuild with editorial service pages, case studies, media, multilingual-ready structure, and room to think." name="description"/>
9
+ <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&amp;family=Roboto+Mono:wght@400;500;700&amp;display=swap" rel="stylesheet"/>
10
+ <script src="i18n.js"></script>
11
+ <script src="chatbot.js"></script>
12
+ <script src="themes.js"></script>
13
+ <link href="theme-styles.css" rel="stylesheet"/>
14
+ <style>
15
+ @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Roboto+Mono:wght@400;500;700&display=swap');
16
+
17
+ * {
18
+ margin: 0;
19
+ padding: 0;
20
+ box-sizing: border-box;
21
+ }
22
+
23
+ :root {
24
+ --orange-primary: #FF8C42;
25
+ --orange-dark: #E67635;
26
+ --orange-light: #FFB67A;
27
+ --cream: #FFF8F0;
28
+ --cream-dark: #F5E6D3;
29
+ --text-dark: #1A1A1A;
30
+ --text-gray: #4A4A4A;
31
+ --white: #FFFFFF;
32
+ }
33
+
34
+ body {
35
+ font-family: 'Roboto', -apple-system, BlinkMacSystemFont, sans-serif;
36
+ color: var(--text-dark);
37
+ background: var(--cream);
38
+ line-height: 1.6;
39
+ overflow-x: hidden;
40
+ }
41
+
42
+ h1,
43
+ h2,
44
+ h3,
45
+ h4,
46
+ h5,
47
+ h6,
48
+ .heading {
49
+ font-family: 'Roboto Mono', monospace;
50
+ }
51
+
52
+ /* Navigation */
53
+ nav {
54
+ position: fixed;
55
+ top: 0;
56
+ left: 0;
57
+ right: 0;
58
+ background: rgba(255, 248, 240, 0.95);
59
+ backdrop-filter: blur(10px);
60
+ z-index: 100;
61
+ border-bottom: 1px solid rgba(255, 140, 66, 0.1);
62
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
63
+ }
64
+
65
+ .nav-container {
66
+ max-width: 1400px;
67
+ margin: 0 auto;
68
+ padding: 1.5rem 3rem;
69
+ display: flex;
70
+ justify-content: space-between;
71
+ align-items: center;
72
+ }
73
+
74
+ .logo-section {
75
+ display: flex;
76
+ align-items: center;
77
+ gap: 1rem;
78
+ cursor: pointer;
79
+ }
80
+
81
+ .logo-mountain {
82
+ width: 50px;
83
+ height: 50px;
84
+ background: linear-gradient(135deg, var(--orange-primary), var(--orange-dark));
85
+ border-radius: 8px;
86
+ display: flex;
87
+ align-items: center;
88
+ justify-content: center;
89
+ font-size: 24px;
90
+ }
91
+
92
+ .logo-text h1 {
93
+ font-family: 'Roboto Mono', monospace;
94
+ font-size: 1.5rem;
95
+ font-weight: 700;
96
+ color: var(--text-dark);
97
+ letter-spacing: 1px;
98
+ }
99
+
100
+ .logo-text p {
101
+ font-size: 0.75rem;
102
+ color: var(--text-gray);
103
+ text-transform: uppercase;
104
+ letter-spacing: 2px;
105
+ }
106
+
107
+ .nav-links {
108
+ display: flex;
109
+ gap: 2.5rem;
110
+ align-items: center;
111
+ }
112
+
113
+ .nav-links a {
114
+ color: var(--text-dark);
115
+ text-decoration: none;
116
+ font-weight: 500;
117
+ font-size: 0.95rem;
118
+ position: relative;
119
+ transition: color 0.3s ease;
120
+ cursor: pointer;
121
+ }
122
+
123
+ .nav-links a:hover {
124
+ color: var(--orange-primary);
125
+ }
126
+
127
+ .nav-links a.active::after {
128
+ content: '';
129
+ position: absolute;
130
+ bottom: -5px;
131
+ left: 0;
132
+ right: 0;
133
+ height: 2px;
134
+ background: var(--orange-primary);
135
+ }
136
+
137
+ .btn-primary {
138
+ background: var(--orange-primary);
139
+ color: white;
140
+ padding: 0.75rem 1.75rem;
141
+ border-radius: 8px;
142
+ border: none;
143
+ cursor: pointer;
144
+ font-weight: 600;
145
+ transition: all 0.3s ease;
146
+ text-decoration: none;
147
+ display: inline-block;
148
+ font-family: 'Roboto', sans-serif;
149
+ }
150
+
151
+ .btn-primary:hover {
152
+ background: var(--orange-dark);
153
+ transform: translateY(-2px);
154
+ box-shadow: 0 4px 12px rgba(255, 140, 66, 0.3);
155
+ }
156
+
157
+ /* Page Container */
158
+ .page {
159
+ display: none;
160
+ min-height: 100vh;
161
+ padding-top: 100px;
162
+ position: relative;
163
+ }
164
+
165
+ .page.active {
166
+ display: block;
167
+ animation: fadeIn 0.5s ease-in;
168
+ }
169
+
170
+ @keyframes fadeIn {
171
+ from {
172
+ opacity: 0;
173
+ transform: translateY(20px);
174
+ }
175
+
176
+ to {
177
+ opacity: 1;
178
+ transform: translateY(0);
179
+ }
180
+ }
181
+
182
+ .container {
183
+ max-width: 1400px;
184
+ margin: 0 auto;
185
+ padding: 0 3rem;
186
+ }
187
+
188
+ /* Hero Section */
189
+ .hero {
190
+ padding: 6rem 0 4rem;
191
+ position: relative;
192
+ }
193
+
194
+ .hero-content {
195
+ display: grid;
196
+ grid-template-columns: 1.2fr 1fr;
197
+ gap: 4rem;
198
+ align-items: center;
199
+ }
200
+
201
+ .hero-text h1 {
202
+ font-family: 'Roboto Mono', monospace;
203
+ font-size: 4rem;
204
+ font-weight: 700;
205
+ line-height: 1.1;
206
+ margin-bottom: 1.5rem;
207
+ color: var(--text-dark);
208
+ }
209
+
210
+ .hero-text .highlight {
211
+ color: var(--orange-primary);
212
+ }
213
+
214
+ .hero-text p {
215
+ font-size: 1.25rem;
216
+ color: var(--text-gray);
217
+ margin-bottom: 2rem;
218
+ line-height: 1.8;
219
+ }
220
+
221
+ .hero-stats {
222
+ display: grid;
223
+ grid-template-columns: repeat(3, 1fr);
224
+ gap: 2rem;
225
+ margin-top: 3rem;
226
+ }
227
+
228
+ .stat {
229
+ text-align: center;
230
+ padding: 1.5rem;
231
+ background: white;
232
+ border-radius: 12px;
233
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
234
+ }
235
+
236
+ .stat-number {
237
+ font-family: 'Roboto Mono', monospace;
238
+ font-size: 2.5rem;
239
+ font-weight: 700;
240
+ color: var(--orange-primary);
241
+ display: block;
242
+ }
243
+
244
+ .stat-label {
245
+ font-size: 0.9rem;
246
+ color: var(--text-gray);
247
+ margin-top: 0.5rem;
248
+ }
249
+
250
+ .hero-visual {
251
+ position: relative;
252
+ border-radius: 16px;
253
+ overflow: hidden;
254
+ background: linear-gradient(135deg, #FFE5D9 0%, #FFF8F0 100%);
255
+ min-height: 400px;
256
+ display: flex;
257
+ align-items: center;
258
+ justify-content: center;
259
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.15);
260
+ background-image: url('/assets/generated/media-9d4521abba.webp');
261
+ background-size: cover;
262
+ background-position: center;
263
+ background-blend-mode: overlay;
264
+ }
265
+
266
+ .hero-visual::before {
267
+ content: '';
268
+ position: absolute;
269
+ top: 0;
270
+ left: 0;
271
+ right: 0;
272
+ bottom: 0;
273
+ background: linear-gradient(135deg, rgba(255, 229, 217, 0.7) 0%, rgba(255, 248, 240, 0.8) 100%);
274
+ z-index: 1;
275
+ }
276
+
277
+ .mountain-illustration {
278
+ width: 100%;
279
+ height: 100%;
280
+ position: relative;
281
+ z-index: 2;
282
+ }
283
+
284
+ /* Section Styles */
285
+ .section {
286
+ padding: 5rem 0;
287
+ }
288
+
289
+ .section-header {
290
+ text-align: center;
291
+ margin-bottom: 4rem;
292
+ }
293
+
294
+ .section-title {
295
+ font-family: 'Roboto Mono', monospace;
296
+ font-size: 3rem;
297
+ font-weight: 700;
298
+ margin-bottom: 1rem;
299
+ color: var(--text-dark);
300
+ }
301
+
302
+ .section-subtitle {
303
+ font-size: 1.1rem;
304
+ color: var(--text-gray);
305
+ max-width: 600px;
306
+ margin: 0 auto;
307
+ }
308
+
309
+ /* Services Grid */
310
+ .services-grid {
311
+ display: grid;
312
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
313
+ gap: 2rem;
314
+ }
315
+
316
+ /* Service Area Showcase */
317
+ .area-showcase {
318
+ margin-top: 4rem;
319
+ padding: 4rem 0;
320
+ background: linear-gradient(135deg, #FFF8F0 0%, #F5E6D3 100%);
321
+ border-radius: 24px;
322
+ }
323
+
324
+ .area-grid {
325
+ display: grid;
326
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
327
+ gap: 2rem;
328
+ margin-top: 2rem;
329
+ }
330
+
331
+ .area-card {
332
+ background: white;
333
+ border-radius: 16px;
334
+ overflow: hidden;
335
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
336
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
337
+ cursor: pointer;
338
+ }
339
+
340
+ .area-card:hover {
341
+ transform: translateY(-8px);
342
+ box-shadow: 0 12px 40px rgba(255, 140, 66, 0.2);
343
+ }
344
+
345
+ .area-image {
346
+ width: 100%;
347
+ height: 200px;
348
+ object-fit: cover;
349
+ background: linear-gradient(135deg, var(--orange-light), var(--orange-primary));
350
+ }
351
+
352
+ .area-content {
353
+ padding: 1.5rem;
354
+ }
355
+
356
+ .area-content h4 {
357
+ font-family: 'Roboto Mono', monospace;
358
+ font-size: 1.3rem;
359
+ font-weight: 700;
360
+ margin-bottom: 0.5rem;
361
+ color: var(--text-dark);
362
+ }
363
+
364
+ .area-content p {
365
+ color: var(--text-gray);
366
+ font-size: 0.95rem;
367
+ line-height: 1.6;
368
+ }
369
+
370
+ .service-card {
371
+ background: white;
372
+ padding: 2.5rem;
373
+ border-radius: 16px;
374
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
375
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
376
+ cursor: pointer;
377
+ }
378
+
379
+ .service-card:hover {
380
+ transform: translateY(-8px);
381
+ box-shadow: 0 12px 40px rgba(255, 140, 66, 0.2);
382
+ }
383
+
384
+ .service-icon {
385
+ width: 60px;
386
+ height: 60px;
387
+ background: linear-gradient(135deg, var(--orange-light), var(--orange-primary));
388
+ border-radius: 12px;
389
+ display: flex;
390
+ align-items: center;
391
+ justify-content: center;
392
+ margin-bottom: 1.5rem;
393
+ }
394
+
395
+ .service-icon svg {
396
+ width: 32px;
397
+ height: 32px;
398
+ stroke: white;
399
+ fill: none;
400
+ }
401
+
402
+ .icon {
403
+ width: 24px;
404
+ height: 24px;
405
+ stroke: currentColor;
406
+ fill: none;
407
+ }
408
+
409
+ .service-card h3 {
410
+ font-family: 'Roboto Mono', monospace;
411
+ font-size: 1.5rem;
412
+ font-weight: 700;
413
+ margin-bottom: 1rem;
414
+ color: var(--text-dark);
415
+ }
416
+
417
+ .service-card p {
418
+ color: var(--text-gray);
419
+ line-height: 1.7;
420
+ }
421
+
422
+ .service-features {
423
+ list-style: none;
424
+ margin-top: 1.5rem;
425
+ display: grid;
426
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
427
+ gap: 0.75rem;
428
+ }
429
+
430
+ .service-features li {
431
+ display: flex;
432
+ align-items: center;
433
+ gap: 0.5rem;
434
+ font-size: 0.95rem;
435
+ }
436
+
437
+ .service-features li::before {
438
+ content: '✓';
439
+ color: var(--orange-primary);
440
+ font-weight: bold;
441
+ font-size: 1.2rem;
442
+ }
443
+
444
+ /* About Section */
445
+ .about-content {
446
+ display: grid;
447
+ grid-template-columns: 1fr 1fr;
448
+ gap: 4rem;
449
+ align-items: start;
450
+ }
451
+
452
+ /* Profile Hero Section */
453
+ .profile-hero {
454
+ background: linear-gradient(135deg, #FFF8F0 0%, #F5E6D3 100%);
455
+ border-radius: 24px;
456
+ padding: 3rem;
457
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.08);
458
+ }
459
+
460
+ .profile-hero-content {
461
+ display: grid;
462
+ grid-template-columns: 300px 1fr;
463
+ gap: 3rem;
464
+ align-items: center;
465
+ }
466
+
467
+ .profile-image-container {
468
+ position: relative;
469
+ }
470
+
471
+ .profile-image {
472
+ width: 100%;
473
+ height: auto;
474
+ aspect-ratio: 9/16;
475
+ object-fit: cover;
476
+ border-radius: 16px;
477
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2);
478
+ border: 4px solid white;
479
+ }
480
+
481
+ .profile-badge {
482
+ position: absolute;
483
+ bottom: 1rem;
484
+ left: 50%;
485
+ transform: translateX(-50%);
486
+ background: rgba(0, 0, 0, 0.7);
487
+ backdrop-filter: blur(10px);
488
+ color: white;
489
+ padding: 0.75rem 1.5rem;
490
+ border-radius: 50px;
491
+ display: flex;
492
+ align-items: center;
493
+ gap: 0.5rem;
494
+ font-size: 0.9rem;
495
+ font-weight: 600;
496
+ white-space: nowrap;
497
+ }
498
+
499
+ .profile-info {
500
+ padding: 1rem 0;
501
+ }
502
+
503
+ .social-link:hover {
504
+ transform: translateY(-2px);
505
+ box-shadow: 0 8px 20px rgba(255, 140, 66, 0.4);
506
+ }
507
+
508
+ /* Portfolio Gallery */
509
+ .portfolio-section {
510
+ margin-top: 6rem;
511
+ }
512
+
513
+ .portfolio-grid {
514
+ display: grid;
515
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
516
+ gap: 2rem;
517
+ margin-top: 2rem;
518
+ }
519
+
520
+ .portfolio-item {
521
+ position: relative;
522
+ border-radius: 16px;
523
+ overflow: hidden;
524
+ aspect-ratio: 4/3;
525
+ cursor: pointer;
526
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);
527
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
528
+ }
529
+
530
+ .portfolio-item:hover {
531
+ transform: translateY(-8px);
532
+ box-shadow: 0 12px 40px rgba(255, 140, 66, 0.3);
533
+ }
534
+
535
+ .portfolio-image {
536
+ width: 100%;
537
+ height: 100%;
538
+ object-fit: cover;
539
+ transition: transform 0.5s ease;
540
+ }
541
+
542
+ .portfolio-item:hover .portfolio-image {
543
+ transform: scale(1.1);
544
+ }
545
+
546
+ .portfolio-overlay {
547
+ position: absolute;
548
+ bottom: 0;
549
+ left: 0;
550
+ right: 0;
551
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);
552
+ padding: 2rem 1.5rem 1.5rem;
553
+ transform: translateY(100%);
554
+ transition: transform 0.3s ease;
555
+ }
556
+
557
+ .portfolio-item:hover .portfolio-overlay {
558
+ transform: translateY(0);
559
+ }
560
+
561
+ .portfolio-caption {
562
+ color: white;
563
+ font-size: 1.1rem;
564
+ font-weight: 600;
565
+ margin: 0;
566
+ font-family: 'Roboto Mono', monospace;
567
+ }
568
+
569
+ @media (max-width: 768px) {
570
+ .profile-hero-content {
571
+ grid-template-columns: 1fr;
572
+ text-align: center;
573
+ }
574
+
575
+ .profile-image-container {
576
+ max-width: 250px;
577
+ margin: 0 auto;
578
+ }
579
+
580
+ .portfolio-grid {
581
+ grid-template-columns: 1fr;
582
+ }
583
+ }
584
+
585
+ .about-text p {
586
+ margin-bottom: 1.5rem;
587
+ line-height: 1.8;
588
+ color: var(--text-gray);
589
+ }
590
+
591
+ .credentials {
592
+ background: white;
593
+ padding: 2rem;
594
+ border-radius: 12px;
595
+ border-left: 4px solid var(--orange-primary);
596
+ margin-bottom: 2rem;
597
+ }
598
+
599
+ .credentials h4 {
600
+ font-family: 'Roboto Mono', monospace;
601
+ font-size: 1.3rem;
602
+ margin-bottom: 1rem;
603
+ color: var(--text-dark);
604
+ }
605
+
606
+ .credentials ul {
607
+ list-style: none;
608
+ }
609
+
610
+ .credentials li {
611
+ padding: 0.75rem 0;
612
+ border-bottom: 1px solid var(--cream-dark);
613
+ display: flex;
614
+ align-items: start;
615
+ gap: 0.75rem;
616
+ }
617
+
618
+ .credentials li:last-child {
619
+ border-bottom: none;
620
+ }
621
+
622
+ .credentials li::before {
623
+ content: '✓';
624
+ color: var(--orange-primary);
625
+ font-weight: bold;
626
+ font-size: 1.2rem;
627
+ flex-shrink: 0;
628
+ }
629
+
630
+ /* Contact Section */
631
+ .contact-content {
632
+ display: grid;
633
+ grid-template-columns: 1fr 1fr;
634
+ gap: 4rem;
635
+ }
636
+
637
+ .contact-info {
638
+ background: white;
639
+ padding: 3rem;
640
+ border-radius: 16px;
641
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
642
+ }
643
+
644
+ .contact-item {
645
+ display: flex;
646
+ gap: 1.5rem;
647
+ margin-bottom: 2rem;
648
+ padding-bottom: 2rem;
649
+ border-bottom: 1px solid var(--cream-dark);
650
+ }
651
+
652
+ .contact-item:last-child {
653
+ border-bottom: none;
654
+ margin-bottom: 0;
655
+ padding-bottom: 0;
656
+ }
657
+
658
+ .contact-icon {
659
+ width: 50px;
660
+ height: 50px;
661
+ background: var(--cream);
662
+ border-radius: 10px;
663
+ display: flex;
664
+ align-items: center;
665
+ justify-content: center;
666
+ flex-shrink: 0;
667
+ }
668
+
669
+ .contact-icon svg {
670
+ width: 24px;
671
+ height: 24px;
672
+ stroke: var(--orange-primary);
673
+ }
674
+
675
+ /* Language Switcher */
676
+ .language-switcher {
677
+ position: relative;
678
+ display: inline-block;
679
+ }
680
+
681
+ .language-btn {
682
+ background: transparent;
683
+ border: 2px solid var(--orange-primary);
684
+ color: var(--orange-primary);
685
+ padding: 0.5rem 1rem;
686
+ border-radius: 8px;
687
+ cursor: pointer;
688
+ display: flex;
689
+ align-items: center;
690
+ gap: 0.5rem;
691
+ font-weight: 500;
692
+ transition: all 0.3s ease;
693
+ }
694
+
695
+ .language-btn:hover {
696
+ background: var(--orange-primary);
697
+ color: white;
698
+ }
699
+
700
+ .language-dropdown {
701
+ position: absolute;
702
+ top: 100%;
703
+ right: 0;
704
+ margin-top: 0.5rem;
705
+ background: white;
706
+ border-radius: 8px;
707
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
708
+ min-width: 150px;
709
+ display: none;
710
+ z-index: 1000;
711
+ }
712
+
713
+ .language-dropdown.open {
714
+ display: block;
715
+ }
716
+
717
+ .language-option {
718
+ padding: 0.75rem 1rem;
719
+ cursor: pointer;
720
+ transition: background 0.2s;
721
+ display: flex;
722
+ align-items: center;
723
+ gap: 0.5rem;
724
+ }
725
+
726
+ .language-option:hover {
727
+ background: var(--cream);
728
+ }
729
+
730
+ .language-option.active {
731
+ background: var(--orange-primary);
732
+ color: white;
733
+ }
734
+
735
+ /* Chatbot Styles */
736
+ .chatbot-container {
737
+ position: fixed;
738
+ bottom: 2rem;
739
+ right: 2rem;
740
+ z-index: 1000;
741
+ }
742
+
743
+ .chatbot-toggle {
744
+ width: 60px;
745
+ height: 60px;
746
+ background: var(--orange-primary);
747
+ border-radius: 50%;
748
+ display: flex;
749
+ align-items: center;
750
+ justify-content: center;
751
+ cursor: pointer;
752
+ box-shadow: 0 4px 20px rgba(255, 140, 66, 0.4);
753
+ transition: transform 0.3s ease;
754
+ }
755
+
756
+ .chatbot-toggle:hover {
757
+ transform: scale(1.1);
758
+ }
759
+
760
+ .chatbot-toggle svg {
761
+ width: 28px;
762
+ height: 28px;
763
+ stroke: white;
764
+ }
765
+
766
+ .chatbot-window {
767
+ position: absolute;
768
+ bottom: 80px;
769
+ right: 0;
770
+ width: 400px;
771
+ max-width: calc(100vw - 2rem);
772
+ height: 600px;
773
+ max-height: calc(100vh - 120px);
774
+ background: white;
775
+ border-radius: 16px;
776
+ box-shadow: 0 8px 40px rgba(0, 0, 0, 0.2);
777
+ display: none;
778
+ flex-direction: column;
779
+ overflow: hidden;
780
+ }
781
+
782
+ .chatbot-window.open {
783
+ display: flex;
784
+ }
785
+
786
+ .chatbot-header {
787
+ padding: 1.5rem;
788
+ background: var(--orange-primary);
789
+ color: white;
790
+ display: flex;
791
+ justify-content: space-between;
792
+ align-items: center;
793
+ }
794
+
795
+ .chatbot-title {
796
+ display: flex;
797
+ align-items: center;
798
+ gap: 0.75rem;
799
+ font-weight: 600;
800
+ }
801
+
802
+ .chatbot-title svg {
803
+ width: 24px;
804
+ height: 24px;
805
+ stroke: white;
806
+ }
807
+
808
+ .chatbot-close {
809
+ background: transparent;
810
+ border: none;
811
+ color: white;
812
+ cursor: pointer;
813
+ padding: 0.5rem;
814
+ }
815
+
816
+ .chatbot-close svg {
817
+ width: 20px;
818
+ height: 20px;
819
+ stroke: white;
820
+ }
821
+
822
+ .chatbot-messages {
823
+ flex: 1;
824
+ overflow-y: auto;
825
+ padding: 1.5rem;
826
+ display: flex;
827
+ flex-direction: column;
828
+ gap: 1rem;
829
+ }
830
+
831
+ .chatbot-message {
832
+ display: flex;
833
+ max-width: 80%;
834
+ }
835
+
836
+ .chatbot-message.user {
837
+ align-self: flex-end;
838
+ }
839
+
840
+ .chatbot-message.bot {
841
+ align-self: flex-start;
842
+ }
843
+
844
+ .message-content {
845
+ padding: 0.75rem 1rem;
846
+ border-radius: 12px;
847
+ line-height: 1.5;
848
+ }
849
+
850
+ .chatbot-message.user .message-content {
851
+ background: var(--orange-primary);
852
+ color: white;
853
+ }
854
+
855
+ .chatbot-message.bot .message-content {
856
+ background: var(--cream);
857
+ color: var(--text-dark);
858
+ }
859
+
860
+ .chatbot-suggestions {
861
+ padding: 1rem;
862
+ display: flex;
863
+ flex-wrap: wrap;
864
+ gap: 0.5rem;
865
+ border-top: 1px solid var(--cream-dark);
866
+ }
867
+
868
+ .suggestion-btn {
869
+ padding: 0.5rem 1rem;
870
+ background: var(--cream);
871
+ border: 1px solid var(--cream-dark);
872
+ border-radius: 20px;
873
+ cursor: pointer;
874
+ font-size: 0.85rem;
875
+ transition: all 0.2s;
876
+ }
877
+
878
+ .suggestion-btn:hover {
879
+ background: var(--orange-primary);
880
+ color: white;
881
+ border-color: var(--orange-primary);
882
+ }
883
+
884
+ .chatbot-input-container {
885
+ padding: 1rem;
886
+ border-top: 1px solid var(--cream-dark);
887
+ display: flex;
888
+ gap: 0.5rem;
889
+ }
890
+
891
+ .chatbot-input {
892
+ flex: 1;
893
+ padding: 0.75rem;
894
+ border: 2px solid var(--cream-dark);
895
+ border-radius: 8px;
896
+ font-family: 'Roboto', sans-serif;
897
+ }
898
+
899
+ .chatbot-input:focus {
900
+ outline: none;
901
+ border-color: var(--orange-primary);
902
+ }
903
+
904
+ .chatbot-send {
905
+ padding: 0.75rem 1rem;
906
+ background: var(--orange-primary);
907
+ color: white;
908
+ border: none;
909
+ border-radius: 8px;
910
+ cursor: pointer;
911
+ display: flex;
912
+ align-items: center;
913
+ }
914
+
915
+ .chatbot-send svg {
916
+ width: 20px;
917
+ height: 20px;
918
+ stroke: white;
919
+ }
920
+
921
+ .typing-indicator {
922
+ display: inline-flex;
923
+ gap: 4px;
924
+ margin-right: 8px;
925
+ }
926
+
927
+ .typing-indicator span {
928
+ width: 6px;
929
+ height: 6px;
930
+ background: var(--text-gray);
931
+ border-radius: 50%;
932
+ animation: typing 1.4s infinite;
933
+ }
934
+
935
+ .typing-indicator span:nth-child(2) {
936
+ animation-delay: 0.2s;
937
+ }
938
+
939
+ .typing-indicator span:nth-child(3) {
940
+ animation-delay: 0.4s;
941
+ }
942
+
943
+ @keyframes typing {
944
+
945
+ 0%,
946
+ 60%,
947
+ 100% {
948
+ transform: translateY(0);
949
+ }
950
+
951
+ 30% {
952
+ transform: translateY(-10px);
953
+ }
954
+ }
955
+
956
+ @media (max-width: 768px) {
957
+ .chatbot-window {
958
+ width: calc(100vw - 1rem);
959
+ height: calc(100vh - 100px);
960
+ bottom: 80px;
961
+ right: 0.5rem;
962
+ }
963
+ }
964
+
965
+ .contact-details h4 {
966
+ font-weight: 600;
967
+ margin-bottom: 0.5rem;
968
+ color: var(--text-dark);
969
+ }
970
+
971
+ .contact-details p {
972
+ color: var(--text-gray);
973
+ }
974
+
975
+ .contact-form {
976
+ background: white;
977
+ padding: 3rem;
978
+ border-radius: 16px;
979
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
980
+ }
981
+
982
+ .form-group {
983
+ margin-bottom: 1.5rem;
984
+ }
985
+
986
+ .form-group label {
987
+ display: block;
988
+ margin-bottom: 0.5rem;
989
+ font-weight: 500;
990
+ color: var(--text-dark);
991
+ }
992
+
993
+ .form-group input,
994
+ .form-group textarea {
995
+ width: 100%;
996
+ padding: 0.75rem 1rem;
997
+ border: 2px solid var(--cream-dark);
998
+ border-radius: 8px;
999
+ font-family: 'Roboto', sans-serif;
1000
+ font-size: 1rem;
1001
+ transition: border-color 0.3s ease;
1002
+ }
1003
+
1004
+ .form-group input:focus,
1005
+ .form-group textarea:focus {
1006
+ outline: none;
1007
+ border-color: var(--orange-primary);
1008
+ }
1009
+
1010
+ .form-group textarea {
1011
+ min-height: 150px;
1012
+ resize: vertical;
1013
+ }
1014
+
1015
+ /* Dashboard */
1016
+ .dashboard-header {
1017
+ background: white;
1018
+ padding: 2rem;
1019
+ border-radius: 12px;
1020
+ margin-bottom: 2rem;
1021
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
1022
+ }
1023
+
1024
+ .dashboard-grid {
1025
+ display: grid;
1026
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1027
+ gap: 2rem;
1028
+ margin-bottom: 2rem;
1029
+ }
1030
+
1031
+ .dashboard-card {
1032
+ background: white;
1033
+ padding: 2rem;
1034
+ border-radius: 12px;
1035
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
1036
+ }
1037
+
1038
+ .dashboard-card h3 {
1039
+ font-family: 'Roboto Mono', monospace;
1040
+ font-size: 1.5rem;
1041
+ margin-bottom: 1rem;
1042
+ color: var(--text-dark);
1043
+ }
1044
+
1045
+ .dashboard-number {
1046
+ font-family: 'Roboto Mono', monospace;
1047
+ font-size: 3rem;
1048
+ font-weight: bold;
1049
+ color: var(--orange-primary);
1050
+ }
1051
+
1052
+ .data-table {
1053
+ width: 100%;
1054
+ background: white;
1055
+ border-radius: 12px;
1056
+ overflow: hidden;
1057
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
1058
+ margin-bottom: 2rem;
1059
+ }
1060
+
1061
+ .data-table h3 {
1062
+ padding: 1.5rem;
1063
+ font-size: 1.5rem;
1064
+ font-family: 'Roboto Mono', monospace;
1065
+ background: var(--cream);
1066
+ }
1067
+
1068
+ .data-table table {
1069
+ width: 100%;
1070
+ border-collapse: collapse;
1071
+ }
1072
+
1073
+ .data-table th {
1074
+ background: var(--cream);
1075
+ padding: 1rem;
1076
+ text-align: left;
1077
+ font-weight: 600;
1078
+ color: var(--text-dark);
1079
+ border-bottom: 2px solid var(--cream-dark);
1080
+ }
1081
+
1082
+ .data-table td {
1083
+ padding: 1rem;
1084
+ border-bottom: 1px solid var(--cream-dark);
1085
+ }
1086
+
1087
+ .data-table tr:hover {
1088
+ background: var(--cream);
1089
+ }
1090
+
1091
+ .badge {
1092
+ display: inline-block;
1093
+ padding: 0.25rem 0.75rem;
1094
+ border-radius: 20px;
1095
+ font-size: 0.85rem;
1096
+ font-weight: 500;
1097
+ }
1098
+
1099
+ .badge-success {
1100
+ background: #E8F5E9;
1101
+ color: #2E7D32;
1102
+ }
1103
+
1104
+ .badge-warning {
1105
+ background: #FFF3E0;
1106
+ color: #E65100;
1107
+ }
1108
+
1109
+ .badge-info {
1110
+ background: #E3F2FD;
1111
+ color: #1565C0;
1112
+ }
1113
+
1114
+ .spinner {
1115
+ border: 3px solid var(--cream-dark);
1116
+ border-top: 3px solid var(--orange-primary);
1117
+ border-radius: 50%;
1118
+ width: 40px;
1119
+ height: 40px;
1120
+ animation: spin 1s linear infinite;
1121
+ margin: 2rem auto;
1122
+ }
1123
+
1124
+ @keyframes spin {
1125
+ 0% {
1126
+ transform: rotate(0deg);
1127
+ }
1128
+
1129
+ 100% {
1130
+ transform: rotate(360deg);
1131
+ }
1132
+ }
1133
+
1134
+ .alert {
1135
+ background: var(--cream);
1136
+ padding: 2rem;
1137
+ border-radius: 12px;
1138
+ border-left: 4px solid var(--orange-primary);
1139
+ margin: 2rem 0;
1140
+ }
1141
+
1142
+ /* Footer */
1143
+ footer {
1144
+ background: var(--text-dark);
1145
+ color: white;
1146
+ padding: 3rem 0 1.5rem;
1147
+ margin-top: 5rem;
1148
+ }
1149
+
1150
+ .footer-content {
1151
+ display: grid;
1152
+ grid-template-columns: 2fr 1fr 1fr;
1153
+ gap: 3rem;
1154
+ margin-bottom: 2rem;
1155
+ }
1156
+
1157
+ .footer-brand h3 {
1158
+ font-family: 'Roboto Mono', monospace;
1159
+ font-size: 1.5rem;
1160
+ margin-bottom: 1rem;
1161
+ }
1162
+
1163
+ .footer-brand p {
1164
+ color: rgba(255, 255, 255, 0.7);
1165
+ line-height: 1.7;
1166
+ }
1167
+
1168
+ .footer-links h4 {
1169
+ font-size: 1.1rem;
1170
+ margin-bottom: 1rem;
1171
+ font-weight: 600;
1172
+ }
1173
+
1174
+ .footer-links ul {
1175
+ list-style: none;
1176
+ }
1177
+
1178
+ .footer-links li {
1179
+ margin-bottom: 0.75rem;
1180
+ }
1181
+
1182
+ .footer-links a {
1183
+ color: rgba(255, 255, 255, 0.7);
1184
+ text-decoration: none;
1185
+ transition: color 0.3s ease;
1186
+ cursor: pointer;
1187
+ }
1188
+
1189
+ .footer-links a:hover {
1190
+ color: var(--orange-primary);
1191
+ }
1192
+
1193
+ .footer-bottom {
1194
+ border-top: 1px solid rgba(255, 255, 255, 0.1);
1195
+ padding-top: 1.5rem;
1196
+ text-align: center;
1197
+ color: rgba(255, 255, 255, 0.5);
1198
+ font-size: 0.9rem;
1199
+ }
1200
+
1201
+ /* Mobile Responsive */
1202
+ @media (max-width: 768px) {
1203
+ .nav-container {
1204
+ padding: 1rem 1.5rem;
1205
+ flex-direction: column;
1206
+ gap: 1rem;
1207
+ }
1208
+
1209
+ .nav-links {
1210
+ gap: 1rem;
1211
+ font-size: 0.85rem;
1212
+ flex-wrap: wrap;
1213
+ justify-content: center;
1214
+ }
1215
+
1216
+ .container {
1217
+ padding: 0 1.5rem;
1218
+ }
1219
+
1220
+ .hero-content,
1221
+ .about-content,
1222
+ .contact-content {
1223
+ grid-template-columns: 1fr;
1224
+ }
1225
+
1226
+ .hero-text h1 {
1227
+ font-size: 2.5rem;
1228
+ }
1229
+
1230
+ .services-grid {
1231
+ grid-template-columns: 1fr;
1232
+ }
1233
+
1234
+ .dashboard-grid {
1235
+ grid-template-columns: 1fr;
1236
+ }
1237
+
1238
+ .footer-content {
1239
+ grid-template-columns: 1fr;
1240
+ }
1241
+
1242
+ .hero-stats {
1243
+ grid-template-columns: 1fr;
1244
+ }
1245
+ }
1246
+ </style>
1247
+ <link href="https://example.com/" rel="canonical"/><meta content="index,follow,max-image-preview:large" name="robots"/><meta content="#0e1111" name="theme-color"/><meta content="website" property="og:type"/><meta content="Summit Practice — Summit" property="og:title"/><meta content="Summit is a restrained consulting portfolio prebuild with editorial service pages, case studies, media, multilingual-ready structure, and room to think." 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="Summit Practice — Summit" name="twitter:title"/><meta content="Summit is a restrained consulting portfolio prebuild with editorial service pages, case studies, media, multilingual-ready structure, and room to think." 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": "Summit Practice", "description": "Summit is a restrained consulting portfolio prebuild with editorial service pages, case studies, media, multilingual-ready structure, and room to think.", "url": "https://example.com/", "isPartOf": {"@type": "CreativeWork", "name": "Summit AgentSam Prebuild"}}</script></head>
1248
+ <body>
1249
+ <!-- SVG Icons Sprite -->
1250
+ <svg style="display: none;" xmlns="http://www.w3.org/2000/svg">
1251
+ <symbol fill="none" id="icon-translation" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1252
+ <path d="M5 8l6 6M11 8l6 6M2 12h20M12 2v20"></path>
1253
+ <circle cx="12" cy="12" r="10"></circle>
1254
+ </symbol>
1255
+ <symbol fill="none" id="icon-handshake" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1256
+ <path d="M8 12h8M8 8h8M8 16h8M4 4h16v16H4z"></path>
1257
+ <path d="M12 4v16M4 12h16"></path>
1258
+ </symbol>
1259
+ <symbol fill="none" id="icon-network" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1260
+ <circle cx="12" cy="12" r="3"></circle>
1261
+ <circle cx="6" cy="6" r="2"></circle>
1262
+ <circle cx="18" cy="6" r="2"></circle>
1263
+ <circle cx="6" cy="18" r="2"></circle>
1264
+ <circle cx="18" cy="18" r="2"></circle>
1265
+ <line x1="12" x2="12" y1="9" y2="15"></line>
1266
+ <line x1="9" x2="15" y1="12" y2="12"></line>
1267
+ <line x1="8" x2="10" y1="8" y2="10"></line>
1268
+ <line x1="14" x2="16" y1="8" y2="10"></line>
1269
+ <line x1="8" x2="10" y1="16" y2="14"></line>
1270
+ <line x1="14" x2="16" y1="16" y2="14"></line>
1271
+ </symbol>
1272
+ <symbol fill="none" id="icon-construction" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1273
+ <rect height="18" rx="2" width="18" x="3" y="3"></rect>
1274
+ <path d="M9 9h6M9 15h6M12 3v18"></path>
1275
+ <circle cx="7" cy="7" r="1"></circle>
1276
+ <circle cx="17" cy="7" r="1"></circle>
1277
+ <circle cx="7" cy="17" r="1"></circle>
1278
+ <circle cx="17" cy="17" r="1"></circle>
1279
+ </symbol>
1280
+ <symbol fill="none" id="icon-property" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1281
+ <path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path>
1282
+ <polyline points="9 22 9 12 15 12 15 22"></polyline>
1283
+ </symbol>
1284
+ <symbol fill="none" id="icon-target" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1285
+ <circle cx="12" cy="12" r="10"></circle>
1286
+ <circle cx="12" cy="12" r="6"></circle>
1287
+ <circle cx="12" cy="12" r="2"></circle>
1288
+ <line x1="12" x2="12" y1="2" y2="6"></line>
1289
+ <line x1="12" x2="12" y1="18" y2="22"></line>
1290
+ <line x1="2" x2="6" y1="12" y2="12"></line>
1291
+ <line x1="18" x2="22" y1="12" y2="12"></line>
1292
+ </symbol>
1293
+ <symbol fill="none" id="icon-mountain" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1294
+ <path d="M3 20l9-9 9 9H3z"></path>
1295
+ <path d="M3 20h18M12 11v9"></path>
1296
+ <path d="M6 17l3-3 3 3 3-3 3 3"></path>
1297
+ </symbol>
1298
+ <symbol fill="none" id="icon-chat" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1299
+ <path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"></path>
1300
+ </symbol>
1301
+ <symbol fill="none" id="icon-close" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1302
+ <line x1="18" x2="6" y1="6" y2="18"></line>
1303
+ <line x1="6" x2="18" y1="6" y2="18"></line>
1304
+ </symbol>
1305
+ <symbol fill="none" id="icon-send" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1306
+ <line x1="22" x2="11" y1="2" y2="13"></line>
1307
+ <polygon points="22 2 15 22 11 13 2 9 22 2"></polygon>
1308
+ </symbol>
1309
+ <symbol fill="none" id="icon-language" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1310
+ <circle cx="12" cy="12" r="10"></circle>
1311
+ <line x1="2" x2="22" y1="12" y2="12"></line>
1312
+ <line x1="12" x2="15" y1="2" y2="12"></line>
1313
+ <line x1="12" x2="9" y1="22" y2="12"></line>
1314
+ </symbol>
1315
+ <symbol fill="none" id="icon-email" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1316
+ <path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"></path>
1317
+ <polyline points="22,6 12,13 2,6"></polyline>
1318
+ </symbol>
1319
+ <symbol fill="none" id="icon-phone" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1320
+ <path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"></path>
1321
+ </symbol>
1322
+ <symbol fill="none" id="icon-location" stroke="currentColor" stroke-width="2" viewbox="0 0 24 24">
1323
+ <path d="M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0 1 18 0z"></path>
1324
+ <circle cx="12" cy="10" r="3"></circle>
1325
+ </symbol>
1326
+ </svg>
1327
+ <!-- Navigation -->
1328
+ <nav>
1329
+ <div class="nav-container">
1330
+ <div class="logo-section" onclick="navigateTo('home')">
1331
+ <div class="logo-mountain">
1332
+ <svg class="icon">
1333
+ <use href="#icon-mountain"></use>
1334
+ </svg>
1335
+ </div>
1336
+ <div class="logo-text">
1337
+ <h1>Summit Practice</h1>
1338
+ <p data-i18n="nav.tagline">Opening Alpine Region to the World</p>
1339
+ </div>
1340
+ </div>
1341
+ <div class="nav-links">
1342
+ <a class="nav-link active" data-i18n="nav.home" data-page="home" onclick="navigateTo('home')">Home</a>
1343
+ <a class="nav-link" data-i18n="nav.about" data-page="about" onclick="navigateTo('about')">About</a>
1344
+ <a class="nav-link" data-i18n="nav.services" data-page="services" onclick="navigateTo('services')">Services</a>
1345
+ <a class="nav-link" data-i18n="nav.contact" data-page="contact" onclick="navigateTo('contact')">Contact</a>
1346
+ <a class="nav-link" data-i18n="nav.gallery" href="./gallery">Gallery</a>
1347
+ <div class="language-switcher">
1348
+ <button class="language-btn" id="language-btn" onclick="window.toggleLanguageMenu()">
1349
+ <svg class="icon">
1350
+ <use href="#icon-language"></use>
1351
+ </svg>
1352
+ <span id="current-lang">EN</span>
1353
+ </button>
1354
+ <div class="language-dropdown" id="language-dropdown">
1355
+ <div class="language-option active" onclick="window.changeLanguage('en')">English</div>
1356
+ <div class="language-option" onclick="window.changeLanguage('ja')">日本語</div>
1357
+ <div class="language-option" onclick="window.changeLanguage('zh')">中文</div>
1358
+ <div class="language-option" onclick="window.changeLanguage('ko')">한국어</div>
1359
+ </div>
1360
+ </div>
1361
+ <button class="btn-primary" data-i18n="nav.dashboard" onclick="window.location.href='./dashboard'">Dashboard</button>
1362
+ </div>
1363
+ </div>
1364
+ </nav>
1365
+ <!-- Home Page -->
1366
+ <div class="page active" id="home-page">
1367
+ <div class="container">
1368
+ <div class="hero">
1369
+ <div class="hero-content">
1370
+ <div class="hero-text">
1371
+ <h1 class="serif">
1372
+ <span data-i18n="hero.title.prefix">Navigating</span> <span class="highlight" data-i18n="hero.titleHighlight">Real Estate Investment</span> <span data-i18n="hero.title.suffix">in Japan</span>
1373
+ </h1>
1374
+ <p data-i18n="hero.subtitle">
1375
+ Expert bilingual support for foreign investors in Alpine Region's stunning Summit region.
1376
+ We bridge language and cultural gaps to help you successfully manage property investments
1377
+ in Japan's world-class ski resort areas.
1378
+ </p>
1379
+ <button class="btn-primary" data-i18n="hero.cta" onclick="navigateTo('contact')">Get in
1380
+ Touch</button>
1381
+ <div class="hero-stats">
1382
+ <div class="stat">
1383
+ <span class="stat-number serif">5+</span>
1384
+ <span class="stat-label" data-i18n="hero.stats.experience">Years Experience</span>
1385
+ </div>
1386
+ <div class="stat">
1387
+ <span class="stat-number serif">N1</span>
1388
+ <span class="stat-label" data-i18n="hero.stats.certified">JLPT Certified</span>
1389
+ </div>
1390
+ <div class="stat">
1391
+ <span class="stat-number serif">100%</span>
1392
+ <span class="stat-label" data-i18n="hero.stats.bilingual">Bilingual</span>
1393
+ </div>
1394
+ </div>
1395
+ </div>
1396
+ <div class="hero-visual" id="hero-visual" style="background: linear-gradient(135deg, var(--orange-primary), var(--orange-dark));">
1397
+ <div class="mountain-illustration" style="display: flex; align-items: center; justify-content: center; flex-direction: column; text-align: center; padding: 2rem; color: white; text-shadow: 0 2px 10px rgba(0,0,0,0.5); position: relative; z-index: 2;">
1398
+ <svg style="width: 120px; height: 120px; margin-bottom: 1rem; stroke: white; fill: rgba(255,255,255,0.2);" viewbox="0 0 24 24">
1399
+ <use href="#icon-mountain"></use>
1400
+ </svg>
1401
+ <h3 style="font-family: 'Roboto Mono', monospace; font-size: 1.5rem; font-weight: 700; margin-bottom: 0.5rem;">
1402
+ Alpine Region Prefecture</h3>
1403
+ <p style="font-size: 1rem; opacity: 0.95;">Nozawa Onsen • Iiyama • Myoko • Karuizawa</p>
1404
+ </div>
1405
+ </div>
1406
+ </div>
1407
+ </div>
1408
+ <div class="section">
1409
+ <div class="section-header">
1410
+ <h2 class="section-title serif" data-i18n="services.title">Why Summit Practice?</h2>
1411
+ <p class="section-subtitle" data-i18n="services.subtitle">
1412
+ Your trusted local partner for real estate success in Alpine Region, Japan
1413
+ </p>
1414
+ </div>
1415
+ <div class="services-grid">
1416
+ <div class="service-card">
1417
+ <div class="service-icon">
1418
+ <svg>
1419
+ <use href="#icon-translation"></use>
1420
+ </svg>
1421
+ </div>
1422
+ <h3 class="serif" data-i18n="services.translation.title">Translation &amp; Interpretation</h3>
1423
+ <p data-i18n="services.translation.desc">Professional Japanese-English translation for property
1424
+ discussions, contractor meetings, site visits, and documents.</p>
1425
+ </div>
1426
+ <div class="service-card">
1427
+ <div class="service-icon">
1428
+ <svg>
1429
+ <use href="#icon-handshake"></use>
1430
+ </svg>
1431
+ </div>
1432
+ <h3 class="serif" data-i18n="services.liaison.title">Client Liaison Services</h3>
1433
+ <p data-i18n="services.liaison.desc">Support for Japanese businesses handling foreign clients,
1434
+ ensuring smooth communication and expectation alignment.</p>
1435
+ </div>
1436
+ <div class="service-card">
1437
+ <div class="service-icon">
1438
+ <svg>
1439
+ <use href="#icon-network"></use>
1440
+ </svg>
1441
+ </div>
1442
+ <h3 class="serif" data-i18n="services.coordination.title">Introductions &amp; Coordination</h3>
1443
+ <p data-i18n="services.coordination.desc">Connect with trusted local realtors and contractors.
1444
+ Complete coordination support throughout your project.</p>
1445
+ </div>
1446
+ <div class="service-card">
1447
+ <div class="service-icon">
1448
+ <svg>
1449
+ <use href="#icon-construction"></use>
1450
+ </svg>
1451
+ </div>
1452
+ <h3 class="serif" data-i18n="services.project.title">Project Support</h3>
1453
+ <p data-i18n="services.project.desc">Renovation and improvement project coordination, schedule
1454
+ tracking, budget management, and on-site check-ins.</p>
1455
+ </div>
1456
+ <div class="service-card">
1457
+ <div class="service-icon">
1458
+ <svg>
1459
+ <use href="#icon-property"></use>
1460
+ </svg>
1461
+ </div>
1462
+ <h3 class="serif" data-i18n="services.management.title">Property Management</h3>
1463
+ <p data-i18n="services.management.desc">Routine property checks, keyholding services, and repair
1464
+ coordination for absentee owners.</p>
1465
+ </div>
1466
+ <div class="service-card">
1467
+ <div class="service-icon">
1468
+ <svg>
1469
+ <use href="#icon-target"></use>
1470
+ </svg>
1471
+ </div>
1472
+ <h3 class="serif" data-i18n="services.cultural.title">Cultural Bridge</h3>
1473
+ <p data-i18n="services.cultural.desc">Navigate the cultural expectations that often lead to
1474
+ missed deadlines and budget overruns.</p>
1475
+ </div>
1476
+ </div>
1477
+ </div>
1478
+ </div>
1479
+ </div>
1480
+ <!-- About Page -->
1481
+ <div class="page" id="about-page">
1482
+ <div class="container">
1483
+ <!-- Profile Hero Section -->
1484
+ <div class="profile-hero" style="margin-bottom: 4rem;">
1485
+ <div class="profile-hero-content">
1486
+ <div class="profile-image-container">
1487
+ <img alt="Alex Rowan" class="profile-image" id="Summit-profile-image" loading="eager" src="" style="background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); display: flex; align-items: center; justify-content: center; color: white; font-size: 1.2rem;"/>
1488
+ <div id="profile-image-placeholder" style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); color: white; font-weight: 600; z-index: 1; pointer-events: none;">
1489
+ Upload Profile Image</div>
1490
+ <div class="profile-badge">
1491
+ <svg style="width: 24px; height: 24px; stroke: white; fill: none;">
1492
+ <use href="#icon-mountain"></use>
1493
+ </svg>
1494
+ <span>Mt. Goryudake 2814m</span>
1495
+ </div>
1496
+ </div>
1497
+ <div class="profile-info">
1498
+ <h1 class="serif" style="font-size: 3rem; margin-bottom: 1rem; color: var(--text-dark);">summit-team</h1>
1499
+ <p class="profile-tagline" style="font-size: 1.3rem; color: var(--orange-primary); font-weight: 600; margin-bottom: 1.5rem;">
1500
+ Your Local Expert in Alpine Region Prefecture
1501
+ </p>
1502
+ <p class="profile-bio" style="font-size: 1.1rem; line-height: 1.8; color: var(--text-gray); margin-bottom: 2rem;">
1503
+ Bilingual consultant specializing in real estate investment support for foreign investors.
1504
+ First non-Japanese Town Development Officer in Alpine Region Prefecture.
1505
+ Deeply connected to the local community with extensive experience bridging cultural and
1506
+ linguistic gaps.
1507
+ </p>
1508
+ <div class="profile-social" style="display: flex; gap: 1rem; align-items: center;">
1509
+ <a class="social-link" href="#social" rel="noopener noreferrer" style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); color: white; border-radius: 8px; text-decoration: none; font-weight: 600; transition: transform 0.3s ease, box-shadow 0.3s ease;" target="_blank">
1510
+ <svg style="width: 20px; height: 20px; fill: white;" viewbox="0 0 24 24">
1511
+ <path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"></path>
1512
+ </svg>
1513
+ <span>Connect on Facebook</span>
1514
+ </a>
1515
+ </div>
1516
+ </div>
1517
+ </div>
1518
+ </div>
1519
+ <div class="section">
1520
+ <div class="section-header">
1521
+ <h2 class="section-title serif" data-i18n="about.title">About Alex Rowan</h2>
1522
+ <p class="section-subtitle" data-i18n="about.subtitle">
1523
+ Your local expert with deep roots in Alpine Region
1524
+ </p>
1525
+ </div>
1526
+ <div class="about-content">
1527
+ <div class="about-text">
1528
+ <p data-i18n="about.intro1">
1529
+ Summit Practice is a Alpine Region-based bilingual consulting service operated by Alex Rowan,
1530
+ specializing in supporting foreign real estate investors and Japanese construction firms.
1531
+ I help international clients navigate the practical realities of buying, renovating, and
1532
+ maintaining property in Japan.
1533
+ </p>
1534
+ <p data-i18n="about.intro2">
1535
+ My service area is centered on the world-class ski resort Nozawa Onsen, which was featured
1536
+ on the cover of Condé Nast Traveler as one of the world's top 9 ski resorts for the 2026
1537
+ season.
1538
+ I also work in the surrounding region including Iiyama, Shinano, Myoko, Karuizawa, and
1539
+ nearby resort areas.
1540
+ </p>
1541
+ <p data-i18n="about.intro3">
1542
+ I relocated to Alpine Region Prefecture after earning my Master's Degree in Anthropology in 2015.
1543
+ Since then, I have amassed wide-ranging professional experience in Alpine Region across both the
1544
+ public and private sectors. I worked as an English teacher on the JET Program, serving two
1545
+ years as President of Alpine Region AJET.
1546
+ </p>
1547
+ <p data-i18n="about.intro4">
1548
+ From 2020 to 2021, I was employed by Tomi City on ecotourism development at the Tomi Tourism
1549
+ Association, where I became the first non-Japanese Town Development Officer in Alpine Region
1550
+ Prefecture.
1551
+ More recently, I worked in the Japanese mushroom industry, handling marketing and
1552
+ international
1553
+ client management for a Alpine Region-based export firm.
1554
+ </p>
1555
+ </div>
1556
+ <div>
1557
+ <div class="credentials">
1558
+ <h4 class="serif" data-i18n="about.qualifications">Qualifications &amp; Experience</h4>
1559
+ <ul data-i18n-list="about.qualifications">
1560
+ <li>JLPT N1 Certification (Highest Level of Japanese Fluency)</li>
1561
+ <li>5+ Years Technical Japanese-English Translation &amp; Interpretation</li>
1562
+ <li>Master's Degree in Anthropology</li>
1563
+ <li>First Non-Japanese Town Development Officer in Alpine Region Prefecture</li>
1564
+ <li>President of Alpine Region AJET (2 Years)</li>
1565
+ <li>Deep Construction Industry Connections Through Family Ties</li>
1566
+ <li>Export Industry Experience in International Client Management</li>
1567
+ </ul>
1568
+ </div>
1569
+ <div class="credentials">
1570
+ <h4 class="serif" data-i18n="about.serviceAreas">Service Areas</h4>
1571
+ <ul data-i18n-list="about.serviceAreas">
1572
+ <li>Nozawa Onsen (Primary Focus)</li>
1573
+ <li>Iiyama</li>
1574
+ <li>Shinano</li>
1575
+ <li>Myoko</li>
1576
+ <li>Karuizawa</li>
1577
+ <li>Komoro Region</li>
1578
+ </ul>
1579
+ </div>
1580
+ </div>
1581
+ </div>
1582
+ <!-- Service Areas Showcase -->
1583
+ <div class="area-showcase">
1584
+ <div class="section-header">
1585
+ <h2 class="section-title serif" data-i18n="about.serviceAreas">Service Areas</h2>
1586
+ <p class="section-subtitle">Beautiful regions we serve in Alpine Region Prefecture</p>
1587
+ </div>
1588
+ <div class="area-grid" id="area-showcase-grid">
1589
+ <!-- Area images will load from R2 assets -->
1590
+ <div style="grid-column: 1/-1; text-align: center; padding: 2rem; color: var(--text-gray);">
1591
+ <p>Area showcase images will appear here once uploaded via the dashboard.</p>
1592
+ </div>
1593
+ </div>
1594
+ </div>
1595
+ <!-- Portfolio Gallery Section -->
1596
+ <div class="portfolio-section" style="margin-top: 6rem; padding-top: 4rem; border-top: 2px solid color-mix(in srgb, var(--orange-primary) 20%, transparent);">
1597
+ <div class="section-header">
1598
+ <h2 class="section-title serif">Mountain Photography &amp; Adventures</h2>
1599
+ <p class="section-subtitle">Summit team's journeys through Japan's most beautiful mountains -
1600
+ showcasing the regions we serve</p>
1601
+ <a href="./gallery" onmouseout="this.style.transform=''; this.style.boxShadow=''" onmouseover="this.style.transform='translateY(-2px)'; this.style.boxShadow='0 8px 20px rgba(255, 140, 66, 0.4)'" style="display: inline-block; margin-top: 1.5rem; padding: 0.75rem 2rem; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); color: white; text-decoration: none; border-radius: 8px; font-weight: 600; transition: transform 0.3s ease, box-shadow 0.3s ease;">View Full Gallery →</a>
1602
+ </div>
1603
+ <div class="portfolio-grid" id="portfolio-gallery">
1604
+ <!-- Portfolio images will be loaded from R2 assets -->
1605
+ <div class="loading-placeholder" style="text-align: center; padding: 3rem; color: var(--text-gray);">
1606
+ Loading Summit team's mountain photography...
1607
+ </div>
1608
+ </div>
1609
+ </div>
1610
+ </div>
1611
+ </div>
1612
+ </div>
1613
+ <!-- Services Page -->
1614
+ <div class="page" id="services-page">
1615
+ <div class="container">
1616
+ <div class="section">
1617
+ <div class="section-header">
1618
+ <h2 class="section-title serif" data-i18n="servicesPage.title">Our Services</h2>
1619
+ <p class="section-subtitle" data-i18n="servicesPage.subtitle">
1620
+ Comprehensive support for your real estate journey in Japan
1621
+ </p>
1622
+ </div>
1623
+ <div style="display: grid; gap: 3rem;">
1624
+ <div class="service-card" style="display: grid; grid-template-columns: 80px 1fr; gap: 2rem;">
1625
+ <div class="service-icon" style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); border-radius: 12px;">
1626
+ <svg style="width: 40px; height: 40px; stroke: white; fill: none;">
1627
+ <use href="#icon-translation"></use>
1628
+ </svg>
1629
+ </div>
1630
+ <div>
1631
+ <h3 class="serif" data-i18n="servicesPage.translation.title" style="font-size: 2rem;">
1632
+ Translation &amp; Interpretation</h3>
1633
+ <p data-i18n="servicesPage.translation.desc" style="margin-bottom: 1.5rem;">Professional
1634
+ Japanese-English translation and
1635
+ interpretation services for all aspects of your property investment.</p>
1636
+ <ul class="service-features" data-i18n-features="translation">
1637
+ <li>Property discussion translation</li>
1638
+ <li>Contractor meeting interpretation</li>
1639
+ <li>Site visit coordination</li>
1640
+ <li>Document translation</li>
1641
+ <li>Legal document review</li>
1642
+ <li>Contract negotiation support</li>
1643
+ </ul>
1644
+ </div>
1645
+ </div>
1646
+ <div class="service-card" style="display: grid; grid-template-columns: 80px 1fr; gap: 2rem;">
1647
+ <div class="service-icon" style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); border-radius: 12px;">
1648
+ <svg style="width: 40px; height: 40px; stroke: white; fill: none;">
1649
+ <use href="#icon-handshake"></use>
1650
+ </svg>
1651
+ </div>
1652
+ <div>
1653
+ <h3 class="serif" data-i18n="servicesPage.liaison.title" style="font-size: 2rem;">Client
1654
+ Liaison for Japanese Businesses</h3>
1655
+ <p data-i18n="servicesPage.liaison.desc" style="margin-bottom: 1.5rem;">Support for Japanese
1656
+ companies handling foreign clients,
1657
+ ensuring smooth communication and cultural alignment.</p>
1658
+ <ul class="service-features" data-i18n-features="liaison">
1659
+ <li>Expectation alignment</li>
1660
+ <li>Communication flow management</li>
1661
+ <li>Cultural consultation</li>
1662
+ <li>Foreign client support</li>
1663
+ <li>Business practice guidance</li>
1664
+ <li>Ongoing relationship management</li>
1665
+ </ul>
1666
+ </div>
1667
+ </div>
1668
+ <div class="service-card" style="display: grid; grid-template-columns: 80px 1fr; gap: 2rem;">
1669
+ <div class="service-icon" style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); border-radius: 12px;">
1670
+ <svg style="width: 40px; height: 40px; stroke: white; fill: none;">
1671
+ <use href="#icon-network"></use>
1672
+ </svg>
1673
+ </div>
1674
+ <div>
1675
+ <h3 class="serif" data-i18n="servicesPage.coordination.title" style="font-size: 2rem;">
1676
+ Introductions &amp; Coordination</h3>
1677
+ <p data-i18n="servicesPage.coordination.desc" style="margin-bottom: 1.5rem;">Connect with
1678
+ trusted local professionals and ensure
1679
+ seamless project coordination.</p>
1680
+ <ul class="service-features" data-i18n-features="coordination">
1681
+ <li>Realtor introductions</li>
1682
+ <li>Contractor recommendations</li>
1683
+ <li>Local government liaison</li>
1684
+ <li>Service provider network</li>
1685
+ <li>Project coordination</li>
1686
+ <li>Stakeholder management</li>
1687
+ </ul>
1688
+ </div>
1689
+ </div>
1690
+ <div class="service-card" style="display: grid; grid-template-columns: 80px 1fr; gap: 2rem;">
1691
+ <div class="service-icon" style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); border-radius: 12px;">
1692
+ <svg style="width: 40px; height: 40px; stroke: white; fill: none;">
1693
+ <use href="#icon-construction"></use>
1694
+ </svg>
1695
+ </div>
1696
+ <div>
1697
+ <h3 class="serif" data-i18n="servicesPage.project.title" style="font-size: 2rem;">Renovation
1698
+ / Project Support</h3>
1699
+ <p data-i18n="servicesPage.project.desc" style="margin-bottom: 1.5rem;">Comprehensive
1700
+ support for renovation and improvement
1701
+ projects from planning to completion.</p>
1702
+ <ul class="service-features" data-i18n-features="project">
1703
+ <li>Contractor coordination</li>
1704
+ <li>Schedule tracking</li>
1705
+ <li>Budget management</li>
1706
+ <li>On-site check-ins</li>
1707
+ <li>Issue resolution</li>
1708
+ <li>Quality assurance</li>
1709
+ </ul>
1710
+ </div>
1711
+ </div>
1712
+ <div class="service-card" style="display: grid; grid-template-columns: 80px 1fr; gap: 2rem;">
1713
+ <div class="service-icon" style="width: 80px; height: 80px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); border-radius: 12px;">
1714
+ <svg style="width: 40px; height: 40px; stroke: white; fill: none;">
1715
+ <use href="#icon-property"></use>
1716
+ </svg>
1717
+ </div>
1718
+ <div>
1719
+ <h3 class="serif" data-i18n="servicesPage.management.title" style="font-size: 2rem;">
1720
+ Property Care &amp; Management</h3>
1721
+ <p data-i18n="servicesPage.management.desc" style="margin-bottom: 1.5rem;">Reliable property
1722
+ management services for absentee owners.
1723
+ </p>
1724
+ <ul class="service-features" data-i18n-features="management">
1725
+ <li>Routine property checks</li>
1726
+ <li>Keyholding services</li>
1727
+ <li>Repair coordination</li>
1728
+ <li>Maintenance scheduling</li>
1729
+ <li>Emergency response</li>
1730
+ <li>Seasonal preparation</li>
1731
+ </ul>
1732
+ </div>
1733
+ </div>
1734
+ </div>
1735
+ </div>
1736
+ </div>
1737
+ </div>
1738
+ <!-- Contact Page -->
1739
+ <div class="page" id="contact-page">
1740
+ <div class="container">
1741
+ <div class="section">
1742
+ <div class="section-header">
1743
+ <h2 class="section-title serif">Get in Touch</h2>
1744
+ <p class="section-subtitle">
1745
+ Ready to start your real estate journey in Alpine Region?
1746
+ </p>
1747
+ </div>
1748
+ <div class="contact-content">
1749
+ <div class="contact-info">
1750
+ <div class="contact-item">
1751
+ <div class="contact-icon">
1752
+ <svg>
1753
+ <use href="#icon-email"></use>
1754
+ </svg>
1755
+ </div>
1756
+ <div class="contact-details">
1757
+ <h4>Email</h4>
1758
+ <p><a href="mailto:[email protected]">[email protected]</a></p>
1759
+ </div>
1760
+ </div>
1761
+ <div class="contact-item">
1762
+ <div class="contact-icon">
1763
+ <svg>
1764
+ <use href="#icon-phone"></use>
1765
+ </svg>
1766
+ </div>
1767
+ <div class="contact-details">
1768
+ <h4>Phone</h4>
1769
+ <p>+81 070-7476-5362</p>
1770
+ </div>
1771
+ </div>
1772
+ <div class="contact-item">
1773
+ <div class="contact-icon">
1774
+ <svg>
1775
+ <use href="#icon-location"></use>
1776
+ </svg>
1777
+ </div>
1778
+ <div class="contact-details">
1779
+ <h4>Location</h4>
1780
+ <p>Alpine Region Prefecture, Japan</p>
1781
+ <p style="font-size: 0.9rem; margin-top: 0.25rem;">長野県小諸市</p>
1782
+ </div>
1783
+ </div>
1784
+ <div class="contact-item">
1785
+ <div class="contact-icon">
1786
+ <svg>
1787
+ <use href="#icon-mountain"></use>
1788
+ </svg>
1789
+ </div>
1790
+ <div class="contact-details">
1791
+ <h4>Service Areas</h4>
1792
+ <p>Nozawa Onsen, Iiyama, Shinano, Myoko, Karuizawa</p>
1793
+ </div>
1794
+ </div>
1795
+ </div>
1796
+ <div class="contact-form">
1797
+ <form id="contactForm" onsubmit="handleContactSubmit(event)">
1798
+ <div class="form-group">
1799
+ <label data-i18n="contact.name">Name</label>
1800
+ <input id="name" required="" type="text"/>
1801
+ </div>
1802
+ <div class="form-group">
1803
+ <label data-i18n="contact.email">Email</label>
1804
+ <input data-i18n-placeholder="contact.emailPlaceholder" id="email" placeholder="your.email@example.com" required="" type="email"/>
1805
+ </div>
1806
+ <div class="form-group">
1807
+ <label data-i18n="contact.subject">Subject</label>
1808
+ <input id="subject" required="" type="text"/>
1809
+ </div>
1810
+ <div class="form-group">
1811
+ <label data-i18n="contact.message">Message</label>
1812
+ <textarea id="message" required=""></textarea>
1813
+ </div>
1814
+ <button class="btn-primary" data-i18n="contact.send" style="width: 100%;" type="submit">
1815
+ Send Message
1816
+ </button>
1817
+ </form>
1818
+ </div>
1819
+ </div>
1820
+ </div>
1821
+ </div>
1822
+ </div>
1823
+ <!-- Dashboard Page -->
1824
+ <div class="page" id="dashboard-page">
1825
+ <div class="container">
1826
+ <div class="dashboard-header">
1827
+ <h2 class="serif" style="font-size: 2.5rem; margin-bottom: 0.5rem;">
1828
+ Business Dashboard
1829
+ </h2>
1830
+ <p style="color: var(--text-gray);">
1831
+ Manage your clients, properties, and projects
1832
+ </p>
1833
+ </div>
1834
+ <div id="dashboard-content">
1835
+ <div class="dashboard-grid">
1836
+ <div class="dashboard-card">
1837
+ <h3>Total Clients</h3>
1838
+ <div class="dashboard-number" id="clientsCount">0</div>
1839
+ </div>
1840
+ <div class="dashboard-card">
1841
+ <h3>Properties</h3>
1842
+ <div class="dashboard-number" id="propertiesCount">0</div>
1843
+ </div>
1844
+ <div class="dashboard-card">
1845
+ <h3>Active Projects</h3>
1846
+ <div class="dashboard-number" id="projectsCount">0</div>
1847
+ </div>
1848
+ </div>
1849
+ <div class="data-table">
1850
+ <h3>Recent Clients</h3>
1851
+ <table>
1852
+ <thead>
1853
+ <tr>
1854
+ <th>Name</th>
1855
+ <th>Email</th>
1856
+ <th>Country</th>
1857
+ <th>Status</th>
1858
+ </tr>
1859
+ </thead>
1860
+ <tbody id="clientsTable">
1861
+ <tr>
1862
+ <td colspan="4" style="text-align: center; padding: 2rem;">
1863
+ <div class="spinner"></div>
1864
+ </td>
1865
+ </tr>
1866
+ </tbody>
1867
+ </table>
1868
+ </div>
1869
+ <div class="data-table">
1870
+ <h3>Recent Projects</h3>
1871
+ <table>
1872
+ <thead>
1873
+ <tr>
1874
+ <th>Name</th>
1875
+ <th>Type</th>
1876
+ <th>Status</th>
1877
+ <th>Budget</th>
1878
+ </tr>
1879
+ </thead>
1880
+ <tbody id="projectsTable">
1881
+ <tr>
1882
+ <td colspan="4" style="text-align: center; padding: 2rem;">
1883
+ <div class="spinner"></div>
1884
+ </td>
1885
+ </tr>
1886
+ </tbody>
1887
+ </table>
1888
+ </div>
1889
+ </div>
1890
+ </div>
1891
+ </div>
1892
+ <!-- Footer -->
1893
+ <footer>
1894
+ <div class="container">
1895
+ <div class="footer-content">
1896
+ <div class="footer-brand">
1897
+ <h3 class="serif">Summit Practice</h3>
1898
+ <p>
1899
+ Opening Alpine Region to the world. Expert bilingual support for foreign
1900
+ real estate investors in Japan's stunning Summit region.
1901
+ </p>
1902
+ <p style="margin-top: 1rem; font-size: 0.9rem;">
1903
+ 通訳・翻訳・海外向けのマーケティング&コンサルティング
1904
+ </p>
1905
+ </div>
1906
+ <div class="footer-links">
1907
+ <h4>Quick Links</h4>
1908
+ <ul>
1909
+ <li><a onclick="navigateTo('home')">Home</a></li>
1910
+ <li><a onclick="navigateTo('about')">About</a></li>
1911
+ <li><a onclick="navigateTo('services')">Services</a></li>
1912
+ <li><a onclick="navigateTo('contact')">Contact</a></li>
1913
+ </ul>
1914
+ </div>
1915
+ <div class="footer-links">
1916
+ <h4>Contact</h4>
1917
+ <ul>
1918
+ <li><a href="mailto:[email protected]">[email protected]</a></li>
1919
+ <li>+81 070-7476-5362</li>
1920
+ <li>Alpine Region Prefecture</li>
1921
+ <li>長野県小諸市</li>
1922
+ </ul>
1923
+ </div>
1924
+ </div>
1925
+ <div class="footer-bottom">
1926
+ <p>© 2024 Summit Practice - All Rights Reserved</p>
1927
+ </div>
1928
+ </div>
1929
+ </footer>
1930
+ <script>
1931
+ // ===== CONFIGURATION =====
1932
+ const API_CONFIG = {
1933
+ apiUrl: 'https://Summit-solutions.meauxbility.workers.dev'
1934
+ };
1935
+
1936
+ // ===== LANGUAGE MANAGEMENT =====
1937
+ window.toggleLanguageMenu = function () {
1938
+ const dropdown = document.getElementById('language-dropdown');
1939
+ if (dropdown) {
1940
+ dropdown.classList.toggle('open');
1941
+ }
1942
+ };
1943
+
1944
+ window.changeLanguage = function (langCode) {
1945
+ // Store language preference immediately
1946
+ localStorage.setItem('Summit_language', langCode);
1947
+
1948
+ // Update UI immediately
1949
+ updateLanguageUI(langCode);
1950
+
1951
+ // Function to actually update content
1952
+ const doUpdate = () => {
1953
+ if (window.i18n && window.i18n.translations && window.i18n.translations[langCode]) {
1954
+ // Update current language
1955
+ window.i18n.currentLanguage = langCode;
1956
+ document.documentElement.lang = langCode;
1957
+
1958
+ // Force immediate content update - call multiple times to ensure it works
1959
+ if (window.i18n.updatePageContent) {
1960
+ window.i18n.updatePageContent();
1961
+ }
1962
+
1963
+ // Update chatbot
1964
+ if (window.SummitChatbot) {
1965
+ window.SummitChatbot.setLanguage(langCode);
1966
+ }
1967
+ return true;
1968
+ }
1969
+ return false;
1970
+ };
1971
+
1972
+ // Try immediately
1973
+ if (!doUpdate()) {
1974
+ // Retry if i18n not loaded yet
1975
+ let retries = 0;
1976
+ const retryInterval = setInterval(() => {
1977
+ retries++;
1978
+ if (doUpdate()) {
1979
+ clearInterval(retryInterval);
1980
+ } else if (retries > 30) {
1981
+ clearInterval(retryInterval);
1982
+ alert('Language switching failed. Please refresh the page.');
1983
+ }
1984
+ }, 100);
1985
+ } else {
1986
+ // Even if it worked, do additional updates to catch any missed elements
1987
+ setTimeout(doUpdate, 50);
1988
+ setTimeout(doUpdate, 150);
1989
+ setTimeout(doUpdate, 300);
1990
+ }
1991
+
1992
+ const dropdown = document.getElementById('language-dropdown');
1993
+ if (dropdown) {
1994
+ dropdown.classList.remove('open');
1995
+ }
1996
+ };
1997
+
1998
+ function updateLanguageUI(langCode) {
1999
+ const langMap = { en: 'EN', ja: 'JA', zh: 'ZH', ko: 'KO' };
2000
+ const currentLangEl = document.getElementById('current-lang');
2001
+ if (currentLangEl) {
2002
+ currentLangEl.textContent = langMap[langCode] || 'EN';
2003
+ }
2004
+
2005
+ const options = document.querySelectorAll('.language-option');
2006
+ options.forEach(opt => {
2007
+ opt.classList.remove('active');
2008
+ const onclick = opt.getAttribute('onclick') || '';
2009
+ if (onclick.includes(`'${langCode}'`) || onclick.includes(`"${langCode}"`)) {
2010
+ opt.classList.add('active');
2011
+ }
2012
+ });
2013
+ }
2014
+
2015
+ // Close language dropdown when clicking outside
2016
+ document.addEventListener('click', (e) => {
2017
+ const dropdown = document.getElementById('language-dropdown');
2018
+ const btn = document.getElementById('language-btn');
2019
+ if (dropdown && btn && !dropdown.contains(e.target) && !btn.contains(e.target)) {
2020
+ dropdown.classList.remove('open');
2021
+ }
2022
+ });
2023
+
2024
+ // ===== NAVIGATION =====
2025
+ function navigateTo(pageName) {
2026
+ // Hide all pages
2027
+ const pages = document.querySelectorAll('.page');
2028
+ pages.forEach(page => page.classList.remove('active'));
2029
+
2030
+ // Show selected page
2031
+ const targetPage = document.getElementById(pageName + '-page');
2032
+ if (targetPage) {
2033
+ targetPage.classList.add('active');
2034
+ }
2035
+
2036
+ // Load portfolio images when About page is shown
2037
+ if (pageName === 'about') {
2038
+ setTimeout(() => {
2039
+ if (typeof loadPortfolioImages === 'function') loadPortfolioImages();
2040
+ if (typeof loadProfileImage === 'function') loadProfileImage();
2041
+ }, 100);
2042
+ }
2043
+
2044
+ // Update nav links
2045
+ const navLinks = document.querySelectorAll('.nav-link');
2046
+ navLinks.forEach(link => {
2047
+ if (link.getAttribute('data-page') === pageName) {
2048
+ link.classList.add('active');
2049
+ } else {
2050
+ link.classList.remove('active');
2051
+ }
2052
+ });
2053
+
2054
+ // Load dashboard data if navigating to dashboard
2055
+ if (pageName === 'dashboard') {
2056
+ loadDashboardData();
2057
+ }
2058
+
2059
+ // Scroll to top
2060
+ window.scrollTo(0, 0);
2061
+ }
2062
+
2063
+ // ===== CONTACT FORM =====
2064
+ function handleContactSubmit(event) {
2065
+ event.preventDefault();
2066
+ const name = document.getElementById('name').value;
2067
+ const email = document.getElementById('email').value;
2068
+ const subject = document.getElementById('subject').value;
2069
+ const message = document.getElementById('message').value;
2070
+
2071
+ alert(`Thank you for your message, ${name}! Summit will get back to you soon at ${email}.`);
2072
+
2073
+ // Reset form
2074
+ document.getElementById('contactForm').reset();
2075
+ }
2076
+
2077
+ // ===== DASHBOARD =====
2078
+ function loadDashboardData() {
2079
+ // Load data from API
2080
+ loadClients();
2081
+ loadProperties();
2082
+ loadProjects();
2083
+ }
2084
+
2085
+ async function loadClients() {
2086
+ try {
2087
+ const response = await fetch(`${API_CONFIG.apiUrl}/api/clients`);
2088
+
2089
+ if (response.ok) {
2090
+ const data = await response.json();
2091
+ const clients = data.data || [];
2092
+
2093
+ document.getElementById('clientsCount').textContent = clients.length;
2094
+
2095
+ const tableBody = document.getElementById('clientsTable');
2096
+ if (clients.length === 0) {
2097
+ tableBody.innerHTML = '<tr><td colspan="4" style="text-align: center; padding: 2rem; color: var(--text-gray);">No clients yet. Start by creating your first client!</td></tr>';
2098
+ } else {
2099
+ tableBody.innerHTML = clients.slice(0, 10).map(client => `
2100
+ <tr>
2101
+ <td>${client.name || 'N/A'}</td>
2102
+ <td>${client.email || 'N/A'}</td>
2103
+ <td>${client.country || 'N/A'}</td>
2104
+ <td><span class="badge badge-success">${client.status || 'active'}</span></td>
2105
+ </tr>
2106
+ `).join('');
2107
+ }
2108
+ } else {
2109
+ throw new Error('Failed to load clients');
2110
+ }
2111
+ } catch (error) {
2112
+ console.error('Error loading clients:', error);
2113
+ document.getElementById('clientsCount').textContent = '—';
2114
+ document.getElementById('clientsTable').innerHTML = '<tr><td colspan="4" style="text-align: center; padding: 2rem; color: var(--text-gray);">Failed to load clients. Check API connection.</td></tr>';
2115
+ }
2116
+ }
2117
+
2118
+ async function loadProperties() {
2119
+ try {
2120
+ const response = await fetch(`${API_CONFIG.apiUrl}/api/properties`);
2121
+
2122
+ if (response.ok) {
2123
+ const data = await response.json();
2124
+ const properties = data.data || [];
2125
+ document.getElementById('propertiesCount').textContent = properties.length;
2126
+ } else {
2127
+ throw new Error('Failed to load properties');
2128
+ }
2129
+ } catch (error) {
2130
+ console.error('Error loading properties:', error);
2131
+ document.getElementById('propertiesCount').textContent = '—';
2132
+ }
2133
+ }
2134
+
2135
+ async function loadProjects() {
2136
+ try {
2137
+ const response = await fetch(`${API_CONFIG.apiUrl}/api/projects`);
2138
+
2139
+ if (response.ok) {
2140
+ const data = await response.json();
2141
+ const projects = data.data || [];
2142
+ const activeProjects = projects.filter(p => p.status === 'in_progress' || p.status === 'planning');
2143
+
2144
+ document.getElementById('projectsCount').textContent = activeProjects.length;
2145
+
2146
+ const tableBody = document.getElementById('projectsTable');
2147
+ if (projects.length === 0) {
2148
+ tableBody.innerHTML = '<tr><td colspan="4" style="text-align: center; padding: 2rem; color: var(--text-gray);">No projects yet. Start tracking your first project!</td></tr>';
2149
+ } else {
2150
+ tableBody.innerHTML = projects.slice(0, 10).map(project => {
2151
+ let badgeClass = 'badge-warning';
2152
+ if (project.status === 'completed') badgeClass = 'badge-success';
2153
+ if (project.status === 'in_progress') badgeClass = 'badge-info';
2154
+
2155
+ return `
2156
+ <tr>
2157
+ <td>${project.name || 'N/A'}</td>
2158
+ <td>${project.project_type || 'N/A'}</td>
2159
+ <td><span class="badge ${badgeClass}">${project.status || 'N/A'}</span></td>
2160
+ <td>${project.budget ? '¥' + project.budget.toLocaleString() : 'N/A'}</td>
2161
+ </tr>
2162
+ `;
2163
+ }).join('');
2164
+ }
2165
+ } else {
2166
+ throw new Error('Failed to load projects');
2167
+ }
2168
+ } catch (error) {
2169
+ console.error('Error loading projects:', error);
2170
+ document.getElementById('projectsCount').textContent = '—';
2171
+ document.getElementById('projectsTable').innerHTML = '<tr><td colspan="4" style="text-align: center; padding: 2rem; color: var(--text-gray);">Failed to load projects. Check API connection.</td></tr>';
2172
+ }
2173
+ }
2174
+
2175
+ // ===== INITIALIZATION =====
2176
+ document.addEventListener('DOMContentLoaded', () => {
2177
+ // Initialize theme system (for dashboard only)
2178
+ if (window.initTheme) {
2179
+ window.initTheme();
2180
+ }
2181
+
2182
+ // Wait for i18n to load
2183
+ const initI18n = () => {
2184
+ if (window.i18n && window.i18n.translations && Object.keys(window.i18n.translations).length > 0) {
2185
+ const detectedLang = window.i18n.detectLanguage();
2186
+ window.i18n.currentLanguage = detectedLang;
2187
+ document.documentElement.lang = detectedLang;
2188
+ updateLanguageUI(detectedLang);
2189
+
2190
+ // Initialize chatbot
2191
+ if (typeof SummitChatbot !== 'undefined') {
2192
+ window.SummitChatbot = new SummitChatbot(API_CONFIG.apiUrl);
2193
+ window.SummitChatbot.setLanguage(window.i18n.currentLanguage);
2194
+ }
2195
+
2196
+ // Update page content after initialization - ensure DOM is ready
2197
+ // Use multiple attempts to ensure it works
2198
+ const updateContent = () => {
2199
+ if (window.i18n && window.i18n.updatePageContent) {
2200
+ window.i18n.updatePageContent();
2201
+ }
2202
+ };
2203
+
2204
+ // Immediate update
2205
+ requestAnimationFrame(updateContent);
2206
+ // Delayed updates to catch any late-loading elements
2207
+ setTimeout(updateContent, 100);
2208
+ setTimeout(updateContent, 300);
2209
+ setTimeout(updateContent, 500);
2210
+ } else {
2211
+ // Retry if i18n not loaded yet
2212
+ setTimeout(initI18n, 50);
2213
+ }
2214
+ };
2215
+
2216
+ initI18n();
2217
+
2218
+ // Load hero background image from R2
2219
+ async function loadHeroImage() {
2220
+ try {
2221
+ const API_URL = window.location.origin;
2222
+ const response = await fetch(`${API_URL}/api/assets?category=hero&type=image&limit=1`);
2223
+ const data = await response.json();
2224
+
2225
+ if (data.success && data.data && data.data.length > 0 && data.data[0].r2_key) {
2226
+ const heroVisual = document.getElementById('hero-visual');
2227
+ if (heroVisual) {
2228
+ const imageUrl = `${API_URL}/api/assets/${data.data[0].id}/view`;
2229
+ heroVisual.style.backgroundImage = `url('${imageUrl}')`;
2230
+ heroVisual.style.backgroundSize = 'cover';
2231
+ heroVisual.style.backgroundPosition = 'center';
2232
+ heroVisual.style.backgroundRepeat = 'no-repeat';
2233
+ }
2234
+ } else {
2235
+ // Fallback: use japansnow.jpg if available
2236
+ const fallbackResponse = await fetch(`${API_URL}/api/assets?type=image`);
2237
+ const fallbackData = await fallbackResponse.json();
2238
+ if (fallbackData.success && fallbackData.data) {
2239
+ const snowImage = fallbackData.data.find(a => a.r2_key && a.r2_key.includes('japansnow'));
2240
+ if (snowImage) {
2241
+ const heroVisual = document.getElementById('hero-visual');
2242
+ if (heroVisual) {
2243
+ const imageUrl = `${API_URL}/api/assets/${snowImage.id}/view`;
2244
+ heroVisual.style.backgroundImage = `url('${imageUrl}')`;
2245
+ heroVisual.style.backgroundSize = 'cover';
2246
+ heroVisual.style.backgroundPosition = 'center';
2247
+ heroVisual.style.backgroundRepeat = 'no-repeat';
2248
+ }
2249
+ }
2250
+ }
2251
+ }
2252
+ } catch (error) {
2253
+ console.log('Hero image not uploaded yet:', error);
2254
+ }
2255
+ }
2256
+
2257
+ // Load area showcase images
2258
+ async function loadAreaShowcase() {
2259
+ try {
2260
+ const API_URL = window.location.origin;
2261
+ // Try to load area-specific images
2262
+ const areas = ['nozawa-onsen', 'iiyama', 'myoko', 'karuizawa', 'shinano', 'komoro'];
2263
+ const areaGrid = document.getElementById('area-showcase-grid');
2264
+ if (!areaGrid) return;
2265
+
2266
+ // For now, show message - images should be uploaded with area tags
2267
+ areaGrid.innerHTML = areas.map(area => {
2268
+ const areaName = area.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');
2269
+ return `
2270
+ <div class="area-card">
2271
+ <div class="area-image" style="background: linear-gradient(135deg, var(--orange-light), var(--orange-primary)); display: flex; align-items: center; justify-content: center; color: white; font-weight: 600; min-height: 200px;">
2272
+ Upload Image
2273
+ </div>
2274
+ <div class="area-content">
2275
+ <h4>${areaName}</h4>
2276
+ <p>Upload images via dashboard Assets section with area tags to display here.</p>
2277
+ </div>
2278
+ </div>
2279
+ `;
2280
+ }).join('');
2281
+ } catch (error) {
2282
+ console.log('Area showcase loading:', error);
2283
+ }
2284
+ }
2285
+
2286
+ // Load portfolio and profile images on initial load
2287
+ if (typeof loadPortfolioImages === 'function') {
2288
+ setTimeout(loadPortfolioImages, 500);
2289
+ }
2290
+ if (typeof loadProfileImage === 'function') {
2291
+ setTimeout(loadProfileImage, 500);
2292
+ }
2293
+ setTimeout(loadHeroImage, 500);
2294
+ setTimeout(loadAreaShowcase, 500);
2295
+ });
2296
+
2297
+ // Load portfolio images from assets (R2 stored) - ONLY actual uploaded images
2298
+ async function loadPortfolioImages() {
2299
+ try {
2300
+ const API_URL = window.location.origin;
2301
+ // Load portfolio category images
2302
+ const response = await fetch(`${API_URL}/api/assets?category=portfolio&type=image&limit=12`);
2303
+ const data = await response.json();
2304
+
2305
+ if (data.success && data.data && data.data.length > 0) {
2306
+ const gallery = document.getElementById('portfolio-gallery');
2307
+ if (gallery) {
2308
+ const images = data.data.filter(asset => asset.r2_key); // Only show images actually in R2
2309
+
2310
+ if (images.length > 0) {
2311
+ gallery.innerHTML = images.map(asset => {
2312
+ const imageUrl = `${API_URL}/api/assets/${asset.id}/view`;
2313
+ const title = asset.title || 'Mountain Photography';
2314
+ const metadata = typeof asset.metadata === 'string' ? JSON.parse(asset.metadata || '{}') : (asset.metadata || {});
2315
+ const location = metadata.location || '';
2316
+
2317
+ return `
2318
+ <div class="portfolio-item" onclick="window.location.href='./gallery'" style="cursor: pointer;">
2319
+ <img src="${imageUrl}"
2320
+ alt="${asset.alt_text || title}"
2321
+ class="portfolio-image"
2322
+ loading="lazy"
2323
+ onerror="this.style.display='none'">
2324
+ <div class="portfolio-overlay">
2325
+ <p class="portfolio-caption">${title}</p>
2326
+ ${location ? `<p style="font-size: 0.9rem; opacity: 0.9; margin-top: 0.25rem;">📍 ${location}</p>` : ''}
2327
+ </div>
2328
+ </div>
2329
+ `;
2330
+ }).join('');
2331
+ } else {
2332
+ gallery.innerHTML = '<div style="text-align: center; padding: 3rem; color: var(--text-gray); grid-column: 1/-1;"><p>Upload Summit team's mountain photography via the dashboard to see images here.</p><p style="margin-top: 1rem;"><a href="./dashboard" style="color: var(--orange-primary); font-weight: 600;">Go to Dashboard →</a></p></div>';
2333
+ }
2334
+ }
2335
+ } else {
2336
+ // Fallback: try loading all images if no portfolio category found
2337
+ const fallbackResponse = await fetch(`${API_URL}/api/assets?type=image&limit=12`);
2338
+ const fallbackData = await fallbackResponse.json();
2339
+
2340
+ const gallery = document.getElementById('portfolio-gallery');
2341
+ if (gallery) {
2342
+ if (fallbackData.success && fallbackData.data && fallbackData.data.length > 0) {
2343
+ const images = fallbackData.data.filter(asset => asset.r2_key);
2344
+ if (images.length > 0) {
2345
+ gallery.innerHTML = images.map(asset => {
2346
+ const imageUrl = `${API_URL}/api/assets/${asset.id}/view`;
2347
+ const title = asset.title || 'Mountain Photography';
2348
+ return `
2349
+ <div class="portfolio-item" onclick="window.location.href='./gallery'" style="cursor: pointer;">
2350
+ <img src="${imageUrl}"
2351
+ alt="${asset.alt_text || title}"
2352
+ class="portfolio-image"
2353
+ loading="lazy"
2354
+ onerror="this.style.display='none'">
2355
+ <div class="portfolio-overlay">
2356
+ <p class="portfolio-caption">${title}</p>
2357
+ </div>
2358
+ </div>
2359
+ `;
2360
+ }).join('');
2361
+ } else {
2362
+ gallery.innerHTML = '<div style="text-align: center; padding: 3rem; color: var(--text-gray); grid-column: 1/-1;"><p>No images uploaded yet. Upload Summit team's photography via the dashboard Assets section.</p><p style="margin-top: 1rem;"><a href="./dashboard" style="color: var(--orange-primary); font-weight: 600;">Upload Images →</a></p></div>';
2363
+ }
2364
+ } else {
2365
+ gallery.innerHTML = '<div style="text-align: center; padding: 3rem; color: var(--text-gray); grid-column: 1/-1;"><p>No images uploaded yet. Upload Summit team's photography via the dashboard Assets section.</p><p style="margin-top: 1rem;"><a href="./dashboard" style="color: var(--orange-primary); font-weight: 600;">Upload Images →</a></p></div>';
2366
+ }
2367
+ }
2368
+ }
2369
+ } catch (error) {
2370
+ console.error('Error loading portfolio images:', error);
2371
+ const gallery = document.getElementById('portfolio-gallery');
2372
+ if (gallery) {
2373
+ gallery.innerHTML = '<div style="text-align: center; padding: 3rem; color: var(--text-gray); grid-column: 1/-1;"><p>Error loading images. Please try again or upload via dashboard.</p></div>';
2374
+ }
2375
+ }
2376
+ }
2377
+
2378
+ // Load Summit team's profile image - ONLY from R2, no placeholders
2379
+ async function loadProfileImage() {
2380
+ try {
2381
+ const API_URL = window.location.origin;
2382
+ const response = await fetch(`${API_URL}/api/assets?category=profile&type=image&limit=1`);
2383
+ const data = await response.json();
2384
+
2385
+ if (data.success && data.data && data.data.length > 0 && data.data[0].r2_key) {
2386
+ const profileImg = document.getElementById('Summit-profile-image');
2387
+ const placeholder = document.getElementById('profile-image-placeholder');
2388
+ if (profileImg) {
2389
+ profileImg.src = `${API_URL}/api/assets/${data.data[0].id}/view`;
2390
+ profileImg.onload = () => {
2391
+ if (placeholder) placeholder.style.display = 'none';
2392
+ };
2393
+ }
2394
+ } else {
2395
+ // Hide placeholder if no image uploaded
2396
+ const placeholder = document.getElementById('profile-image-placeholder');
2397
+ if (placeholder) {
2398
+ placeholder.textContent = 'Upload via Dashboard';
2399
+ placeholder.style.fontSize = '0.9rem';
2400
+ }
2401
+ }
2402
+ } catch (error) {
2403
+ console.log('Profile image not uploaded yet');
2404
+ }
2405
+ }
2406
+
2407
+
2408
+ // Make functions globally available
2409
+ window.toggleLanguageMenu = toggleLanguageMenu;
2410
+ window.changeLanguage = changeLanguage;
2411
+ window.loadPortfolioImages = loadPortfolioImages;
2412
+ window.loadProfileImage = loadProfileImage;
2413
+ </script>
2414
+ </body>
2415
+ </html>