@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.
- package/lib/Validation/Schema.d.ts +54 -0
- package/lib/Validation/Schema.d.ts.map +1 -0
- package/lib/Validation/Schema.js +26 -0
- package/lib/Validation/Schema.js.map +1 -0
- package/lib/components/HelpCenterFooter.d.ts.map +1 -1
- package/lib/components/HelpCenterFooter.js +11 -7
- package/lib/components/HelpCenterFooter.js.map +1 -1
- package/lib/components/HelpCenterHeader.js +1 -1
- package/lib/components/Logo.d.ts.map +1 -1
- package/lib/components/Logo.js +56 -91
- package/lib/components/Logo.js.map +1 -1
- package/lib/components/navbar/index.d.ts.map +1 -1
- package/lib/components/navbar/index.js +5 -3
- package/lib/components/navbar/index.js.map +1 -1
- package/lib/compute.d.ts.map +1 -1
- package/lib/compute.js +43 -7
- package/lib/compute.js.map +1 -1
- package/lib/config/env-config.d.ts +17 -0
- package/lib/config/env-config.d.ts.map +1 -0
- package/lib/config/env-config.js +52 -0
- package/lib/config/env-config.js.map +1 -0
- package/lib/{config.d.ts → config/index.d.ts} +2 -13
- package/lib/config/index.d.ts.map +1 -0
- package/lib/pages/ArticlePage/index.d.ts.map +1 -1
- package/lib/pages/ArticlePage/index.js +32 -0
- package/lib/pages/ArticlePage/index.js.map +1 -1
- package/lib/pages/Contact-us/index.d.ts +3 -0
- package/lib/pages/Contact-us/index.d.ts.map +1 -0
- package/lib/pages/Contact-us/index.js +159 -0
- package/lib/pages/Contact-us/index.js.map +1 -0
- package/lib/pages/Feedback/index.d.ts +3 -0
- package/lib/pages/Feedback/index.d.ts.map +1 -0
- package/lib/pages/Feedback/index.js +126 -0
- package/lib/pages/Feedback/index.js.map +1 -0
- package/lib/pages/GetStarted/index.d.ts.map +1 -1
- package/lib/pages/GetStarted/index.js +14 -14
- package/lib/pages/GetStarted/index.js.map +1 -1
- package/lib/pages/HelpCenter/components/CaresHero.d.ts +6 -0
- package/lib/pages/HelpCenter/components/CaresHero.d.ts.map +1 -0
- package/lib/pages/HelpCenter/components/CaresHero.js +55 -0
- package/lib/pages/HelpCenter/components/CaresHero.js.map +1 -0
- package/lib/pages/HelpCenter/components/CaresLayout.d.ts +11 -0
- package/lib/pages/HelpCenter/components/CaresLayout.d.ts.map +1 -0
- package/lib/pages/HelpCenter/components/CaresLayout.js +20 -0
- package/lib/pages/HelpCenter/components/CaresLayout.js.map +1 -0
- package/lib/pages/HelpCenter/components/HelpCategoryCard.d.ts +4 -4
- package/lib/pages/HelpCenter/components/HelpCategoryCard.d.ts.map +1 -1
- package/lib/pages/HelpCenter/components/NeedHelpWithSection.d.ts +6 -0
- package/lib/pages/HelpCenter/components/NeedHelpWithSection.d.ts.map +1 -0
- package/lib/pages/HelpCenter/components/NeedHelpWithSection.js +70 -0
- package/lib/pages/HelpCenter/components/NeedHelpWithSection.js.map +1 -0
- package/lib/pages/HelpCenter/components/PopularArticlesGrid.d.ts +8 -0
- package/lib/pages/HelpCenter/components/PopularArticlesGrid.d.ts.map +1 -0
- package/lib/pages/HelpCenter/components/PopularArticlesGrid.js +21 -0
- package/lib/pages/HelpCenter/components/PopularArticlesGrid.js.map +1 -0
- package/lib/pages/HelpCenter/components/SupportPlansSection.d.ts +3 -0
- package/lib/pages/HelpCenter/components/SupportPlansSection.d.ts.map +1 -0
- package/lib/pages/HelpCenter/components/SupportPlansSection.js +63 -0
- package/lib/pages/HelpCenter/components/SupportPlansSection.js.map +1 -0
- package/lib/pages/HelpCenter/components/SupportServicesSection.d.ts +3 -0
- package/lib/pages/HelpCenter/components/SupportServicesSection.d.ts.map +1 -0
- package/lib/pages/HelpCenter/components/SupportServicesSection.js +61 -0
- package/lib/pages/HelpCenter/components/SupportServicesSection.js.map +1 -0
- package/lib/pages/HelpCenter/index.d.ts.map +1 -1
- package/lib/pages/HelpCenter/index.js +13 -60
- package/lib/pages/HelpCenter/index.js.map +1 -1
- package/lib/pages/HelpCenter/mockData.d.ts.map +1 -1
- package/lib/pages/HelpCenter/mockData.js +13 -9
- package/lib/pages/HelpCenter/mockData.js.map +1 -1
- package/lib/pages/LandingPage/components/Assets.d.ts +26 -0
- package/lib/pages/LandingPage/components/Assets.d.ts.map +1 -1
- package/lib/pages/LandingPage/components/Assets.js +6 -12
- package/lib/pages/LandingPage/components/Assets.js.map +1 -1
- package/lib/pages/LandingPage/components/BuildingSoftwareScene.d.ts +4 -0
- package/lib/pages/LandingPage/components/BuildingSoftwareScene.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/BuildingSoftwareScene.js +1679 -0
- package/lib/pages/LandingPage/components/BuildingSoftwareScene.js.map +1 -0
- package/lib/pages/LandingPage/components/CodeEditor.d.ts +7 -0
- package/lib/pages/LandingPage/components/CodeEditor.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ControlCard.d.ts +6 -0
- package/lib/pages/LandingPage/components/ControlCard.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ControlCard.js +98 -0
- package/lib/pages/LandingPage/components/ControlCard.js.map +1 -0
- package/lib/pages/LandingPage/components/DeployButton.d.ts +8 -0
- package/lib/pages/LandingPage/components/DeployButton.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/DeploymentResult.d.ts +6 -0
- package/lib/pages/LandingPage/components/DeploymentResult.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/IconButton.d.ts +8 -0
- package/lib/pages/LandingPage/components/IconButton.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ImageCard.d.ts +13 -0
- package/lib/pages/LandingPage/components/ImageCard.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ImageCard.js +38 -0
- package/lib/pages/LandingPage/components/ImageCard.js.map +1 -0
- package/lib/pages/LandingPage/components/InfrastructureCard.d.ts +4 -0
- package/lib/pages/LandingPage/components/InfrastructureCard.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/InfrastructureCard.js +236 -0
- package/lib/pages/LandingPage/components/InfrastructureCard.js.map +1 -0
- package/lib/pages/LandingPage/components/InfrastructureTabs.d.ts +4 -0
- package/lib/pages/LandingPage/components/InfrastructureTabs.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/InfrastructureTabs.js +57 -0
- package/lib/pages/LandingPage/components/InfrastructureTabs.js.map +1 -0
- package/lib/pages/LandingPage/components/Investigation.d.ts +4 -0
- package/lib/pages/LandingPage/components/Investigation.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/InvestigationCard.d.ts +6 -0
- package/lib/pages/LandingPage/components/InvestigationCard.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/InvestigationCard.js +118 -0
- package/lib/pages/LandingPage/components/InvestigationCard.js.map +1 -0
- package/lib/pages/LandingPage/components/LearningCard.d.ts +9 -0
- package/lib/pages/LandingPage/components/LearningCard.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/LearningCard.js +22 -0
- package/lib/pages/LandingPage/components/LearningCard.js.map +1 -0
- package/lib/pages/LandingPage/components/MetricsDisplay.d.ts +6 -0
- package/lib/pages/LandingPage/components/MetricsDisplay.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ProfilesCard.d.ts +10 -0
- package/lib/pages/LandingPage/components/ProfilesCard.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ProfilesCard.js +52 -0
- package/lib/pages/LandingPage/components/ProfilesCard.js.map +1 -0
- package/lib/pages/LandingPage/components/Section.d.ts +12 -0
- package/lib/pages/LandingPage/components/Section.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/Section.js +26 -0
- package/lib/pages/LandingPage/components/Section.js.map +1 -0
- package/lib/pages/LandingPage/components/Toast.d.ts +12 -0
- package/lib/pages/LandingPage/components/Toast.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/Toast.js +39 -0
- package/lib/pages/LandingPage/components/Toast.js.map +1 -0
- package/lib/pages/LandingPage/components/ToastContainer.d.ts +13 -0
- package/lib/pages/LandingPage/components/ToastContainer.d.ts.map +1 -0
- package/lib/pages/LandingPage/components/ToastContainer.js +62 -0
- package/lib/pages/LandingPage/components/ToastContainer.js.map +1 -0
- package/lib/pages/LandingPage/components/index.d.ts +16 -0
- package/lib/pages/LandingPage/components/index.d.ts.map +1 -0
- package/lib/pages/LandingPage/index.d.ts.map +1 -1
- package/lib/pages/LandingPage/index.js +641 -189
- package/lib/pages/LandingPage/index.js.map +1 -1
- package/lib/pages/Privacy/index.d.ts +3 -0
- package/lib/pages/Privacy/index.d.ts.map +1 -0
- package/lib/pages/Privacy/index.js +7590 -0
- package/lib/pages/Privacy/index.js.map +1 -0
- package/lib/pages/Thanks/index.d.ts +2 -0
- package/lib/pages/Thanks/index.d.ts.map +1 -0
- package/lib/pages/Thanks/index.js +56 -0
- package/lib/pages/Thanks/index.js.map +1 -0
- package/lib/routes.json +44 -0
- package/lib/utils/markdownLoader.d.ts +2 -0
- package/lib/utils/markdownLoader.d.ts.map +1 -1
- package/lib/utils/markdownLoader.js +1590 -1104
- package/lib/utils/markdownLoader.js.map +1 -1
- package/package.json +2 -2
- package/lib/config.d.ts.map +0 -1
- package/lib/pages/HelpCenter/components/BookStack.js +0 -36
- package/lib/pages/HelpCenter/components/BookStack.js.map +0 -1
- package/lib/pages/LandingPage/components/ArticleCard.d.ts +0 -11
- package/lib/pages/LandingPage/components/ArticleCard.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/ArticleCard.js +0 -29
- package/lib/pages/LandingPage/components/ArticleCard.js.map +0 -1
- package/lib/pages/LandingPage/components/CategoriesSection.d.ts +0 -16
- package/lib/pages/LandingPage/components/CategoriesSection.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/CategoriesSection.js +0 -31
- package/lib/pages/LandingPage/components/CategoriesSection.js.map +0 -1
- package/lib/pages/LandingPage/components/CategoryCard.d.ts +0 -11
- package/lib/pages/LandingPage/components/CategoryCard.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/CategoryCard.js +0 -25
- package/lib/pages/LandingPage/components/CategoryCard.js.map +0 -1
- package/lib/pages/LandingPage/components/FeaturedSection.d.ts +0 -15
- package/lib/pages/LandingPage/components/FeaturedSection.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/FeaturedSection.js +0 -24
- package/lib/pages/LandingPage/components/FeaturedSection.js.map +0 -1
- package/lib/pages/LandingPage/components/HeroSection.d.ts +0 -9
- package/lib/pages/LandingPage/components/HeroSection.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/HeroSection.js +0 -46
- package/lib/pages/LandingPage/components/HeroSection.js.map +0 -1
- package/lib/pages/LandingPage/components/Icons.d.ts +0 -14
- package/lib/pages/LandingPage/components/Icons.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/Icons.js +0 -174
- package/lib/pages/LandingPage/components/Icons.js.map +0 -1
- package/lib/pages/LandingPage/components/ResourceCard.d.ts +0 -12
- package/lib/pages/LandingPage/components/ResourceCard.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/ResourceCard.js +0 -30
- package/lib/pages/LandingPage/components/ResourceCard.js.map +0 -1
- package/lib/pages/LandingPage/components/ResourcesSection.d.ts +0 -18
- package/lib/pages/LandingPage/components/ResourcesSection.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/ResourcesSection.js +0 -26
- package/lib/pages/LandingPage/components/ResourcesSection.js.map +0 -1
- package/lib/pages/LandingPage/components/SearchBar.d.ts +0 -8
- package/lib/pages/LandingPage/components/SearchBar.d.ts.map +0 -1
- package/lib/pages/LandingPage/components/SearchBar.js +0 -58
- package/lib/pages/LandingPage/components/SearchBar.js.map +0 -1
|
@@ -1,209 +1,661 @@
|
|
|
1
|
-
import {jsx
|
|
2
|
-
const
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
|
|
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
|
|
8
|
-
|
|
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
|
|
11
|
-
|
|
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
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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: "
|
|
138
|
-
children:
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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: "
|
|
149
|
-
children: [jsx("
|
|
150
|
-
className: "text-
|
|
151
|
-
|
|
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-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
children:
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
-
})
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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: "
|
|
459
|
+
className: "mx-auto max-w-5xl",
|
|
178
460
|
children: jsxs("div", {
|
|
179
|
-
className: "flex flex-col items-center
|
|
180
|
-
children: [
|
|
181
|
-
className: "
|
|
182
|
-
children:
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
className: "mt-4
|
|
191
|
-
children:
|
|
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: "
|
|
195
|
-
children: jsx("
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
className: "
|
|
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(
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
-
}
|
|
661
|
+
}export{LandingPage as default};//# sourceMappingURL=index.js.map
|