@prosophia/lab-classic 0.0.2 → 0.0.4
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/dist/BookPage.module.css +314 -0
- package/dist/ContactCTA.module.css +99 -0
- package/dist/ContactPage.module.css +259 -0
- package/dist/Footer.module.css +240 -0
- package/dist/HomePage.module.css +879 -0
- package/dist/Layout.module.css +368 -0
- package/dist/LegalPage.module.css +239 -0
- package/dist/NewsArticlePage.module.css +214 -0
- package/dist/NewsPage.module.css +189 -0
- package/dist/PastMembersPage.module.css +236 -0
- package/dist/PeoplePage.module.css +465 -0
- package/dist/PicturesPage.module.css +196 -0
- package/dist/PublicationDetailPage.module.css +213 -0
- package/dist/PublicationsPage.module.css +181 -0
- package/dist/ResearchPage.module.css +173 -0
- package/dist/ThemeToggle.module.css +114 -0
- package/dist/index-CSdV51Jq.d.mts +26 -0
- package/dist/index-CSdV51Jq.d.ts +26 -0
- package/dist/index.css +1587 -0
- package/dist/index.d.mts +279 -0
- package/dist/index.d.ts +279 -0
- package/dist/index.js +854 -94
- package/dist/index.mjs +805 -86
- package/dist/layouts/index.css +594 -0
- package/dist/layouts/index.d.mts +13 -0
- package/dist/layouts/index.d.ts +13 -0
- package/dist/layouts/index.js +389 -0
- package/dist/layouts/index.mjs +352 -0
- package/dist/schemas/index.d.mts +182 -0
- package/dist/schemas/index.d.ts +182 -0
- package/dist/schemas/index.js +1026 -0
- package/dist/schemas/index.mjs +987 -0
- package/dist/styles/globals.css +1169 -0
- package/package.json +24 -9
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React$1, { ReactNode } from 'react';
|
|
3
|
+
import { S as SiteSettings$3, P as ProsophiaConfig } from './index-CSdV51Jq.mjs';
|
|
4
|
+
export { a as SiteConfig, T as ThemeConfig } from './index-CSdV51Jq.mjs';
|
|
5
|
+
import * as _sanity_image_url_lib_types_builder from '@sanity/image-url/lib/types/builder';
|
|
6
|
+
import * as next_sanity from 'next-sanity';
|
|
7
|
+
import { SanityClient } from 'next-sanity';
|
|
8
|
+
import { SanityImageSource } from '@sanity/image-url/lib/types/types';
|
|
9
|
+
import { Variants } from 'framer-motion';
|
|
10
|
+
|
|
11
|
+
type AnimatedCardProps = {
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
delay?: number;
|
|
15
|
+
};
|
|
16
|
+
declare function AnimatedCard({ children, className, delay }: AnimatedCardProps): react_jsx_runtime.JSX.Element;
|
|
17
|
+
type AnimatedImageProps = {
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
className?: string;
|
|
20
|
+
};
|
|
21
|
+
declare function AnimatedImage({ children, className }: AnimatedImageProps): react_jsx_runtime.JSX.Element;
|
|
22
|
+
type AnimatedSectionProps = {
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
className?: string;
|
|
25
|
+
};
|
|
26
|
+
declare function AnimatedSection({ children, className }: AnimatedSectionProps): react_jsx_runtime.JSX.Element;
|
|
27
|
+
|
|
28
|
+
type AnimatedGalleryHeaderProps = {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
className?: string;
|
|
31
|
+
};
|
|
32
|
+
declare function AnimatedGalleryHeader({ children, className }: AnimatedGalleryHeaderProps): react_jsx_runtime.JSX.Element;
|
|
33
|
+
type GalleryImage = {
|
|
34
|
+
_id: string;
|
|
35
|
+
imageUrl: string;
|
|
36
|
+
altText: string;
|
|
37
|
+
caption?: string;
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
};
|
|
41
|
+
type AnimatedGalleryGridProps = {
|
|
42
|
+
images: GalleryImage[];
|
|
43
|
+
};
|
|
44
|
+
declare function AnimatedGalleryGrid({ images }: AnimatedGalleryGridProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
|
|
46
|
+
type AnimatedPageProps = {
|
|
47
|
+
children: ReactNode;
|
|
48
|
+
className?: string;
|
|
49
|
+
};
|
|
50
|
+
declare function AnimatedPage({ children, className }: AnimatedPageProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
type AnimatedHeaderProps = {
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
className?: string;
|
|
54
|
+
};
|
|
55
|
+
declare function AnimatedHeader({ children, className }: AnimatedHeaderProps): react_jsx_runtime.JSX.Element;
|
|
56
|
+
type AnimatedMainProps = {
|
|
57
|
+
children: ReactNode;
|
|
58
|
+
className?: string;
|
|
59
|
+
};
|
|
60
|
+
declare function AnimatedMain({ children, className }: AnimatedMainProps): react_jsx_runtime.JSX.Element;
|
|
61
|
+
type StaggeredGridProps = {
|
|
62
|
+
children: ReactNode;
|
|
63
|
+
className?: string;
|
|
64
|
+
};
|
|
65
|
+
declare function StaggeredGrid({ children, className }: StaggeredGridProps): react_jsx_runtime.JSX.Element;
|
|
66
|
+
type AnimatedItemProps = {
|
|
67
|
+
children: ReactNode;
|
|
68
|
+
className?: string;
|
|
69
|
+
delay?: number;
|
|
70
|
+
index?: number;
|
|
71
|
+
};
|
|
72
|
+
declare function AnimatedItem({ children, className, delay, index }: AnimatedItemProps): react_jsx_runtime.JSX.Element;
|
|
73
|
+
type ScrollRevealSectionProps = {
|
|
74
|
+
children: ReactNode;
|
|
75
|
+
className?: string;
|
|
76
|
+
};
|
|
77
|
+
declare function ScrollRevealSection({ children, className }: ScrollRevealSectionProps): react_jsx_runtime.JSX.Element;
|
|
78
|
+
type AnimatedHeroContentProps = {
|
|
79
|
+
children: ReactNode;
|
|
80
|
+
className?: string;
|
|
81
|
+
};
|
|
82
|
+
declare function AnimatedHeroContent({ children, className }: AnimatedHeroContentProps): react_jsx_runtime.JSX.Element;
|
|
83
|
+
|
|
84
|
+
type AnimatedGridProps = {
|
|
85
|
+
children: ReactNode;
|
|
86
|
+
className?: string;
|
|
87
|
+
};
|
|
88
|
+
declare function AnimatedGrid({ children, className }: AnimatedGridProps): react_jsx_runtime.JSX.Element;
|
|
89
|
+
type AnimatedStatsProps = {
|
|
90
|
+
children: ReactNode;
|
|
91
|
+
className?: string;
|
|
92
|
+
};
|
|
93
|
+
declare function AnimatedStats({ children, className }: AnimatedStatsProps): react_jsx_runtime.JSX.Element;
|
|
94
|
+
type AnimatedSectionHeaderProps = {
|
|
95
|
+
children: ReactNode;
|
|
96
|
+
className?: string;
|
|
97
|
+
};
|
|
98
|
+
declare function AnimatedSectionHeader({ children, className }: AnimatedSectionHeaderProps): react_jsx_runtime.JSX.Element;
|
|
99
|
+
type AnimatedListProps = {
|
|
100
|
+
children: ReactNode;
|
|
101
|
+
className?: string;
|
|
102
|
+
};
|
|
103
|
+
declare function AnimatedList({ children, className }: AnimatedListProps): react_jsx_runtime.JSX.Element;
|
|
104
|
+
|
|
105
|
+
type AnimatedHeroProps = {
|
|
106
|
+
heroData: {
|
|
107
|
+
tagline: string;
|
|
108
|
+
heading: string;
|
|
109
|
+
headingAccent: string;
|
|
110
|
+
description: string;
|
|
111
|
+
ctaText: string;
|
|
112
|
+
ctaLink: string;
|
|
113
|
+
image: string | null;
|
|
114
|
+
};
|
|
115
|
+
ArrowRightIcon: React.ComponentType;
|
|
116
|
+
};
|
|
117
|
+
declare function AnimatedHero({ heroData, ArrowRightIcon }: AnimatedHeroProps): react_jsx_runtime.JSX.Element;
|
|
118
|
+
|
|
119
|
+
type SiteSettings$2 = {
|
|
120
|
+
labName?: string;
|
|
121
|
+
labNameAccent?: string;
|
|
122
|
+
footerText?: string;
|
|
123
|
+
showPrivacyPolicy?: boolean;
|
|
124
|
+
privacyPolicyUrl?: string;
|
|
125
|
+
showTerms?: boolean;
|
|
126
|
+
termsUrl?: string;
|
|
127
|
+
};
|
|
128
|
+
type ClientLayoutProps = {
|
|
129
|
+
children: React$1.ReactNode;
|
|
130
|
+
settings: SiteSettings$2;
|
|
131
|
+
};
|
|
132
|
+
declare function ClientLayout({ children, settings }: ClientLayoutProps): react_jsx_runtime.JSX.Element;
|
|
133
|
+
|
|
134
|
+
declare function ContactCTA(): react_jsx_runtime.JSX.Element;
|
|
135
|
+
|
|
136
|
+
type SiteSettings$1 = {
|
|
137
|
+
labName?: string;
|
|
138
|
+
labNameAccent?: string;
|
|
139
|
+
labNameDescription?: string;
|
|
140
|
+
footerText?: string;
|
|
141
|
+
showPrivacyPolicy?: boolean;
|
|
142
|
+
privacyPolicyUrl?: string;
|
|
143
|
+
showTerms?: boolean;
|
|
144
|
+
termsUrl?: string;
|
|
145
|
+
};
|
|
146
|
+
declare function Footer({ settings }: {
|
|
147
|
+
settings: SiteSettings$1;
|
|
148
|
+
}): react_jsx_runtime.JSX.Element;
|
|
149
|
+
|
|
150
|
+
type SiteSettings = {
|
|
151
|
+
labName?: string;
|
|
152
|
+
labNameAccent?: string;
|
|
153
|
+
};
|
|
154
|
+
declare function Header({ settings }: {
|
|
155
|
+
settings: SiteSettings;
|
|
156
|
+
}): react_jsx_runtime.JSX.Element;
|
|
157
|
+
|
|
158
|
+
declare function ThemeToggle(): react_jsx_runtime.JSX.Element;
|
|
159
|
+
|
|
160
|
+
interface HomePageProps {
|
|
161
|
+
children?: React.ReactNode;
|
|
162
|
+
settings?: SiteSettings$3 | null;
|
|
163
|
+
header?: React.ReactNode;
|
|
164
|
+
footer?: React.ReactNode;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Main HomePage wrapper for lab-classic template
|
|
168
|
+
* Provides consistent header/footer with customizable main content
|
|
169
|
+
*/
|
|
170
|
+
declare function HomePage({ children, settings, header, footer, }: HomePageProps): react_jsx_runtime.JSX.Element;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Define configuration for your lab website
|
|
174
|
+
* @param config - The site configuration object
|
|
175
|
+
* @returns The configuration object (passthrough for type safety)
|
|
176
|
+
*/
|
|
177
|
+
declare function defineConfig(config: ProsophiaConfig): ProsophiaConfig;
|
|
178
|
+
|
|
179
|
+
declare function getClient(): SanityClient;
|
|
180
|
+
declare const client: {
|
|
181
|
+
readonly projectId: string | undefined;
|
|
182
|
+
readonly dataset: string;
|
|
183
|
+
fetch: (query: string, params: next_sanity.QueryWithoutParams | next_sanity.QueryParams, options: next_sanity.UnfilteredResponseWithoutQuery) => Promise<next_sanity.RawQuerylessQueryResponse<any>>;
|
|
184
|
+
};
|
|
185
|
+
declare function urlFor(source: SanityImageSource): _sanity_image_url_lib_types_builder.ImageUrlBuilder | {
|
|
186
|
+
width: () => {
|
|
187
|
+
height: () => {
|
|
188
|
+
url: () => string;
|
|
189
|
+
};
|
|
190
|
+
url: () => string;
|
|
191
|
+
};
|
|
192
|
+
height: () => {
|
|
193
|
+
width: () => {
|
|
194
|
+
url: () => string;
|
|
195
|
+
};
|
|
196
|
+
url: () => string;
|
|
197
|
+
};
|
|
198
|
+
url: () => string;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Shared Framer Motion Animation Variants and Utilities
|
|
203
|
+
* Inspired by verdant-website's smooth animations
|
|
204
|
+
*/
|
|
205
|
+
|
|
206
|
+
declare const fadeIn: Variants;
|
|
207
|
+
declare const fadeInUp: Variants;
|
|
208
|
+
declare const fadeInUpShort: Variants;
|
|
209
|
+
declare const scaleIn: Variants;
|
|
210
|
+
declare const slideInRight: Variants;
|
|
211
|
+
declare const slideInLeft: Variants;
|
|
212
|
+
declare const staggerContainer: Variants;
|
|
213
|
+
declare const staggerItem: Variants;
|
|
214
|
+
declare const cardHover: Variants;
|
|
215
|
+
declare const imageZoom: Variants;
|
|
216
|
+
declare const pageTransition: Variants;
|
|
217
|
+
declare const viewportSettings: {
|
|
218
|
+
once: boolean;
|
|
219
|
+
amount: number;
|
|
220
|
+
margin: string;
|
|
221
|
+
};
|
|
222
|
+
declare const scrollReveal: {
|
|
223
|
+
hidden: {
|
|
224
|
+
opacity: number;
|
|
225
|
+
y: number;
|
|
226
|
+
};
|
|
227
|
+
visible: {
|
|
228
|
+
opacity: number;
|
|
229
|
+
y: number;
|
|
230
|
+
transition: {
|
|
231
|
+
duration: number;
|
|
232
|
+
ease: number[];
|
|
233
|
+
};
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
declare const reducedMotion: {
|
|
237
|
+
hidden: {
|
|
238
|
+
opacity: number;
|
|
239
|
+
};
|
|
240
|
+
visible: {
|
|
241
|
+
opacity: number;
|
|
242
|
+
transition: {
|
|
243
|
+
duration: number;
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Security Utilities for URL and Input Validation
|
|
250
|
+
*/
|
|
251
|
+
/**
|
|
252
|
+
* Validates that a URL is safe to use as an external link.
|
|
253
|
+
* Prevents javascript: URLs, data: URLs, and other potentially malicious schemes.
|
|
254
|
+
*/
|
|
255
|
+
declare function isValidExternalUrl(url: string | undefined | null): boolean;
|
|
256
|
+
/**
|
|
257
|
+
* Validates that a URL is a valid Google Maps embed URL.
|
|
258
|
+
* Only allows URLs from Google's embed domains.
|
|
259
|
+
*/
|
|
260
|
+
declare function isValidGoogleMapsEmbedUrl(url: string | undefined | null): boolean;
|
|
261
|
+
/**
|
|
262
|
+
* Sanitizes a URL for safe use in links.
|
|
263
|
+
* Returns undefined if the URL is invalid.
|
|
264
|
+
*/
|
|
265
|
+
declare function sanitizeUrl(url: string | undefined | null): string | undefined;
|
|
266
|
+
/**
|
|
267
|
+
* Validates an email address format.
|
|
268
|
+
*/
|
|
269
|
+
declare function isValidEmail(email: string | undefined | null): boolean;
|
|
270
|
+
/**
|
|
271
|
+
* Escapes HTML special characters to prevent XSS.
|
|
272
|
+
*/
|
|
273
|
+
declare function escapeHtml(text: string): string;
|
|
274
|
+
/**
|
|
275
|
+
* Validates a slug format (lowercase alphanumeric with hyphens).
|
|
276
|
+
*/
|
|
277
|
+
declare function isValidSlug(slug: string | undefined | null): boolean;
|
|
278
|
+
|
|
279
|
+
export { AnimatedCard, AnimatedGalleryGrid, AnimatedGalleryHeader, AnimatedGrid, AnimatedHeader, AnimatedHero, AnimatedHeroContent, AnimatedImage, AnimatedItem, AnimatedList, AnimatedMain, AnimatedPage, AnimatedSection, AnimatedSectionHeader, AnimatedStats, ClientLayout, ContactCTA, Footer, Header, HomePage, type HomePageProps, ProsophiaConfig, ScrollRevealSection, SiteSettings$3 as SiteSettings, StaggeredGrid, ThemeToggle, cardHover, client, defineConfig, escapeHtml, fadeIn, fadeInUp, fadeInUpShort, getClient, imageZoom, isValidEmail, isValidExternalUrl, isValidGoogleMapsEmbedUrl, isValidSlug, pageTransition, reducedMotion, sanitizeUrl, scaleIn, scrollReveal, slideInLeft, slideInRight, staggerContainer, staggerItem, urlFor, viewportSettings };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import React$1, { ReactNode } from 'react';
|
|
3
|
+
import { S as SiteSettings$3, P as ProsophiaConfig } from './index-CSdV51Jq.js';
|
|
4
|
+
export { a as SiteConfig, T as ThemeConfig } from './index-CSdV51Jq.js';
|
|
5
|
+
import * as _sanity_image_url_lib_types_builder from '@sanity/image-url/lib/types/builder';
|
|
6
|
+
import * as next_sanity from 'next-sanity';
|
|
7
|
+
import { SanityClient } from 'next-sanity';
|
|
8
|
+
import { SanityImageSource } from '@sanity/image-url/lib/types/types';
|
|
9
|
+
import { Variants } from 'framer-motion';
|
|
10
|
+
|
|
11
|
+
type AnimatedCardProps = {
|
|
12
|
+
children: ReactNode;
|
|
13
|
+
className?: string;
|
|
14
|
+
delay?: number;
|
|
15
|
+
};
|
|
16
|
+
declare function AnimatedCard({ children, className, delay }: AnimatedCardProps): react_jsx_runtime.JSX.Element;
|
|
17
|
+
type AnimatedImageProps = {
|
|
18
|
+
children: ReactNode;
|
|
19
|
+
className?: string;
|
|
20
|
+
};
|
|
21
|
+
declare function AnimatedImage({ children, className }: AnimatedImageProps): react_jsx_runtime.JSX.Element;
|
|
22
|
+
type AnimatedSectionProps = {
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
className?: string;
|
|
25
|
+
};
|
|
26
|
+
declare function AnimatedSection({ children, className }: AnimatedSectionProps): react_jsx_runtime.JSX.Element;
|
|
27
|
+
|
|
28
|
+
type AnimatedGalleryHeaderProps = {
|
|
29
|
+
children: ReactNode;
|
|
30
|
+
className?: string;
|
|
31
|
+
};
|
|
32
|
+
declare function AnimatedGalleryHeader({ children, className }: AnimatedGalleryHeaderProps): react_jsx_runtime.JSX.Element;
|
|
33
|
+
type GalleryImage = {
|
|
34
|
+
_id: string;
|
|
35
|
+
imageUrl: string;
|
|
36
|
+
altText: string;
|
|
37
|
+
caption?: string;
|
|
38
|
+
width: number;
|
|
39
|
+
height: number;
|
|
40
|
+
};
|
|
41
|
+
type AnimatedGalleryGridProps = {
|
|
42
|
+
images: GalleryImage[];
|
|
43
|
+
};
|
|
44
|
+
declare function AnimatedGalleryGrid({ images }: AnimatedGalleryGridProps): react_jsx_runtime.JSX.Element;
|
|
45
|
+
|
|
46
|
+
type AnimatedPageProps = {
|
|
47
|
+
children: ReactNode;
|
|
48
|
+
className?: string;
|
|
49
|
+
};
|
|
50
|
+
declare function AnimatedPage({ children, className }: AnimatedPageProps): react_jsx_runtime.JSX.Element;
|
|
51
|
+
type AnimatedHeaderProps = {
|
|
52
|
+
children: ReactNode;
|
|
53
|
+
className?: string;
|
|
54
|
+
};
|
|
55
|
+
declare function AnimatedHeader({ children, className }: AnimatedHeaderProps): react_jsx_runtime.JSX.Element;
|
|
56
|
+
type AnimatedMainProps = {
|
|
57
|
+
children: ReactNode;
|
|
58
|
+
className?: string;
|
|
59
|
+
};
|
|
60
|
+
declare function AnimatedMain({ children, className }: AnimatedMainProps): react_jsx_runtime.JSX.Element;
|
|
61
|
+
type StaggeredGridProps = {
|
|
62
|
+
children: ReactNode;
|
|
63
|
+
className?: string;
|
|
64
|
+
};
|
|
65
|
+
declare function StaggeredGrid({ children, className }: StaggeredGridProps): react_jsx_runtime.JSX.Element;
|
|
66
|
+
type AnimatedItemProps = {
|
|
67
|
+
children: ReactNode;
|
|
68
|
+
className?: string;
|
|
69
|
+
delay?: number;
|
|
70
|
+
index?: number;
|
|
71
|
+
};
|
|
72
|
+
declare function AnimatedItem({ children, className, delay, index }: AnimatedItemProps): react_jsx_runtime.JSX.Element;
|
|
73
|
+
type ScrollRevealSectionProps = {
|
|
74
|
+
children: ReactNode;
|
|
75
|
+
className?: string;
|
|
76
|
+
};
|
|
77
|
+
declare function ScrollRevealSection({ children, className }: ScrollRevealSectionProps): react_jsx_runtime.JSX.Element;
|
|
78
|
+
type AnimatedHeroContentProps = {
|
|
79
|
+
children: ReactNode;
|
|
80
|
+
className?: string;
|
|
81
|
+
};
|
|
82
|
+
declare function AnimatedHeroContent({ children, className }: AnimatedHeroContentProps): react_jsx_runtime.JSX.Element;
|
|
83
|
+
|
|
84
|
+
type AnimatedGridProps = {
|
|
85
|
+
children: ReactNode;
|
|
86
|
+
className?: string;
|
|
87
|
+
};
|
|
88
|
+
declare function AnimatedGrid({ children, className }: AnimatedGridProps): react_jsx_runtime.JSX.Element;
|
|
89
|
+
type AnimatedStatsProps = {
|
|
90
|
+
children: ReactNode;
|
|
91
|
+
className?: string;
|
|
92
|
+
};
|
|
93
|
+
declare function AnimatedStats({ children, className }: AnimatedStatsProps): react_jsx_runtime.JSX.Element;
|
|
94
|
+
type AnimatedSectionHeaderProps = {
|
|
95
|
+
children: ReactNode;
|
|
96
|
+
className?: string;
|
|
97
|
+
};
|
|
98
|
+
declare function AnimatedSectionHeader({ children, className }: AnimatedSectionHeaderProps): react_jsx_runtime.JSX.Element;
|
|
99
|
+
type AnimatedListProps = {
|
|
100
|
+
children: ReactNode;
|
|
101
|
+
className?: string;
|
|
102
|
+
};
|
|
103
|
+
declare function AnimatedList({ children, className }: AnimatedListProps): react_jsx_runtime.JSX.Element;
|
|
104
|
+
|
|
105
|
+
type AnimatedHeroProps = {
|
|
106
|
+
heroData: {
|
|
107
|
+
tagline: string;
|
|
108
|
+
heading: string;
|
|
109
|
+
headingAccent: string;
|
|
110
|
+
description: string;
|
|
111
|
+
ctaText: string;
|
|
112
|
+
ctaLink: string;
|
|
113
|
+
image: string | null;
|
|
114
|
+
};
|
|
115
|
+
ArrowRightIcon: React.ComponentType;
|
|
116
|
+
};
|
|
117
|
+
declare function AnimatedHero({ heroData, ArrowRightIcon }: AnimatedHeroProps): react_jsx_runtime.JSX.Element;
|
|
118
|
+
|
|
119
|
+
type SiteSettings$2 = {
|
|
120
|
+
labName?: string;
|
|
121
|
+
labNameAccent?: string;
|
|
122
|
+
footerText?: string;
|
|
123
|
+
showPrivacyPolicy?: boolean;
|
|
124
|
+
privacyPolicyUrl?: string;
|
|
125
|
+
showTerms?: boolean;
|
|
126
|
+
termsUrl?: string;
|
|
127
|
+
};
|
|
128
|
+
type ClientLayoutProps = {
|
|
129
|
+
children: React$1.ReactNode;
|
|
130
|
+
settings: SiteSettings$2;
|
|
131
|
+
};
|
|
132
|
+
declare function ClientLayout({ children, settings }: ClientLayoutProps): react_jsx_runtime.JSX.Element;
|
|
133
|
+
|
|
134
|
+
declare function ContactCTA(): react_jsx_runtime.JSX.Element;
|
|
135
|
+
|
|
136
|
+
type SiteSettings$1 = {
|
|
137
|
+
labName?: string;
|
|
138
|
+
labNameAccent?: string;
|
|
139
|
+
labNameDescription?: string;
|
|
140
|
+
footerText?: string;
|
|
141
|
+
showPrivacyPolicy?: boolean;
|
|
142
|
+
privacyPolicyUrl?: string;
|
|
143
|
+
showTerms?: boolean;
|
|
144
|
+
termsUrl?: string;
|
|
145
|
+
};
|
|
146
|
+
declare function Footer({ settings }: {
|
|
147
|
+
settings: SiteSettings$1;
|
|
148
|
+
}): react_jsx_runtime.JSX.Element;
|
|
149
|
+
|
|
150
|
+
type SiteSettings = {
|
|
151
|
+
labName?: string;
|
|
152
|
+
labNameAccent?: string;
|
|
153
|
+
};
|
|
154
|
+
declare function Header({ settings }: {
|
|
155
|
+
settings: SiteSettings;
|
|
156
|
+
}): react_jsx_runtime.JSX.Element;
|
|
157
|
+
|
|
158
|
+
declare function ThemeToggle(): react_jsx_runtime.JSX.Element;
|
|
159
|
+
|
|
160
|
+
interface HomePageProps {
|
|
161
|
+
children?: React.ReactNode;
|
|
162
|
+
settings?: SiteSettings$3 | null;
|
|
163
|
+
header?: React.ReactNode;
|
|
164
|
+
footer?: React.ReactNode;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Main HomePage wrapper for lab-classic template
|
|
168
|
+
* Provides consistent header/footer with customizable main content
|
|
169
|
+
*/
|
|
170
|
+
declare function HomePage({ children, settings, header, footer, }: HomePageProps): react_jsx_runtime.JSX.Element;
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Define configuration for your lab website
|
|
174
|
+
* @param config - The site configuration object
|
|
175
|
+
* @returns The configuration object (passthrough for type safety)
|
|
176
|
+
*/
|
|
177
|
+
declare function defineConfig(config: ProsophiaConfig): ProsophiaConfig;
|
|
178
|
+
|
|
179
|
+
declare function getClient(): SanityClient;
|
|
180
|
+
declare const client: {
|
|
181
|
+
readonly projectId: string | undefined;
|
|
182
|
+
readonly dataset: string;
|
|
183
|
+
fetch: (query: string, params: next_sanity.QueryWithoutParams | next_sanity.QueryParams, options: next_sanity.UnfilteredResponseWithoutQuery) => Promise<next_sanity.RawQuerylessQueryResponse<any>>;
|
|
184
|
+
};
|
|
185
|
+
declare function urlFor(source: SanityImageSource): _sanity_image_url_lib_types_builder.ImageUrlBuilder | {
|
|
186
|
+
width: () => {
|
|
187
|
+
height: () => {
|
|
188
|
+
url: () => string;
|
|
189
|
+
};
|
|
190
|
+
url: () => string;
|
|
191
|
+
};
|
|
192
|
+
height: () => {
|
|
193
|
+
width: () => {
|
|
194
|
+
url: () => string;
|
|
195
|
+
};
|
|
196
|
+
url: () => string;
|
|
197
|
+
};
|
|
198
|
+
url: () => string;
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Shared Framer Motion Animation Variants and Utilities
|
|
203
|
+
* Inspired by verdant-website's smooth animations
|
|
204
|
+
*/
|
|
205
|
+
|
|
206
|
+
declare const fadeIn: Variants;
|
|
207
|
+
declare const fadeInUp: Variants;
|
|
208
|
+
declare const fadeInUpShort: Variants;
|
|
209
|
+
declare const scaleIn: Variants;
|
|
210
|
+
declare const slideInRight: Variants;
|
|
211
|
+
declare const slideInLeft: Variants;
|
|
212
|
+
declare const staggerContainer: Variants;
|
|
213
|
+
declare const staggerItem: Variants;
|
|
214
|
+
declare const cardHover: Variants;
|
|
215
|
+
declare const imageZoom: Variants;
|
|
216
|
+
declare const pageTransition: Variants;
|
|
217
|
+
declare const viewportSettings: {
|
|
218
|
+
once: boolean;
|
|
219
|
+
amount: number;
|
|
220
|
+
margin: string;
|
|
221
|
+
};
|
|
222
|
+
declare const scrollReveal: {
|
|
223
|
+
hidden: {
|
|
224
|
+
opacity: number;
|
|
225
|
+
y: number;
|
|
226
|
+
};
|
|
227
|
+
visible: {
|
|
228
|
+
opacity: number;
|
|
229
|
+
y: number;
|
|
230
|
+
transition: {
|
|
231
|
+
duration: number;
|
|
232
|
+
ease: number[];
|
|
233
|
+
};
|
|
234
|
+
};
|
|
235
|
+
};
|
|
236
|
+
declare const reducedMotion: {
|
|
237
|
+
hidden: {
|
|
238
|
+
opacity: number;
|
|
239
|
+
};
|
|
240
|
+
visible: {
|
|
241
|
+
opacity: number;
|
|
242
|
+
transition: {
|
|
243
|
+
duration: number;
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
/**
|
|
249
|
+
* Security Utilities for URL and Input Validation
|
|
250
|
+
*/
|
|
251
|
+
/**
|
|
252
|
+
* Validates that a URL is safe to use as an external link.
|
|
253
|
+
* Prevents javascript: URLs, data: URLs, and other potentially malicious schemes.
|
|
254
|
+
*/
|
|
255
|
+
declare function isValidExternalUrl(url: string | undefined | null): boolean;
|
|
256
|
+
/**
|
|
257
|
+
* Validates that a URL is a valid Google Maps embed URL.
|
|
258
|
+
* Only allows URLs from Google's embed domains.
|
|
259
|
+
*/
|
|
260
|
+
declare function isValidGoogleMapsEmbedUrl(url: string | undefined | null): boolean;
|
|
261
|
+
/**
|
|
262
|
+
* Sanitizes a URL for safe use in links.
|
|
263
|
+
* Returns undefined if the URL is invalid.
|
|
264
|
+
*/
|
|
265
|
+
declare function sanitizeUrl(url: string | undefined | null): string | undefined;
|
|
266
|
+
/**
|
|
267
|
+
* Validates an email address format.
|
|
268
|
+
*/
|
|
269
|
+
declare function isValidEmail(email: string | undefined | null): boolean;
|
|
270
|
+
/**
|
|
271
|
+
* Escapes HTML special characters to prevent XSS.
|
|
272
|
+
*/
|
|
273
|
+
declare function escapeHtml(text: string): string;
|
|
274
|
+
/**
|
|
275
|
+
* Validates a slug format (lowercase alphanumeric with hyphens).
|
|
276
|
+
*/
|
|
277
|
+
declare function isValidSlug(slug: string | undefined | null): boolean;
|
|
278
|
+
|
|
279
|
+
export { AnimatedCard, AnimatedGalleryGrid, AnimatedGalleryHeader, AnimatedGrid, AnimatedHeader, AnimatedHero, AnimatedHeroContent, AnimatedImage, AnimatedItem, AnimatedList, AnimatedMain, AnimatedPage, AnimatedSection, AnimatedSectionHeader, AnimatedStats, ClientLayout, ContactCTA, Footer, Header, HomePage, type HomePageProps, ProsophiaConfig, ScrollRevealSection, SiteSettings$3 as SiteSettings, StaggeredGrid, ThemeToggle, cardHover, client, defineConfig, escapeHtml, fadeIn, fadeInUp, fadeInUpShort, getClient, imageZoom, isValidEmail, isValidExternalUrl, isValidGoogleMapsEmbedUrl, isValidSlug, pageTransition, reducedMotion, sanitizeUrl, scaleIn, scrollReveal, slideInLeft, slideInRight, staggerContainer, staggerItem, urlFor, viewportSettings };
|