@adminide-stack/clock-tik-browser 12.0.17-alpha.0 → 12.0.17-alpha.2

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 (187) hide show
  1. package/lib/Validation/Schema.d.ts +54 -0
  2. package/lib/Validation/Schema.d.ts.map +1 -0
  3. package/lib/Validation/Schema.js +26 -0
  4. package/lib/Validation/Schema.js.map +1 -0
  5. package/lib/components/HelpCenterFooter.d.ts.map +1 -1
  6. package/lib/components/HelpCenterFooter.js +11 -7
  7. package/lib/components/HelpCenterFooter.js.map +1 -1
  8. package/lib/components/HelpCenterHeader.js +1 -1
  9. package/lib/components/Logo.d.ts.map +1 -1
  10. package/lib/components/Logo.js +56 -91
  11. package/lib/components/Logo.js.map +1 -1
  12. package/lib/components/navbar/index.d.ts.map +1 -1
  13. package/lib/components/navbar/index.js +5 -3
  14. package/lib/components/navbar/index.js.map +1 -1
  15. package/lib/compute.d.ts.map +1 -1
  16. package/lib/compute.js +43 -7
  17. package/lib/compute.js.map +1 -1
  18. package/lib/config/env-config.d.ts +17 -0
  19. package/lib/config/env-config.d.ts.map +1 -0
  20. package/lib/config/env-config.js +52 -0
  21. package/lib/config/env-config.js.map +1 -0
  22. package/lib/{config.d.ts → config/index.d.ts} +2 -13
  23. package/lib/config/index.d.ts.map +1 -0
  24. package/lib/pages/ArticlePage/index.d.ts.map +1 -1
  25. package/lib/pages/ArticlePage/index.js +32 -0
  26. package/lib/pages/ArticlePage/index.js.map +1 -1
  27. package/lib/pages/Contact-us/index.d.ts +3 -0
  28. package/lib/pages/Contact-us/index.d.ts.map +1 -0
  29. package/lib/pages/Contact-us/index.js +159 -0
  30. package/lib/pages/Contact-us/index.js.map +1 -0
  31. package/lib/pages/Feedback/index.d.ts +3 -0
  32. package/lib/pages/Feedback/index.d.ts.map +1 -0
  33. package/lib/pages/Feedback/index.js +126 -0
  34. package/lib/pages/Feedback/index.js.map +1 -0
  35. package/lib/pages/GetStarted/index.d.ts.map +1 -1
  36. package/lib/pages/GetStarted/index.js +14 -14
  37. package/lib/pages/GetStarted/index.js.map +1 -1
  38. package/lib/pages/HelpCenter/components/CaresHero.d.ts +6 -0
  39. package/lib/pages/HelpCenter/components/CaresHero.d.ts.map +1 -0
  40. package/lib/pages/HelpCenter/components/CaresHero.js +55 -0
  41. package/lib/pages/HelpCenter/components/CaresHero.js.map +1 -0
  42. package/lib/pages/HelpCenter/components/CaresLayout.d.ts +11 -0
  43. package/lib/pages/HelpCenter/components/CaresLayout.d.ts.map +1 -0
  44. package/lib/pages/HelpCenter/components/CaresLayout.js +20 -0
  45. package/lib/pages/HelpCenter/components/CaresLayout.js.map +1 -0
  46. package/lib/pages/HelpCenter/components/HelpCategoryCard.d.ts +4 -4
  47. package/lib/pages/HelpCenter/components/HelpCategoryCard.d.ts.map +1 -1
  48. package/lib/pages/HelpCenter/components/NeedHelpWithSection.d.ts +6 -0
  49. package/lib/pages/HelpCenter/components/NeedHelpWithSection.d.ts.map +1 -0
  50. package/lib/pages/HelpCenter/components/NeedHelpWithSection.js +70 -0
  51. package/lib/pages/HelpCenter/components/NeedHelpWithSection.js.map +1 -0
  52. package/lib/pages/HelpCenter/components/PopularArticlesGrid.d.ts +8 -0
  53. package/lib/pages/HelpCenter/components/PopularArticlesGrid.d.ts.map +1 -0
  54. package/lib/pages/HelpCenter/components/PopularArticlesGrid.js +21 -0
  55. package/lib/pages/HelpCenter/components/PopularArticlesGrid.js.map +1 -0
  56. package/lib/pages/HelpCenter/components/SupportPlansSection.d.ts +3 -0
  57. package/lib/pages/HelpCenter/components/SupportPlansSection.d.ts.map +1 -0
  58. package/lib/pages/HelpCenter/components/SupportPlansSection.js +63 -0
  59. package/lib/pages/HelpCenter/components/SupportPlansSection.js.map +1 -0
  60. package/lib/pages/HelpCenter/components/SupportServicesSection.d.ts +3 -0
  61. package/lib/pages/HelpCenter/components/SupportServicesSection.d.ts.map +1 -0
  62. package/lib/pages/HelpCenter/components/SupportServicesSection.js +61 -0
  63. package/lib/pages/HelpCenter/components/SupportServicesSection.js.map +1 -0
  64. package/lib/pages/HelpCenter/index.d.ts.map +1 -1
  65. package/lib/pages/HelpCenter/index.js +13 -60
  66. package/lib/pages/HelpCenter/index.js.map +1 -1
  67. package/lib/pages/HelpCenter/mockData.d.ts.map +1 -1
  68. package/lib/pages/HelpCenter/mockData.js +13 -9
  69. package/lib/pages/HelpCenter/mockData.js.map +1 -1
  70. package/lib/pages/LandingPage/components/Assets.d.ts +26 -0
  71. package/lib/pages/LandingPage/components/Assets.d.ts.map +1 -1
  72. package/lib/pages/LandingPage/components/Assets.js +6 -12
  73. package/lib/pages/LandingPage/components/Assets.js.map +1 -1
  74. package/lib/pages/LandingPage/components/BuildingSoftwareScene.d.ts +4 -0
  75. package/lib/pages/LandingPage/components/BuildingSoftwareScene.d.ts.map +1 -0
  76. package/lib/pages/LandingPage/components/BuildingSoftwareScene.js +1679 -0
  77. package/lib/pages/LandingPage/components/BuildingSoftwareScene.js.map +1 -0
  78. package/lib/pages/LandingPage/components/CodeEditor.d.ts +7 -0
  79. package/lib/pages/LandingPage/components/CodeEditor.d.ts.map +1 -0
  80. package/lib/pages/LandingPage/components/ControlCard.d.ts +6 -0
  81. package/lib/pages/LandingPage/components/ControlCard.d.ts.map +1 -0
  82. package/lib/pages/LandingPage/components/ControlCard.js +98 -0
  83. package/lib/pages/LandingPage/components/ControlCard.js.map +1 -0
  84. package/lib/pages/LandingPage/components/DeployButton.d.ts +8 -0
  85. package/lib/pages/LandingPage/components/DeployButton.d.ts.map +1 -0
  86. package/lib/pages/LandingPage/components/DeploymentResult.d.ts +6 -0
  87. package/lib/pages/LandingPage/components/DeploymentResult.d.ts.map +1 -0
  88. package/lib/pages/LandingPage/components/IconButton.d.ts +8 -0
  89. package/lib/pages/LandingPage/components/IconButton.d.ts.map +1 -0
  90. package/lib/pages/LandingPage/components/ImageCard.d.ts +13 -0
  91. package/lib/pages/LandingPage/components/ImageCard.d.ts.map +1 -0
  92. package/lib/pages/LandingPage/components/ImageCard.js +38 -0
  93. package/lib/pages/LandingPage/components/ImageCard.js.map +1 -0
  94. package/lib/pages/LandingPage/components/InfrastructureCard.d.ts +4 -0
  95. package/lib/pages/LandingPage/components/InfrastructureCard.d.ts.map +1 -0
  96. package/lib/pages/LandingPage/components/InfrastructureCard.js +236 -0
  97. package/lib/pages/LandingPage/components/InfrastructureCard.js.map +1 -0
  98. package/lib/pages/LandingPage/components/InfrastructureTabs.d.ts +4 -0
  99. package/lib/pages/LandingPage/components/InfrastructureTabs.d.ts.map +1 -0
  100. package/lib/pages/LandingPage/components/InfrastructureTabs.js +57 -0
  101. package/lib/pages/LandingPage/components/InfrastructureTabs.js.map +1 -0
  102. package/lib/pages/LandingPage/components/Investigation.d.ts +4 -0
  103. package/lib/pages/LandingPage/components/Investigation.d.ts.map +1 -0
  104. package/lib/pages/LandingPage/components/InvestigationCard.d.ts +6 -0
  105. package/lib/pages/LandingPage/components/InvestigationCard.d.ts.map +1 -0
  106. package/lib/pages/LandingPage/components/InvestigationCard.js +118 -0
  107. package/lib/pages/LandingPage/components/InvestigationCard.js.map +1 -0
  108. package/lib/pages/LandingPage/components/LearningCard.d.ts +9 -0
  109. package/lib/pages/LandingPage/components/LearningCard.d.ts.map +1 -0
  110. package/lib/pages/LandingPage/components/LearningCard.js +22 -0
  111. package/lib/pages/LandingPage/components/LearningCard.js.map +1 -0
  112. package/lib/pages/LandingPage/components/MetricsDisplay.d.ts +6 -0
  113. package/lib/pages/LandingPage/components/MetricsDisplay.d.ts.map +1 -0
  114. package/lib/pages/LandingPage/components/ProfilesCard.d.ts +10 -0
  115. package/lib/pages/LandingPage/components/ProfilesCard.d.ts.map +1 -0
  116. package/lib/pages/LandingPage/components/ProfilesCard.js +52 -0
  117. package/lib/pages/LandingPage/components/ProfilesCard.js.map +1 -0
  118. package/lib/pages/LandingPage/components/Section.d.ts +12 -0
  119. package/lib/pages/LandingPage/components/Section.d.ts.map +1 -0
  120. package/lib/pages/LandingPage/components/Section.js +26 -0
  121. package/lib/pages/LandingPage/components/Section.js.map +1 -0
  122. package/lib/pages/LandingPage/components/Toast.d.ts +12 -0
  123. package/lib/pages/LandingPage/components/Toast.d.ts.map +1 -0
  124. package/lib/pages/LandingPage/components/Toast.js +39 -0
  125. package/lib/pages/LandingPage/components/Toast.js.map +1 -0
  126. package/lib/pages/LandingPage/components/ToastContainer.d.ts +13 -0
  127. package/lib/pages/LandingPage/components/ToastContainer.d.ts.map +1 -0
  128. package/lib/pages/LandingPage/components/ToastContainer.js +62 -0
  129. package/lib/pages/LandingPage/components/ToastContainer.js.map +1 -0
  130. package/lib/pages/LandingPage/components/index.d.ts +16 -0
  131. package/lib/pages/LandingPage/components/index.d.ts.map +1 -0
  132. package/lib/pages/LandingPage/index.d.ts.map +1 -1
  133. package/lib/pages/LandingPage/index.js +641 -189
  134. package/lib/pages/LandingPage/index.js.map +1 -1
  135. package/lib/pages/Privacy/index.d.ts +3 -0
  136. package/lib/pages/Privacy/index.d.ts.map +1 -0
  137. package/lib/pages/Privacy/index.js +7590 -0
  138. package/lib/pages/Privacy/index.js.map +1 -0
  139. package/lib/pages/Thanks/index.d.ts +2 -0
  140. package/lib/pages/Thanks/index.d.ts.map +1 -0
  141. package/lib/pages/Thanks/index.js +56 -0
  142. package/lib/pages/Thanks/index.js.map +1 -0
  143. package/lib/routes.json +44 -0
  144. package/lib/utils/markdownLoader.d.ts +2 -0
  145. package/lib/utils/markdownLoader.d.ts.map +1 -1
  146. package/lib/utils/markdownLoader.js +1590 -1104
  147. package/lib/utils/markdownLoader.js.map +1 -1
  148. package/package.json +2 -2
  149. package/lib/config.d.ts.map +0 -1
  150. package/lib/pages/HelpCenter/components/BookStack.js +0 -36
  151. package/lib/pages/HelpCenter/components/BookStack.js.map +0 -1
  152. package/lib/pages/LandingPage/components/ArticleCard.d.ts +0 -11
  153. package/lib/pages/LandingPage/components/ArticleCard.d.ts.map +0 -1
  154. package/lib/pages/LandingPage/components/ArticleCard.js +0 -29
  155. package/lib/pages/LandingPage/components/ArticleCard.js.map +0 -1
  156. package/lib/pages/LandingPage/components/CategoriesSection.d.ts +0 -16
  157. package/lib/pages/LandingPage/components/CategoriesSection.d.ts.map +0 -1
  158. package/lib/pages/LandingPage/components/CategoriesSection.js +0 -31
  159. package/lib/pages/LandingPage/components/CategoriesSection.js.map +0 -1
  160. package/lib/pages/LandingPage/components/CategoryCard.d.ts +0 -11
  161. package/lib/pages/LandingPage/components/CategoryCard.d.ts.map +0 -1
  162. package/lib/pages/LandingPage/components/CategoryCard.js +0 -25
  163. package/lib/pages/LandingPage/components/CategoryCard.js.map +0 -1
  164. package/lib/pages/LandingPage/components/FeaturedSection.d.ts +0 -15
  165. package/lib/pages/LandingPage/components/FeaturedSection.d.ts.map +0 -1
  166. package/lib/pages/LandingPage/components/FeaturedSection.js +0 -24
  167. package/lib/pages/LandingPage/components/FeaturedSection.js.map +0 -1
  168. package/lib/pages/LandingPage/components/HeroSection.d.ts +0 -9
  169. package/lib/pages/LandingPage/components/HeroSection.d.ts.map +0 -1
  170. package/lib/pages/LandingPage/components/HeroSection.js +0 -46
  171. package/lib/pages/LandingPage/components/HeroSection.js.map +0 -1
  172. package/lib/pages/LandingPage/components/Icons.d.ts +0 -14
  173. package/lib/pages/LandingPage/components/Icons.d.ts.map +0 -1
  174. package/lib/pages/LandingPage/components/Icons.js +0 -174
  175. package/lib/pages/LandingPage/components/Icons.js.map +0 -1
  176. package/lib/pages/LandingPage/components/ResourceCard.d.ts +0 -12
  177. package/lib/pages/LandingPage/components/ResourceCard.d.ts.map +0 -1
  178. package/lib/pages/LandingPage/components/ResourceCard.js +0 -30
  179. package/lib/pages/LandingPage/components/ResourceCard.js.map +0 -1
  180. package/lib/pages/LandingPage/components/ResourcesSection.d.ts +0 -18
  181. package/lib/pages/LandingPage/components/ResourcesSection.d.ts.map +0 -1
  182. package/lib/pages/LandingPage/components/ResourcesSection.js +0 -26
  183. package/lib/pages/LandingPage/components/ResourcesSection.js.map +0 -1
  184. package/lib/pages/LandingPage/components/SearchBar.d.ts +0 -8
  185. package/lib/pages/LandingPage/components/SearchBar.d.ts.map +0 -1
  186. package/lib/pages/LandingPage/components/SearchBar.js +0 -58
  187. package/lib/pages/LandingPage/components/SearchBar.js.map +0 -1
