From d3e5b08ff7f42d2ed74afce617d1d7647b105f45 Mon Sep 17 00:00:00 2001 From: "v.snigerev" Date: Fri, 24 Apr 2026 22:06:31 +0300 Subject: [PATCH 1/3] feat(landing): add landing package to monorepo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Next.js 16 + React 19 + Tailwind 4 static landing template with token-driven theming via src/content/site.ts. Canonical 8-route structure (/, /mobile, /business, /pricing, /blog, /contact, /privacy, /terms) shared across ventures — only content varies. Moved from reineira-atlas/.claude/templates/landing/ to keep application code in platform-modules, alongside backend and app. The scaffold pipeline in atlas now ships landing via the existing rsync of platform-modules into each venture. --- packages/landing/.commitlintrc.js | 34 + packages/landing/.env.example | 5 + packages/landing/.gitignore | 42 + packages/landing/.prettierrc | 10 + packages/landing/.stylelintrc.cjs | 40 + packages/landing/CLAUDE.md | 81 + packages/landing/eslint.config.mjs | 18 + packages/landing/next-env.d.ts | 6 + packages/landing/next.config.ts | 10 + packages/landing/package.json | 34 + packages/landing/postcss.config.mjs | 7 + packages/landing/public/favicon.svg | 3 + packages/landing/public/robots.txt | 5 + packages/landing/src/app/blog/[slug]/page.tsx | 107 + packages/landing/src/app/blog/layout.tsx | 11 + packages/landing/src/app/blog/page.tsx | 19 + packages/landing/src/app/business/layout.tsx | 11 + packages/landing/src/app/business/page.tsx | 31 + packages/landing/src/app/contact/layout.tsx | 11 + packages/landing/src/app/contact/page.tsx | 86 + packages/landing/src/app/globals.css | 521 ++++ packages/landing/src/app/layout.tsx | 145 + packages/landing/src/app/mobile/layout.tsx | 11 + packages/landing/src/app/mobile/page.tsx | 25 + packages/landing/src/app/page.tsx | 39 + packages/landing/src/app/pricing/layout.tsx | 11 + packages/landing/src/app/pricing/page.tsx | 23 + packages/landing/src/app/privacy/page.tsx | 31 + packages/landing/src/app/terms/page.tsx | 31 + .../landing/src/components/MotionProvider.tsx | 15 + .../landing/src/components/blog/BlogGrid.tsx | 67 + .../landing/src/components/blog/BlogHero.tsx | 35 + .../src/components/business/BusinessCTA.tsx | 66 + .../src/components/business/BusinessFAQ.tsx | 36 + .../components/business/BusinessHeader.tsx | 64 + .../src/components/business/BusinessHero.tsx | 89 + .../components/business/ComplianceSection.tsx | 49 + .../src/components/business/ForWhoSection.tsx | 48 + .../business/ModernTeamsSection.tsx | 58 + .../business/PrivacyInfraSection.tsx | 66 + .../src/components/business/TrustStats.tsx | 48 + .../landing/src/components/landing/Blog.tsx | 77 + .../landing/src/components/landing/CTA.tsx | 92 + .../landing/src/components/landing/FAQ.tsx | 49 + .../src/components/landing/Features.tsx | 93 + .../landing/src/components/landing/Footer.tsx | 109 + .../landing/src/components/landing/Header.tsx | 383 +++ .../landing/src/components/landing/Hero.tsx | 85 + .../src/components/landing/HowItWorks.tsx | 126 + .../src/components/landing/Products.tsx | 111 + .../src/components/landing/TopBanner.tsx | 65 + .../src/components/landing/TrustedBy.tsx | 44 + .../landing/src/components/landing/index.ts | 8 + .../src/components/legal/LegalLayout.tsx | 172 ++ .../src/components/mobile/MobileCTA.tsx | 81 + .../src/components/mobile/MobileFAQ.tsx | 36 + .../src/components/mobile/MobileFeatures.tsx | 85 + .../src/components/mobile/MobileHero.tsx | 102 + .../placeholders/ImagePlaceholder.tsx | 35 + .../src/components/pricing/PricingFAQ.tsx | 36 + .../components/pricing/PricingFeatures.tsx | 57 + .../src/components/pricing/PricingHero.tsx | 35 + .../src/components/pricing/PricingPlans.tsx | 113 + .../src/components/shared/Accordion.tsx | 136 + .../src/components/shared/BaseHeader.tsx | 198 ++ packages/landing/src/components/ui/Logo.tsx | 50 + .../src/components/ui/LogoWithText.tsx | 27 + packages/landing/src/components/ui/index.ts | 2 + packages/landing/src/content/design.ts | 14 + packages/landing/src/content/site.ts | 772 ++++++ packages/landing/src/hooks/useEscapeKey.ts | 16 + packages/landing/src/hooks/useScrollLock.ts | 27 + packages/landing/src/hooks/useScrolled.ts | 30 + packages/landing/src/hooks/useWaitlistForm.ts | 3 + packages/landing/src/lib/accent-scale.ts | 149 + packages/landing/src/lib/blog.ts | 3 + packages/landing/src/lib/icons.ts | 65 + packages/landing/src/lib/lorem.ts | 58 + packages/landing/src/lib/submitToWaitlist.ts | 3 + packages/landing/tsconfig.json | 27 + pnpm-lock.yaml | 2417 ++++++++++++++++- 81 files changed, 8018 insertions(+), 22 deletions(-) create mode 100644 packages/landing/.commitlintrc.js create mode 100644 packages/landing/.env.example create mode 100644 packages/landing/.gitignore create mode 100644 packages/landing/.prettierrc create mode 100644 packages/landing/.stylelintrc.cjs create mode 100644 packages/landing/CLAUDE.md create mode 100644 packages/landing/eslint.config.mjs create mode 100644 packages/landing/next-env.d.ts create mode 100644 packages/landing/next.config.ts create mode 100644 packages/landing/package.json create mode 100644 packages/landing/postcss.config.mjs create mode 100644 packages/landing/public/favicon.svg create mode 100644 packages/landing/public/robots.txt create mode 100644 packages/landing/src/app/blog/[slug]/page.tsx create mode 100644 packages/landing/src/app/blog/layout.tsx create mode 100644 packages/landing/src/app/blog/page.tsx create mode 100644 packages/landing/src/app/business/layout.tsx create mode 100644 packages/landing/src/app/business/page.tsx create mode 100644 packages/landing/src/app/contact/layout.tsx create mode 100644 packages/landing/src/app/contact/page.tsx create mode 100644 packages/landing/src/app/globals.css create mode 100644 packages/landing/src/app/layout.tsx create mode 100644 packages/landing/src/app/mobile/layout.tsx create mode 100644 packages/landing/src/app/mobile/page.tsx create mode 100644 packages/landing/src/app/page.tsx create mode 100644 packages/landing/src/app/pricing/layout.tsx create mode 100644 packages/landing/src/app/pricing/page.tsx create mode 100644 packages/landing/src/app/privacy/page.tsx create mode 100644 packages/landing/src/app/terms/page.tsx create mode 100644 packages/landing/src/components/MotionProvider.tsx create mode 100644 packages/landing/src/components/blog/BlogGrid.tsx create mode 100644 packages/landing/src/components/blog/BlogHero.tsx create mode 100644 packages/landing/src/components/business/BusinessCTA.tsx create mode 100644 packages/landing/src/components/business/BusinessFAQ.tsx create mode 100644 packages/landing/src/components/business/BusinessHeader.tsx create mode 100644 packages/landing/src/components/business/BusinessHero.tsx create mode 100644 packages/landing/src/components/business/ComplianceSection.tsx create mode 100644 packages/landing/src/components/business/ForWhoSection.tsx create mode 100644 packages/landing/src/components/business/ModernTeamsSection.tsx create mode 100644 packages/landing/src/components/business/PrivacyInfraSection.tsx create mode 100644 packages/landing/src/components/business/TrustStats.tsx create mode 100644 packages/landing/src/components/landing/Blog.tsx create mode 100644 packages/landing/src/components/landing/CTA.tsx create mode 100644 packages/landing/src/components/landing/FAQ.tsx create mode 100644 packages/landing/src/components/landing/Features.tsx create mode 100644 packages/landing/src/components/landing/Footer.tsx create mode 100644 packages/landing/src/components/landing/Header.tsx create mode 100644 packages/landing/src/components/landing/Hero.tsx create mode 100644 packages/landing/src/components/landing/HowItWorks.tsx create mode 100644 packages/landing/src/components/landing/Products.tsx create mode 100644 packages/landing/src/components/landing/TopBanner.tsx create mode 100644 packages/landing/src/components/landing/TrustedBy.tsx create mode 100644 packages/landing/src/components/landing/index.ts create mode 100644 packages/landing/src/components/legal/LegalLayout.tsx create mode 100644 packages/landing/src/components/mobile/MobileCTA.tsx create mode 100644 packages/landing/src/components/mobile/MobileFAQ.tsx create mode 100644 packages/landing/src/components/mobile/MobileFeatures.tsx create mode 100644 packages/landing/src/components/mobile/MobileHero.tsx create mode 100644 packages/landing/src/components/placeholders/ImagePlaceholder.tsx create mode 100644 packages/landing/src/components/pricing/PricingFAQ.tsx create mode 100644 packages/landing/src/components/pricing/PricingFeatures.tsx create mode 100644 packages/landing/src/components/pricing/PricingHero.tsx create mode 100644 packages/landing/src/components/pricing/PricingPlans.tsx create mode 100644 packages/landing/src/components/shared/Accordion.tsx create mode 100644 packages/landing/src/components/shared/BaseHeader.tsx create mode 100644 packages/landing/src/components/ui/Logo.tsx create mode 100644 packages/landing/src/components/ui/LogoWithText.tsx create mode 100644 packages/landing/src/components/ui/index.ts create mode 100644 packages/landing/src/content/design.ts create mode 100644 packages/landing/src/content/site.ts create mode 100644 packages/landing/src/hooks/useEscapeKey.ts create mode 100644 packages/landing/src/hooks/useScrollLock.ts create mode 100644 packages/landing/src/hooks/useScrolled.ts create mode 100644 packages/landing/src/hooks/useWaitlistForm.ts create mode 100644 packages/landing/src/lib/accent-scale.ts create mode 100644 packages/landing/src/lib/blog.ts create mode 100644 packages/landing/src/lib/icons.ts create mode 100644 packages/landing/src/lib/lorem.ts create mode 100644 packages/landing/src/lib/submitToWaitlist.ts create mode 100644 packages/landing/tsconfig.json diff --git a/packages/landing/.commitlintrc.js b/packages/landing/.commitlintrc.js new file mode 100644 index 0000000..0e0b4bc --- /dev/null +++ b/packages/landing/.commitlintrc.js @@ -0,0 +1,34 @@ +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'type-enum': [ + 2, + 'always', + [ + 'feat', + 'fix', + 'docs', + 'style', + 'refactor', + 'perf', + 'test', + 'build', + 'ci', + 'chore', + 'revert', + 'Feature', // Allow "Feature" as a type + 'feature', // Allow "feature" as a type + 'Bugfix', + 'bugfix', + 'Hotfix', + 'hotfix', + 'Release', + 'release', + ], + ], + 'subject-case': [0], // Disable subject case checking + 'subject-empty': [0], // Disable subject empty checking + 'type-empty': [0], // Disable type empty checking + 'header-max-length': [0], // Disable header max length + }, +} diff --git a/packages/landing/.env.example b/packages/landing/.env.example new file mode 100644 index 0000000..2c61f60 --- /dev/null +++ b/packages/landing/.env.example @@ -0,0 +1,5 @@ +# Waitlist submission URL (Google Apps Script) +NEXT_PUBLIC_WAITLIST_URL=https://script.google.com/macros/s/YOUR_SCRIPT_ID/exec + +# Fathom Analytics site ID +NEXT_PUBLIC_FATHOM_SITE_ID=YOUR_SITE_ID diff --git a/packages/landing/.gitignore b/packages/landing/.gitignore new file mode 100644 index 0000000..1c1cf3e --- /dev/null +++ b/packages/landing/.gitignore @@ -0,0 +1,42 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.next +out +.DS_Store +dist +dist-ssr +coverage +*.local +.eslintcache +.vite_cache + +# TypeScript incremental build cache +*.tsbuildinfo + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Sentry Auth Token +.eslintcache +.env.sentry-build-plugin + +# Performance testing +.lighthouseci diff --git a/packages/landing/.prettierrc b/packages/landing/.prettierrc new file mode 100644 index 0000000..5c2540b --- /dev/null +++ b/packages/landing/.prettierrc @@ -0,0 +1,10 @@ +{ + "semi": false, + "singleQuote": true, + "trailingComma": "es5", + "tabWidth": 2, + "useTabs": false, + "printWidth": 120, + "endOfLine": "lf", + "htmlWhitespaceSensitivity": "ignore" +} diff --git a/packages/landing/.stylelintrc.cjs b/packages/landing/.stylelintrc.cjs new file mode 100644 index 0000000..4d60224 --- /dev/null +++ b/packages/landing/.stylelintrc.cjs @@ -0,0 +1,40 @@ +module.exports = { + plugins: ['stylelint-scss'], + extends: ['stylelint-config-recommended-scss', 'stylelint-config-recommended-vue/scss'], + rules: { + 'no-duplicate-selectors': null, + indentation: null, + 'no-descending-specificity': null, + 'at-rule-empty-line-before': null, + 'custom-property-empty-line-before': null, + 'declaration-empty-line-before': null, + 'max-nesting-depth': null, + 'value-keyword-case': null, + 'color-hex-length': ['long'], + 'color-hex-case': 'lower', + 'color-named': 'never', + 'declaration-block-single-line-max-declarations': [0], + 'selector-max-compound-selectors': 6, + 'selector-class-pattern': null, + 'media-feature-name-no-unknown': null, + 'selector-pseudo-element-no-unknown': [ + true, + { + ignorePseudoElements: ['v-deep'], + }, + ], + 'scss/dollar-variable-colon-space-after': ['always-single-line'], + 'scss/at-function-pattern': null, + 'scss/at-mixin-pattern': null, + 'scss/dollar-variable-pattern': null, + 'scss/percent-placeholder-pattern': null, + 'scss/at-mixin-argumentless-call-parentheses': 'never', + 'scss/no-duplicate-dollar-variables': true, + 'property-no-unknown': [ + true, + { + ignoreProperties: ['field-sizing'], + }, + ], + }, +} diff --git a/packages/landing/CLAUDE.md b/packages/landing/CLAUDE.md new file mode 100644 index 0000000..debffaf --- /dev/null +++ b/packages/landing/CLAUDE.md @@ -0,0 +1,81 @@ +# Landing Template — Conventions + +> Generated project conventions. Copied into `/packages/landing/` on `/scaffold-landing`. + +## Page structure is canonical — never change it + +This template is a **1:1 clone** of the reference landing (`web-landing-app`). The page set, +component sequence, block roles, markup, and animations are **fixed across every venture**. + +**What varies per venture:** +- Token system (`branding.accent` → 9-step scale + hover/bg/border variants; `branding.fontSans` + / `fontMono`; `branding.borderRadius`; `branding.borderWidth`). +- Text content (every string in every slot of `src/content/site.ts`). +- Image URLs (replace `src: null` → real asset, or keep `null` for `[IMAGE PLACEHOLDER]`). + +**What never varies:** +- Set of pages (`/`, `/mobile`, `/business`, `/pricing`, `/blog`, `/contact`, `/privacy`, + `/terms`). +- Order of components on each page. +- Role/goal/markup/animation of each component. +- Component internals (don't edit files in `src/components/*` — edit `site.ts`). + +**Missing content** → `lorem(kind)` helper for text, `ImagePlaceholder` for images. +**Excess content in brief** → silently ignore. Data overload hurts conversion. + +## Token system + +`site.ts` `branding.accent` (hex) → +`src/lib/accent-scale.ts` `accentCssOverrides(hex)` → +`src/app/layout.tsx` injects `