@@ -1,209 +1,661 @@
1
- import {jsx,jsxs}from'react/jsx-runtime';import {Button}from'@admin-layout/tailwind-ui/shardui/button.js';import {useNavigate,Link}from'@remix-run/react';import {HeroSection}from'./components/HeroSection.js';import {CategoriesSection}from'./components/CategoriesSection.js';import {FeaturedSection}from'./components/FeaturedSection.js';import {ResourcesSection}from'./components/ResourcesSection.js';import {Icons}from'./components/Icons.js';import {Images}from'./components/Assets.js';const LandingPage = () => {
2
- const navigate = useNavigate();
3
- const handleSearch = query => {
4
- console.log('Searching for:', query);
5
- // Implement search functionality
1
+ import {jsxs,jsx}from'react/jsx-runtime';import {useState,useRef,useEffect,useMemo}from'react';import {Link}from'@remix-run/react';import {Button}from'@admin-layout/tailwind-ui/shardui/button.js';import {Images}from'./components/Assets.js';import {Section,Container}from'./components/Section.js';import {BuildingSoftwareScene}from'./components/BuildingSoftwareScene.js';import {InvestigationCard}from'./components/InvestigationCard.js';import {InfrastructureTabs}from'./components/InfrastructureTabs.js';import {LearningCard}from'./components/LearningCard.js';import {TrendingUp,Shield}from'lucide-react';import {ControlCard}from'./components/ControlCard.js';const LandingPage = () => {
2
+ const prefersReducedMotion = usePrefersReducedMotion();
3
+ const [heroImageLoaded, setHeroImageLoaded] = useState(false);
4
+ const [introMinDone, setIntroMinDone] = useState(prefersReducedMotion);
5
+ const [introMaxDone, setIntroMaxDone] = useState(prefersReducedMotion);
6
+ const [scrollY, setScrollY] = useState(0);
7
+ const heroRef = useRef(null);
8
+ const investigationRef = useRef(null);
9
+ const infrastructureRef = useRef(null);
10
+ const controlRef = useRef(null);
11
+ useEffect(() => {
12
+ const handleScroll = () => {
13
+ setScrollY(window.scrollY);
14
+ };
15
+ window.addEventListener('scroll', handleScroll, {
16
+ passive: true
17
+ });
18
+ return () => window.removeEventListener('scroll', handleScroll);
19
+ }, []);
20
+ const getHeroProgress = () => {
21
+ if (!heroRef.current) return 0;
22
+ const rect = heroRef.current.getBoundingClientRect();
23
+ const sectionHeight = heroRef.current.offsetHeight;
24
+ const progress = Math.max(0, Math.min(1, (window.innerHeight - rect.top) / sectionHeight));
25
+ return progress;
6
26
  };
7
- const handleCategoryClick = categoryHref => {
8
- navigate(categoryHref);
27
+ const getInvestigationProgress = () => {
28
+ if (!investigationRef.current) return 0;
29
+ const rect = investigationRef.current.getBoundingClientRect();
30
+ const progress = Math.max(0, Math.min(1, (window.innerHeight - rect.top) / window.innerHeight));
31
+ return progress * 100;
9
32
  };
10
- const handleArticleClick = articleHref => {
11
- navigate(articleHref);
33
+ const getInfrastructureProgress = () => {
34
+ if (!infrastructureRef.current) return 0;
35
+ const rect = infrastructureRef.current.getBoundingClientRect();
36
+ const sectionHeight = infrastructureRef.current.offsetHeight;
37
+ const progress = Math.max(0, Math.min(1, (window.innerHeight - rect.top) / sectionHeight));
38
+ return Math.floor(progress * 3);
12
39
  };
13
- const handleResourceClick = resourceHref => {
14
- navigate(resourceHref);
15
- };
16
- // Mock data for categories
17
- const categories = [{
18
- id: 'getting-started',
19
- href: '/get-started',
20
- title: 'Getting Started',
21
- description: 'Perplexity overview, examples, and tips.',
22
- icon: jsx(Icons.GettingStarted, {
23
- width: 24,
24
- height: 24
25
- })
26
- }, {
27
- id: 'account-management',
28
- href: '/help-center/account-management',
29
- title: 'Account Management',
30
- description: 'Account features, security, and usage.',
31
- icon: jsx(Icons.AccountManagement, {
32
- width: 24,
33
- height: 24
34
- })
35
- }, {
36
- id: 'billing',
37
- href: '/help-center/subscription-billing',
38
- title: 'Billing & Subscriptions',
39
- description: 'Payment, subscription info, and cancellation.',
40
- icon: jsx(Icons.Billing, {
41
- width: 24,
42
- height: 24
43
- })
44
- }, {
45
- id: 'product-features',
46
- href: '/help-center/product-features',
47
- title: 'Product Features',
48
- description: 'Spaces, pages, Focus, and Threads.',
49
- icon: jsx(Icons.ProductFeatures, {
50
- width: 24,
51
- height: 24
52
- })
53
- }, {
54
- id: 'troubleshooting',
55
- href: '/help-center/troubleshooting',
56
- title: 'Troubleshooting',
57
- description: 'Find solutions to common issues.',
58
- icon: jsx(Icons.Troubleshooting, {
59
- width: 24,
60
- height: 24
61
- })
62
- }, {
63
- id: 'api',
64
- title: 'API',
65
- href: '/help-center/scope-api',
66
- description: 'Explore our API and get answers to FAQs.',
67
- icon: jsx(Icons.Api, {
68
- width: 24,
69
- height: 24
70
- })
71
- }];
72
- // Mock data for featured articles
73
- const featuredArticles = [{
74
- id: 'getting-started-with-perplexity',
75
- title: 'Getting started with Yantra',
76
- href: '/get-started',
77
- description: 'Perplexity is an AI-powered answer engine that searches the internet in real-time to answer any question.'
78
- }, {
79
- id: 'perplexity-expands-publisher',
80
- title: 'Yantra Expands Publisher Program with 15 New Media Partners',
81
- href: '/help-center/spaces-library',
82
- description: 'Perplexity has added major media partners to its publisher revenue-sharing program.'
83
- }, {
84
- id: 'student-guide-spaces',
85
- title: "A student's guide to using Yantra Spaces",
86
- href: '/help-center/student-hub',
87
- description: 'Create a collaborative knowledge hub for your course, team, or study group. Ask questions, create notes, and organize resources - all in one place.'
88
- }];
89
- // Mock data for resources
90
- const resources = [{
91
- id: 'security',
92
- title: 'Security & Trust Center',
93
- href: '/help-center/data-privacy',
94
- description: 'Access our security tools, terms of service, and data protection policies.',
95
- icon: jsx(Icons.Security, {
96
- width: 24,
97
- height: 24
98
- }),
99
- ctaText: 'EXPLORE'
100
- }, {
101
- id: 'feedback',
102
- title: 'Feedback',
103
- href: '/feedback',
104
- description: 'Have questions or ideas? Share product feedback and help us create a better experience for you.',
105
- icon: jsx(Icons.Feedback, {
106
- width: 24,
107
- height: 24
108
- }),
109
- ctaText: 'SHARE YOUR THOUGHTS'
110
- }, {
111
- id: 'contact',
112
- title: 'Contact Us',
113
- href: '/contact-us',
114
- description: 'Learn how to reach out to us via Discord, email, or our Intercom integration for support, feedback, and community help.',
115
- icon: jsx(Icons.Contact, {
116
- width: 24,
117
- height: 24
118
- }),
119
- ctaText: 'GET IN TOUCH'
120
- }];
121
- // Featured product section (Supply)
122
- const featuredProduct = {
123
- title: 'Yantra Supply',
124
- description: 'Thoughtfully-designed essentials that celebrate the pursuit of knowledge.',
125
- ctaText: 'Visit the Shop',
126
- image: Images.supply.products
40
+ const getControlProgress = () => {
41
+ if (!controlRef.current) return 0;
42
+ const rect = controlRef.current.getBoundingClientRect();
43
+ const viewportHeight = window.innerHeight;
44
+ // Start animating when section enters viewport, complete when it's centered
45
+ const startOffset = viewportHeight;
46
+ const endOffset = viewportHeight * 0.5;
47
+ const progress = Math.max(0, Math.min(1, (startOffset - rect.top) / (startOffset - endOffset)));
48
+ return progress;
127
49
  };
50
+ const heroProgress = getHeroProgress();
51
+ const investigationProgress = getInvestigationProgress();
52
+ const infrastructureTab = getInfrastructureProgress();
53
+ const controlProgress = getControlProgress();
54
+ const introLocked = !prefersReducedMotion && !(introMinDone && (heroImageLoaded || introMaxDone));
55
+ useBodyScrollLock(introLocked);
56
+ useEffect(() => {
57
+ if (prefersReducedMotion) return;
58
+ const min = window.setTimeout(() => setIntroMinDone(true), 1500);
59
+ const max = window.setTimeout(() => setIntroMaxDone(true), 3600);
60
+ return () => {
61
+ window.clearTimeout(min);
62
+ window.clearTimeout(max);
63
+ };
64
+ }, [prefersReducedMotion]);
128
65
  return jsxs("div", {
129
- className: "min-h-screen bg-background",
130
- children: [jsx(HeroSection, {
131
- title: "How can we help?",
132
- subtitle: "Get answers to all things Yantra.",
133
- onSearch: handleSearch
134
- }), jsx("section", {
135
- className: "py-16",
66
+ className: "min-h-screen bg-background text-foreground",
67
+ children: [jsx(LandingPageStyles, {}), jsx(ClockbookHero, {
68
+ reducedMotion: prefersReducedMotion,
69
+ onHeroImageLoaded: () => setHeroImageLoaded(true),
70
+ introLocked: introLocked,
71
+ onSkipIntro: () => {
72
+ setIntroMinDone(true);
73
+ setIntroMaxDone(true);
74
+ }
75
+ }), jsx("div", {
76
+ ref: heroRef,
77
+ className: "relative",
78
+ style: {
79
+ height: '3200px'
80
+ },
81
+ children: jsxs("div", {
82
+ className: "h-screen sticky top-0 left-0 bg-[#070707] transition-all duration-100 overflow-hidden",
83
+ children: [jsx("div", {
84
+ className: "flex flex-col items-center justify-center h-[calc(100vh-56px)] relative",
85
+ children: jsx(BuildingSoftwareScene, {
86
+ progress: heroProgress
87
+ })
88
+ }), jsx("div", {
89
+ className: "crt pointer-events-none fixed inset-0 z-[999]"
90
+ })]
91
+ })
92
+ }), jsx("div", {
93
+ ref: investigationRef,
94
+ className: "relative min-h-[1200px]",
95
+ children: jsxs("div", {
96
+ className: "sticky top-0 py-20",
97
+ children: [jsxs("h2", {
98
+ className: "text-5xl font-semibold text-center mb-20",
99
+ style: {
100
+ color: 'var(--gray-900)'
101
+ },
102
+ children: ["It's time to ", jsx("span", {
103
+ className: "italic",
104
+ children: "rethink"
105
+ }), " ", jsx("br", {}), " infrastructure."]
106
+ }), jsx(InvestigationCard, {
107
+ progress: investigationProgress
108
+ })]
109
+ })
110
+ }), jsx("div", {
111
+ ref: infrastructureRef,
112
+ className: "relative min-h-[2700px]",
136
113
  children: jsx("div", {
137
- className: "container mx-auto px-16",
138
- children: jsxs("div", {
139
- className: "flex flex-col items-start justify-between gap-10 md:flex-row",
140
- children: [jsx("div", {
141
- className: "h-60 w-full overflow-hidden rounded-lg shadow-md md:h-72 md:w-1/3",
142
- children: jsx("img", {
143
- src: Images.faq.person,
144
- alt: "Person looking at bookshelves",
145
- className: "h-full w-full object-cover"
146
- })
114
+ className: "sticky top-0 py-20",
115
+ children: jsx(InfrastructureTabs, {
116
+ activeTab: infrastructureTab
117
+ })
118
+ })
119
+ }), jsx("div", {
120
+ className: "max-w-[1054px] mx-auto px-5 py-32",
121
+ children: jsxs("div", {
122
+ className: "flex gap-8",
123
+ children: [jsx("div", {
124
+ className: "flex-1",
125
+ children: jsx("h2", {
126
+ className: "text-4xl font-semibold mb-4 sticky top-20",
127
+ style: {
128
+ color: 'var(--gray-900)'
129
+ },
130
+ children: "Learning from your decisions, patterns, and goals."
131
+ })
132
+ }), jsxs("div", {
133
+ className: "w-[392px] space-y-5",
134
+ children: [jsx(LearningCard, {
135
+ icon: jsx(TrendingUp, {
136
+ className: "w-6 h-6"
137
+ }),
138
+ title: "Rollback changes and add a batch endpoint",
139
+ description: "Similar to how issues were resolved in previous incidents."
140
+ }), jsx(LearningCard, {
141
+ icon: jsx(Shield, {
142
+ className: "w-6 h-6"
143
+ }),
144
+ title: "Apply preload and caching safeguards",
145
+ description: "Patterns show API calls tied to userID should be preloaded or deduped."
147
146
  }), jsxs("div", {
148
- className: "w-full space-y-5 md:w-2/3",
149
- children: [jsx("h2", {
150
- className: "text-2xl font-bold text-foreground",
151
- children: "FAQs"
147
+ className: "p-5 rounded-2xl bg-[#EAEAEA] border border-black/5",
148
+ children: [jsx("h3", {
149
+ className: "text-base font-semibold mb-2",
150
+ style: {
151
+ color: 'var(--gray-900)'
152
+ },
153
+ children: "Goals updated"
152
154
  }), jsx("p", {
153
- className: "text-lg text-muted-foreground",
154
- children: "Answers to your general, technical, enterprise, and API-related questions."
155
- }), jsx(Link, {
156
- to: "/help-center",
157
- children: jsx(Button, {
158
- variant: "outline",
159
- className: "mt-4 border-primary px-6 py-2.5 text-primary hover:bg-primary/10",
160
- children: "Get Answers"
161
- })
155
+ className: "text-sm mb-4",
156
+ style: {
157
+ color: 'var(--gray-600)'
158
+ },
159
+ children: "Your team prioritizes latency and keeping the UI responsive for this application."
160
+ }), jsx("div", {
161
+ className: "h-32 bg-black/5 rounded-lg"
162
+ })]
163
+ })]
164
+ })]
165
+ })
166
+ }), jsxs("div", {
167
+ ref: controlRef,
168
+ className: "max-w-[1004px] mx-auto px-5 py-32",
169
+ children: [jsx("h2", {
170
+ className: "text-4xl font-semibold text-center mb-12",
171
+ style: {
172
+ color: 'var(--gray-900)'
173
+ },
174
+ children: "With you always in control."
175
+ }), jsx(ControlCard, {
176
+ progress: controlProgress
177
+ })]
178
+ }), jsxs(Section, {
179
+ tone: "dark",
180
+ className: "relative overflow-hidden",
181
+ children: [jsx("div", {
182
+ className: "pointer-events-none absolute inset-0",
183
+ style: {
184
+ background: 'radial-gradient(1000px 700px at 15% 20%, rgba(246, 201, 69, 0.12), transparent 60%), radial-gradient(900px 650px at 90% 70%, rgba(255, 255, 255, 0.10), transparent 60%)'
185
+ }
186
+ }), jsx("div", {
187
+ className: "pointer-events-none absolute inset-0 cb-noise"
188
+ }), jsx(Container, {
189
+ className: "relative py-16 sm:py-24",
190
+ children: jsx("div", {
191
+ className: "mx-auto max-w-4xl text-center",
192
+ children: jsxs(ScrollReveal, {
193
+ reducedMotion: prefersReducedMotion,
194
+ children: [jsx("p", {
195
+ className: "text-xs font-medium uppercase tracking-[0.3em] text-white/60",
196
+ children: "Your privacy is our responsibility"
197
+ }), jsx("h2", {
198
+ className: "mt-4 text-balance text-3xl font-semibold tracking-tight sm:text-5xl",
199
+ children: "Trust isn't a feature. It's the business model."
200
+ }), jsx("p", {
201
+ className: "mt-6 text-pretty text-base leading-relaxed text-white/70 sm:text-lg",
202
+ children: "We believe that trust is paramount in a relationship. We do not own or sell your data, and we most certainly do not bank on advertising-based business models. The only way we make money is from the software license fees you pay us."
203
+ })]
204
+ })
205
+ })
206
+ })]
207
+ }), jsx(Section, {
208
+ tone: "default",
209
+ children: jsx(Container, {
210
+ className: "py-14 sm:py-20",
211
+ children: jsxs("div", {
212
+ className: "mx-auto max-w-6xl",
213
+ children: [jsxs(ScrollReveal, {
214
+ reducedMotion: prefersReducedMotion,
215
+ children: [jsx("p", {
216
+ className: "text-sm font-medium text-muted-foreground",
217
+ children: "The core values and principles that drive us"
218
+ }), jsx("h2", {
219
+ className: "mt-3 text-balance text-3xl font-semibold tracking-tight sm:text-4xl",
220
+ children: "Built with a long view."
221
+ })]
222
+ }), jsxs("div", {
223
+ className: "mt-10 grid gap-4 lg:grid-cols-3",
224
+ children: [jsx(ValueCard, {
225
+ title: "Long-term commitment",
226
+ description: "We've built a foundation on sustainable, profitable operations that understand the real challenges growing businesses face. We take pride in running a business that's powered by you, our customer, with a genuine commitment to your success."
227
+ }), jsx(ValueCard, {
228
+ title: "Focus on research and development",
229
+ description: "Software is our craft and we back it up with relentless investments in R&D. We prefer to own the entire technology stack, continuously innovating to deliver integrated solutions for time tracking, HR, communications, marketing, and financial management."
230
+ }), jsx(ValueCard, {
231
+ title: "Customer-first philosophy",
232
+ description: "Throughout our journey, it's our customers' trust and goodwill that has helped us establish a strong position in the market. No matter the size of your business, we're here to help you grow \u2014 from startups to enterprises."
233
+ })]
234
+ }), jsxs("div", {
235
+ className: "mt-12 flex flex-wrap items-center justify-between gap-4 rounded-2xl border border-foreground/10 bg-muted/30 px-6 py-6 sm:px-8",
236
+ children: [jsxs("div", {
237
+ children: [jsx("p", {
238
+ className: "text-base font-medium",
239
+ children: "Ready to run your business on Clockbook?"
240
+ }), jsx("p", {
241
+ className: "mt-1 text-sm text-muted-foreground",
242
+ children: "Get started in minutes. Scale for years."
243
+ })]
244
+ }), jsxs("div", {
245
+ className: "flex flex-wrap gap-3",
246
+ children: [jsx(Link, {
247
+ to: "https://app-v10.clockbook.com/",
248
+ target: "_blank",
249
+ children: jsx(Button, {
250
+ className: "h-11 bg-[#E33A2C] px-6 text-white hover:bg-[#c82f23]",
251
+ children: "Sign up"
252
+ })
253
+ }), jsx(Link, {
254
+ to: "/contact-us",
255
+ children: jsx(Button, {
256
+ className: "h-11 bg-[#111827] px-6 text-white hover:bg-black",
257
+ children: "Talk to sales"
258
+ })
259
+ })]
162
260
  })]
163
261
  })]
164
262
  })
165
263
  })
166
- }), jsx(CategoriesSection, {
167
- title: "Top categories",
168
- categories: categories,
169
- onCategoryClick: handleCategoryClick
170
- }), jsx(FeaturedSection, {
171
- title: "Featured articles",
172
- articles: featuredArticles,
173
- onArticleClick: handleArticleClick
174
- }), jsx("section", {
175
- className: "bg-muted/50 py-16",
264
+ })]
265
+ });
266
+ };
267
+ function LandingPageStyles() {
268
+ // Inline CSS so this module doesn't rely on any external CSS pipeline.
269
+ return jsx("style", {
270
+ // eslint-disable-next-line react/no-danger
271
+ dangerouslySetInnerHTML: {
272
+ __html: `
273
+ /* --- Clockbook Landing Effects (scoped by cb- prefix) --- */
274
+ .cb-noise {
275
+ opacity: 0.18;
276
+ background-image:
277
+ radial-gradient(circle at 20% 30%, rgba(255,255,255,0.12) 0, rgba(255,255,255,0.00) 35%),
278
+ radial-gradient(circle at 80% 60%, rgba(255,255,255,0.10) 0, rgba(255,255,255,0.00) 45%),
279
+ repeating-linear-gradient(0deg, rgba(255,255,255,0.02) 0, rgba(255,255,255,0.02) 1px, rgba(0,0,0,0) 1px, rgba(0,0,0,0) 3px),
280
+ repeating-linear-gradient(90deg, rgba(255,255,255,0.015) 0, rgba(255,255,255,0.015) 1px, rgba(0,0,0,0) 1px, rgba(0,0,0,0) 3px);
281
+ mix-blend-mode: overlay;
282
+ }
283
+
284
+ .cb-fade-in {
285
+ animation: cbFadeIn 900ms cubic-bezier(.2,.9,.2,1) both;
286
+ }
287
+
288
+ .cb-reveal-line {
289
+ --d: 0ms;
290
+ animation: cbRevealUp 900ms cubic-bezier(.2,.9,.2,1) both;
291
+ animation-delay: var(--d);
292
+ }
293
+
294
+ .cb-letter {
295
+ display: inline-block;
296
+ --i: 0;
297
+ animation: cbLetterIn 900ms cubic-bezier(.2,.9,.2,1) both;
298
+ animation-delay: calc(var(--i) * 34ms + 120ms);
299
+ }
300
+
301
+ .cb-gradient-text {
302
+ background: linear-gradient(90deg, #ffffff 0%, #F6C945 35%, #E33A2C 70%, #ffffff 100%);
303
+ background-size: 220% 100%;
304
+ -webkit-background-clip: text;
305
+ background-clip: text;
306
+ color: transparent;
307
+ animation: cbShimmer 6s ease-in-out infinite;
308
+ }
309
+
310
+ .cb-shimmer-mask {
311
+ background: linear-gradient(120deg, rgba(255,255,255,0.0) 0%, rgba(255,255,255,0.10) 45%, rgba(255,255,255,0.0) 70%);
312
+ background-size: 220% 100%;
313
+ animation: cbShimmer 6s ease-in-out infinite;
314
+ mix-blend-mode: overlay;
315
+ pointer-events: none;
316
+ }
317
+
318
+ .cb-float {
319
+ animation: cbFloat 7s ease-in-out infinite;
320
+ }
321
+
322
+ .cb-parallax-card {
323
+ transform: translate3d(0, 0, 0);
324
+ will-change: transform;
325
+ }
326
+
327
+ .cb-scroll-cue {
328
+ animation: cbCue 2.2s ease-in-out infinite;
329
+ }
330
+
331
+ .cb-intro-lock {
332
+ /* keeps layout stable while scroll is locked */
333
+ overscroll-behavior: none;
334
+ }
335
+
336
+ .cb-skip-enter {
337
+ animation: cbToastIn 420ms cubic-bezier(.2,.9,.2,1) both;
338
+ }
339
+
340
+ .cb-toast-enter {
341
+ animation: cbToastIn 420ms cubic-bezier(.2,.9,.2,1) both;
342
+ }
343
+
344
+ .cb-word {
345
+ display: inline-block;
346
+ opacity: 0;
347
+ transform: translateY(18px);
348
+ filter: blur(8px);
349
+ animation: cbWordIn 760ms cubic-bezier(.2,.9,.2,1) both;
350
+ animation-delay: calc(var(--i) * 60ms + var(--d, 0ms));
351
+ }
352
+
353
+ .cb-crt {
354
+ background-image:
355
+ radial-gradient(1200px 800px at 50% 20%, rgba(255,255,255,0.08), rgba(0,0,0,0) 60%),
356
+ repeating-linear-gradient(0deg, rgba(255,255,255,0.06) 0px, rgba(255,255,255,0.06) 1px, rgba(0,0,0,0) 2px, rgba(0,0,0,0) 4px);
357
+ mix-blend-mode: overlay;
358
+ opacity: 0.7;
359
+ pointer-events: none;
360
+ }
361
+
362
+ .cb-reduced,
363
+ .cb-reduced .cb-letter,
364
+ .cb-reduced.cb-letter {
365
+ animation: none !important;
366
+ transition: none !important;
367
+ }
368
+
369
+ @keyframes cbFadeIn {
370
+ from { opacity: 0; transform: translateY(10px); }
371
+ to { opacity: 1; transform: translateY(0); }
372
+ }
373
+
374
+ @keyframes cbRevealUp {
375
+ from { opacity: 0; transform: translateY(18px); filter: blur(8px); }
376
+ to { opacity: 1; transform: translateY(0); filter: blur(0); }
377
+ }
378
+
379
+ @keyframes cbLetterIn {
380
+ from { opacity: 0; transform: translateY(22px) scale(0.98); filter: blur(10px); }
381
+ to { opacity: 1; transform: translateY(0) scale(1); filter: blur(0); }
382
+ }
383
+
384
+ @keyframes cbShimmer {
385
+ 0% { background-position: 0% 50%; }
386
+ 50% { background-position: 100% 50%; }
387
+ 100% { background-position: 0% 50%; }
388
+ }
389
+
390
+ @keyframes cbFloat {
391
+ 0% { transform: translateY(0px); }
392
+ 50% { transform: translateY(-10px); }
393
+ 100% { transform: translateY(0px); }
394
+ }
395
+
396
+ @keyframes cbCue {
397
+ 0%, 100% { transform: translateY(0px); opacity: 0.65; }
398
+ 50% { transform: translateY(8px); opacity: 1; }
399
+ }
400
+
401
+ @keyframes cbToastIn {
402
+ from { opacity: 0; transform: translateX(10px) translateY(6px); filter: blur(8px); }
403
+ to { opacity: 1; transform: translateX(0) translateY(0); filter: blur(0); }
404
+ }
405
+
406
+ @keyframes cbWordIn {
407
+ from { opacity: 0; transform: translateY(18px); filter: blur(8px); }
408
+ to { opacity: 1; transform: translateY(0); filter: blur(0); }
409
+ }
410
+
411
+ @media (prefers-reduced-motion: reduce) {
412
+ .cb-fade-in, .cb-reveal-line, .cb-letter, .cb-gradient-text, .cb-shimmer-mask, .cb-float, .cb-scroll-cue, .cb-toast-enter, .cb-word {
413
+ animation: none !important;
414
+ }
415
+ }
416
+ `
417
+ }
418
+ });
419
+ }
420
+ function AnimatedWord({
421
+ word,
422
+ className,
423
+ reducedMotion
424
+ }) {
425
+ const letters = useMemo(() => word.split(''), [word]);
426
+ return jsx("h1", {
427
+ className: [className || '', 'leading-none'].join(' '),
428
+ children: jsx("span", {
429
+ className: ['cb-gradient-text', reducedMotion ? 'cb-reduced' : ''].join(' '),
430
+ children: letters.map((ch, idx) => jsx("span", {
431
+ className: "cb-letter",
432
+ style: {
433
+ ['--i']: idx
434
+ },
435
+ children: ch === ' ' ? '\u00A0' : ch
436
+ }, `${ch}-${idx}`))
437
+ })
438
+ });
439
+ }
440
+ function ClockbookHero({
441
+ reducedMotion,
442
+ onHeroImageLoaded,
443
+ introLocked,
444
+ onSkipIntro
445
+ }) {
446
+ return jsxs(Section, {
447
+ tone: "dark",
448
+ className: ['relative overflow-hidden', introLocked ? 'cb-intro-lock' : ''].join(' '),
449
+ children: [jsx("div", {
450
+ className: "pointer-events-none absolute inset-0",
451
+ style: {
452
+ background: 'radial-gradient(1200px 800px at 20% 10%, rgba(255, 255, 255, 0.12), transparent 55%), radial-gradient(900px 700px at 80% 30%, rgba(246, 201, 69, 0.12), transparent 55%), radial-gradient(900px 700px at 60% 90%, rgba(227, 58, 44, 0.12), transparent 55%)'
453
+ }
454
+ }), jsx("div", {
455
+ className: "pointer-events-none absolute inset-0 cb-noise"
456
+ }), jsx(Container, {
457
+ className: "relative py-14 sm:py-20",
176
458
  children: jsx("div", {
177
- className: "container mx-auto px-16",
459
+ className: "mx-auto max-w-5xl",
178
460
  children: jsxs("div", {
179
- className: "flex flex-col items-center justify-between gap-10 rounded-xl bg-card p-8 shadow-sm md:flex-row",
180
- children: [jsxs("div", {
181
- className: "w-full space-y-5 md:w-1/2",
182
- children: [jsx("h2", {
183
- className: "text-3xl font-bold tracking-tight text-foreground",
184
- children: featuredProduct.title
185
- }), jsx("p", {
186
- className: "text-lg text-muted-foreground",
187
- children: featuredProduct.description
188
- }), jsx(Button, {
189
- variant: "outline",
190
- className: "mt-4 border-primary px-6 py-2.5 text-primary hover:bg-primary/10",
191
- children: featuredProduct.ctaText
461
+ className: "flex flex-col items-center text-center",
462
+ children: [jsx("p", {
463
+ className: "cb-fade-in text-xs font-medium uppercase tracking-[0.3em] text-white/60",
464
+ children: "Clockbook"
465
+ }), jsxs("div", {
466
+ className: "mt-6",
467
+ children: [jsx(AnimatedWord, {
468
+ word: "CLOCKBOOK",
469
+ reducedMotion: reducedMotion,
470
+ className: "text-5xl font-semibold tracking-tight sm:text-7xl lg:text-8xl"
471
+ }), jsx("div", {
472
+ className: "mt-4 overflow-hidden",
473
+ children: jsx("p", {
474
+ className: ['cb-reveal-line text-balance text-lg font-medium text-white/80 sm:text-2xl', reducedMotion ? 'cb-reduced' : ''].join(' '),
475
+ style: {
476
+ ['--d']: '140ms'
477
+ },
478
+ children: "The Operating System for Business"
479
+ })
480
+ })]
481
+ }), jsx("p", {
482
+ className: "cb-fade-in mt-6 max-w-3xl text-pretty text-base leading-relaxed text-white/70 sm:text-lg",
483
+ children: "Run your entire business on Clockbook with our unified cloud platform, designed to help you break down silos between departments and increase organizational efficiency."
484
+ }), jsxs("div", {
485
+ className: "cb-fade-in mt-8 flex flex-wrap justify-center gap-3",
486
+ children: [jsx(Link, {
487
+ to: "/get-started",
488
+ children: jsx(Button, {
489
+ className: "h-11 bg-[#E33A2C] px-6 text-white hover:bg-[#c82f23]",
490
+ children: "Get started"
491
+ })
492
+ }), jsx(Link, {
493
+ to: "/help-center",
494
+ children: jsx(Button, {
495
+ className: "h-11 border border-white/15 bg-white/5 px-6 text-white hover:bg-white/10",
496
+ children: "Explore the platform"
497
+ })
498
+ })]
499
+ }), jsxs("div", {
500
+ className: "mt-12 w-full max-w-6xl",
501
+ children: [jsxs("div", {
502
+ className: "relative mx-auto overflow-hidden rounded-2xl border border-white/10 bg-white/5 shadow-[0_30px_120px_rgba(0,0,0,0.55)]",
503
+ children: [jsx("div", {
504
+ className: "absolute inset-0 cb-shimmer-mask"
505
+ }), jsx("img", {
506
+ src: Images.marketing.dashboard,
507
+ alt: "Clockbook dashboard preview",
508
+ className: ['h-[260px] w-full object-cover sm:h-[380px] lg:h-[460px]', reducedMotion ? '' : 'cb-float'].join(' '),
509
+ loading: "lazy",
510
+ onLoad: onHeroImageLoaded
511
+ })]
512
+ }), jsxs("div", {
513
+ className: "cb-fade-in mt-6 flex items-center justify-center gap-3 text-sm text-white/55",
514
+ children: [jsx("span", {
515
+ className: "h-1.5 w-1.5 rounded-full bg-white/40"
516
+ }), jsx("span", {
517
+ children: "Your business's success, powered by our platform's intelligence"
518
+ })]
192
519
  })]
193
- }), jsx("div", {
194
- className: "h-72 w-full overflow-hidden rounded-lg shadow-md md:w-1/2",
195
- children: jsx("img", {
196
- src: featuredProduct.image,
197
- alt: "Yantra Supply Products",
198
- className: "h-full w-full object-cover"
520
+ }), !reducedMotion && introLocked ? jsx("div", {
521
+ className: "cb-skip-enter mt-8",
522
+ children: jsx("button", {
523
+ type: "button",
524
+ onClick: onSkipIntro,
525
+ className: "rounded-full border border-white/15 bg-white/5 px-4 py-2 text-xs font-medium uppercase tracking-[0.22em] text-white/70 hover:bg-white/10",
526
+ children: "Skip intro"
199
527
  })
200
- })]
528
+ }) : null]
201
529
  })
202
530
  })
203
- }), jsx(ResourcesSection, {
204
- title: "More resources",
205
- resources: resources,
206
- onResourceClick: handleResourceClick
531
+ }), jsx("div", {
532
+ className: "pb-12",
533
+ children: jsx(ScrollCue, {
534
+ reducedMotion: reducedMotion
535
+ })
536
+ })]
537
+ });
538
+ }
539
+ function ScrollCue({
540
+ reducedMotion
541
+ }) {
542
+ return jsx("div", {
543
+ className: ['mx-auto flex w-full max-w-7xl justify-center', reducedMotion ? 'cb-reduced' : ''].join(' '),
544
+ children: jsxs("div", {
545
+ className: "cb-scroll-cue flex items-center gap-2 text-xs font-medium uppercase tracking-[0.25em] text-white/50",
546
+ children: [jsx("span", {
547
+ children: "Scroll"
548
+ }), jsx("span", {
549
+ className: "inline-flex h-6 w-4 items-start justify-center rounded-full border border-white/20",
550
+ children: jsx("span", {
551
+ className: "mt-1 h-1.5 w-1.5 rounded-full bg-white/60"
552
+ })
553
+ })]
554
+ })
555
+ });
556
+ }
557
+ function useBodyScrollLock(locked) {
558
+ const lockedRef = useRef(false);
559
+ useEffect(() => {
560
+ if (typeof document === 'undefined') return;
561
+ if (lockedRef.current === locked) return;
562
+ lockedRef.current = locked;
563
+ const docEl = document.documentElement;
564
+ const body = document.body;
565
+ const prevOverflow = docEl.style.overflow;
566
+ const prevBodyOverflow = body.style.overflow;
567
+ const prevent = e => {
568
+ e.preventDefault();
569
+ };
570
+ if (locked) {
571
+ docEl.style.overflow = 'hidden';
572
+ body.style.overflow = 'hidden';
573
+ // Prevent trackpad / touch scrolling in some browsers
574
+ window.addEventListener('wheel', prevent, {
575
+ passive: false
576
+ });
577
+ window.addEventListener('touchmove', prevent, {
578
+ passive: false
579
+ });
580
+ }
581
+ return () => {
582
+ docEl.style.overflow = prevOverflow;
583
+ body.style.overflow = prevBodyOverflow;
584
+ window.removeEventListener('wheel', prevent);
585
+ window.removeEventListener('touchmove', prevent);
586
+ };
587
+ }, [locked]);
588
+ }
589
+ function usePrefersReducedMotion() {
590
+ const [reduced, setReduced] = useState(false);
591
+ useEffect(() => {
592
+ if (typeof window === 'undefined' || !window.matchMedia) return;
593
+ const mq = window.matchMedia('(prefers-reduced-motion: reduce)');
594
+ const update = () => setReduced(mq.matches);
595
+ update();
596
+ // Safari fallback
597
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
598
+ const anyMq = mq;
599
+ if (mq.addEventListener) mq.addEventListener('change', update);else if (anyMq.addListener) anyMq.addListener(update);
600
+ return () => {
601
+ if (mq.removeEventListener) mq.removeEventListener('change', update);else if (anyMq.removeListener) anyMq.removeListener(update);
602
+ };
603
+ }, []);
604
+ return reduced;
605
+ }
606
+ function useInView(options) {
607
+ const ref = useRef(null);
608
+ const [inView, setInView] = useState(false);
609
+ useEffect(() => {
610
+ if (typeof window === 'undefined' || !ref.current) return;
611
+ if (!('IntersectionObserver' in window)) {
612
+ setInView(true);
613
+ return;
614
+ }
615
+ const observer = new IntersectionObserver(entries => {
616
+ const entry = entries[0];
617
+ if (entry?.isIntersecting) setInView(true);
618
+ }, {
619
+ root: options.root || null,
620
+ rootMargin: options.rootMargin || '0px',
621
+ threshold: options.threshold || 0.1
622
+ });
623
+ observer.observe(ref.current);
624
+ return () => observer.disconnect();
625
+ // eslint-disable-next-line react-hooks/exhaustive-deps
626
+ }, [options.rootMargin, options.threshold]);
627
+ return [ref, inView];
628
+ }
629
+ function ScrollReveal({
630
+ children,
631
+ reducedMotion
632
+ }) {
633
+ const [ref, inView] = useInView({
634
+ rootMargin: '-10% 0px -10% 0px',
635
+ threshold: 0.12
636
+ });
637
+ const active = reducedMotion ? true : inView;
638
+ return jsx("div", {
639
+ ref: ref,
640
+ className: ['transition-all duration-700', active ? 'translate-y-0 opacity-100' : 'translate-y-4 opacity-0'].join(' '),
641
+ style: active ? undefined : {
642
+ filter: 'blur(8px)'
643
+ },
644
+ children: children
645
+ });
646
+ }
647
+ function ValueCard({
648
+ title,
649
+ description
650
+ }) {
651
+ return jsxs("div", {
652
+ className: "rounded-2xl border border-foreground/10 bg-background p-6 shadow-sm",
653
+ children: [jsx("p", {
654
+ className: "text-xs font-medium uppercase tracking-[0.22em] text-muted-foreground",
655
+ children: title
656
+ }), jsx("p", {
657
+ className: "mt-4 text-sm leading-relaxed text-muted-foreground",
658
+ children: description
207
659
  })]
208
660
  });
209
- };export{LandingPage as default};//# sourceMappingURL=index.js.map
661
+ }export{LandingPage as default};//# sourceMappingURL=index.js.map