@zoyth/simple-site-framework 1.1.0 → 1.1.1
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/components/index.d.mts +38 -1
- package/dist/components/index.d.ts +38 -1
- package/dist/components/index.js +290 -59
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +289 -59
- package/dist/components/index.mjs.map +1 -1
- package/docs/api/README.md +26 -3
- package/docs/components/BlogIndex.md +229 -0
- package/docs/components/BlogLayout.md +222 -0
- package/docs/components/NewsletterSignup.md +275 -0
- package/docs/components/accessibility/SkipLink.md +146 -0
- package/package.json +1 -1
|
@@ -4006,4 +4006,41 @@ interface BlogIndexProps {
|
|
|
4006
4006
|
}
|
|
4007
4007
|
declare function BlogIndex({ locale, posts, title, description, showTagFilter, cardVariant, featuredFirst, className, }: BlogIndexProps): react_jsx_runtime.JSX.Element;
|
|
4008
4008
|
|
|
4009
|
-
|
|
4009
|
+
interface NewsletterSubmitData {
|
|
4010
|
+
email: string;
|
|
4011
|
+
name?: string;
|
|
4012
|
+
}
|
|
4013
|
+
interface NewsletterResponse {
|
|
4014
|
+
success: boolean;
|
|
4015
|
+
message?: string;
|
|
4016
|
+
error?: string;
|
|
4017
|
+
}
|
|
4018
|
+
interface NewsletterSignupProps {
|
|
4019
|
+
/** Form submission handler */
|
|
4020
|
+
onSubmit: (data: NewsletterSubmitData) => Promise<NewsletterResponse>;
|
|
4021
|
+
/** Layout variant @default 'stacked' */
|
|
4022
|
+
variant?: 'inline' | 'stacked' | 'minimal' | 'card';
|
|
4023
|
+
/** Size @default 'md' */
|
|
4024
|
+
size?: 'sm' | 'md' | 'lg';
|
|
4025
|
+
/** Show name field @default false */
|
|
4026
|
+
showName?: boolean;
|
|
4027
|
+
/** Show privacy checkbox @default false */
|
|
4028
|
+
showPrivacy?: boolean;
|
|
4029
|
+
/** Privacy policy URL */
|
|
4030
|
+
privacyUrl?: string;
|
|
4031
|
+
/** Current locale @default 'en' */
|
|
4032
|
+
locale?: string;
|
|
4033
|
+
/** Custom button text */
|
|
4034
|
+
buttonText?: LocalizedString$2 | string;
|
|
4035
|
+
/** Custom placeholder for email */
|
|
4036
|
+
emailPlaceholder?: LocalizedString$2 | string;
|
|
4037
|
+
/** Custom placeholder for name */
|
|
4038
|
+
namePlaceholder?: LocalizedString$2 | string;
|
|
4039
|
+
/** Custom success message */
|
|
4040
|
+
successMessage?: LocalizedString$2 | string;
|
|
4041
|
+
/** Additional CSS classes */
|
|
4042
|
+
className?: string;
|
|
4043
|
+
}
|
|
4044
|
+
declare function NewsletterSignup({ onSubmit, variant, size, showName, showPrivacy, privacyUrl, locale, buttonText, emailPlaceholder, namePlaceholder, successMessage, className, }: NewsletterSignupProps): react_jsx_runtime.JSX.Element;
|
|
4045
|
+
|
|
4046
|
+
export { AboutSection, AddressLink, type AddressLinkProps, AnimatedCounter, type AnimatedCounterProps, AnimatedItem, AnimatedSection, type AnimatedSectionProps, type AnimationType, type Badge, type BadgeType, type BillingPeriod, BlogCard, type BlogCardProps, BlogIndex, type BlogIndexProps, BlogLayout, type BlogLayoutProps, BodyEndScripts, type BodyEndScriptsProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, type CTAButtonConfig, CTASection, type CTASectionProps, Card, type CardProps, CaseStudySection, Checkbox, CheckboxGroup, CheckboxGroupARIA, type CheckboxGroupARIAOption, type CheckboxGroupARIAProps, type CheckboxGroupOption, type CheckboxGroupProps, type CheckboxProps, CodeBlock, type CodeBlockProps, type ComparisonFeature, type ComparisonOption, ComparisonTable, type ComparisonTableProps, ComponentDemo, type ComponentDemoProps, ContactForm, type ContactFormData, type ContactFormField, type ContactFormProps, type ContactFormResponse, ContactSection, CountdownTimer, type CountdownTimerProps, type CustomBadge, EmailLink, type EmailLinkProps, ExitIntentModal, type ExitIntentModalProps, type FAQ, FAQAccordion, type FAQAccordionProps, type Feature, type FeatureCategory, FeatureSection, FeaturesGrid, FileUpload, type FileUploadProps, Footer, type FooterProps, FormField, FormFieldARIA, type FormFieldARIAProps, type FormFieldProps, FormGroup, HeadScripts, type HeadScriptsProps, Header, type HeaderProps, type Heading, HeroSection, I18nMetaTags, type I18nMetaTagsProps, Icon, type IconName, type IconProps, Icons, InlineCode, Input, type InputProps, LanguageSelector, type LanguageSelectorProps, LanguageSwitcher, type LanguageSwitcherProps, LazySection, type LazySectionProps, LiveProof, type LiveProofNotification, type LiveProofProps, LoadingOverlay, type LoadingOverlayProps, LoadingSpinner, type LoadingSpinnerProps, LogosSection, MobileCTA, type MobileCTAProps, Modal, ModalContent, ModalFooter, type ModalProps, ModalRoot, type ModalSize, ModalTrigger, MultiStepForm, type MultiStepFormProps, type NewsletterResponse, NewsletterSignup, type NewsletterSignupProps, type NewsletterSubmitData, type NotificationPosition, type OpenGraphMetadata, PersonalTaxesSection, PhoneLink, type PhoneLinkProps, PolicyLayout, type PolicyLayoutProps, type PricingFeature, PricingTable, type PricingTableProps, type PricingTier, Radio, RadioGroup, RadioGroupARIA, type RadioGroupARIAOption, type RadioGroupARIAProps, type RadioGroupOption, type RadioGroupProps, type RadioProps, RecruitingSection, SEOMetaTags, type SEOMetaTagsProps, SecurePortalSection, Select, type SelectOption, type SelectOptionGroup, type SelectProps, ServicePageLayout, ServicesSection, Skeleton, type SkeletonAnimation, SkeletonAvatar, SkeletonButton, SkeletonCard, SkeletonImage, type SkeletonProps, SkeletonText, type SpinnerSize, type SpinnerStyle, type Stat, StatsSection, type StatsSectionProps, type StepProps, StickyBar, type StickyBarProps, StructuredData, type StructuredDataProps, StyleGuide, type StyleGuideProps, type Tab, TableOfContents, type TableOfContentsProps, Tabs, type TabsProps, type Testimonial, TestimonialCarousel, type TestimonialCarouselProps, TestimonialSection, Textarea, type TextareaProps, Timeline, type TimelineItem, type TimelineProps, type Toast, type ToastPosition, ToastProvider, type ToastProviderProps, type ToastType, TrustBadges, type TrustBadgesProps, type TwitterMetadata, WhyChooseUsSection, generateMockNotifications, toast, useMultiStepForm, useToast, withLazyLoad };
|
|
@@ -4006,4 +4006,41 @@ interface BlogIndexProps {
|
|
|
4006
4006
|
}
|
|
4007
4007
|
declare function BlogIndex({ locale, posts, title, description, showTagFilter, cardVariant, featuredFirst, className, }: BlogIndexProps): react_jsx_runtime.JSX.Element;
|
|
4008
4008
|
|
|
4009
|
-
|
|
4009
|
+
interface NewsletterSubmitData {
|
|
4010
|
+
email: string;
|
|
4011
|
+
name?: string;
|
|
4012
|
+
}
|
|
4013
|
+
interface NewsletterResponse {
|
|
4014
|
+
success: boolean;
|
|
4015
|
+
message?: string;
|
|
4016
|
+
error?: string;
|
|
4017
|
+
}
|
|
4018
|
+
interface NewsletterSignupProps {
|
|
4019
|
+
/** Form submission handler */
|
|
4020
|
+
onSubmit: (data: NewsletterSubmitData) => Promise<NewsletterResponse>;
|
|
4021
|
+
/** Layout variant @default 'stacked' */
|
|
4022
|
+
variant?: 'inline' | 'stacked' | 'minimal' | 'card';
|
|
4023
|
+
/** Size @default 'md' */
|
|
4024
|
+
size?: 'sm' | 'md' | 'lg';
|
|
4025
|
+
/** Show name field @default false */
|
|
4026
|
+
showName?: boolean;
|
|
4027
|
+
/** Show privacy checkbox @default false */
|
|
4028
|
+
showPrivacy?: boolean;
|
|
4029
|
+
/** Privacy policy URL */
|
|
4030
|
+
privacyUrl?: string;
|
|
4031
|
+
/** Current locale @default 'en' */
|
|
4032
|
+
locale?: string;
|
|
4033
|
+
/** Custom button text */
|
|
4034
|
+
buttonText?: LocalizedString$2 | string;
|
|
4035
|
+
/** Custom placeholder for email */
|
|
4036
|
+
emailPlaceholder?: LocalizedString$2 | string;
|
|
4037
|
+
/** Custom placeholder for name */
|
|
4038
|
+
namePlaceholder?: LocalizedString$2 | string;
|
|
4039
|
+
/** Custom success message */
|
|
4040
|
+
successMessage?: LocalizedString$2 | string;
|
|
4041
|
+
/** Additional CSS classes */
|
|
4042
|
+
className?: string;
|
|
4043
|
+
}
|
|
4044
|
+
declare function NewsletterSignup({ onSubmit, variant, size, showName, showPrivacy, privacyUrl, locale, buttonText, emailPlaceholder, namePlaceholder, successMessage, className, }: NewsletterSignupProps): react_jsx_runtime.JSX.Element;
|
|
4045
|
+
|
|
4046
|
+
export { AboutSection, AddressLink, type AddressLinkProps, AnimatedCounter, type AnimatedCounterProps, AnimatedItem, AnimatedSection, type AnimatedSectionProps, type AnimationType, type Badge, type BadgeType, type BillingPeriod, BlogCard, type BlogCardProps, BlogIndex, type BlogIndexProps, BlogLayout, type BlogLayoutProps, BodyEndScripts, type BodyEndScriptsProps, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, type CTAButtonConfig, CTASection, type CTASectionProps, Card, type CardProps, CaseStudySection, Checkbox, CheckboxGroup, CheckboxGroupARIA, type CheckboxGroupARIAOption, type CheckboxGroupARIAProps, type CheckboxGroupOption, type CheckboxGroupProps, type CheckboxProps, CodeBlock, type CodeBlockProps, type ComparisonFeature, type ComparisonOption, ComparisonTable, type ComparisonTableProps, ComponentDemo, type ComponentDemoProps, ContactForm, type ContactFormData, type ContactFormField, type ContactFormProps, type ContactFormResponse, ContactSection, CountdownTimer, type CountdownTimerProps, type CustomBadge, EmailLink, type EmailLinkProps, ExitIntentModal, type ExitIntentModalProps, type FAQ, FAQAccordion, type FAQAccordionProps, type Feature, type FeatureCategory, FeatureSection, FeaturesGrid, FileUpload, type FileUploadProps, Footer, type FooterProps, FormField, FormFieldARIA, type FormFieldARIAProps, type FormFieldProps, FormGroup, HeadScripts, type HeadScriptsProps, Header, type HeaderProps, type Heading, HeroSection, I18nMetaTags, type I18nMetaTagsProps, Icon, type IconName, type IconProps, Icons, InlineCode, Input, type InputProps, LanguageSelector, type LanguageSelectorProps, LanguageSwitcher, type LanguageSwitcherProps, LazySection, type LazySectionProps, LiveProof, type LiveProofNotification, type LiveProofProps, LoadingOverlay, type LoadingOverlayProps, LoadingSpinner, type LoadingSpinnerProps, LogosSection, MobileCTA, type MobileCTAProps, Modal, ModalContent, ModalFooter, type ModalProps, ModalRoot, type ModalSize, ModalTrigger, MultiStepForm, type MultiStepFormProps, type NewsletterResponse, NewsletterSignup, type NewsletterSignupProps, type NewsletterSubmitData, type NotificationPosition, type OpenGraphMetadata, PersonalTaxesSection, PhoneLink, type PhoneLinkProps, PolicyLayout, type PolicyLayoutProps, type PricingFeature, PricingTable, type PricingTableProps, type PricingTier, Radio, RadioGroup, RadioGroupARIA, type RadioGroupARIAOption, type RadioGroupARIAProps, type RadioGroupOption, type RadioGroupProps, type RadioProps, RecruitingSection, SEOMetaTags, type SEOMetaTagsProps, SecurePortalSection, Select, type SelectOption, type SelectOptionGroup, type SelectProps, ServicePageLayout, ServicesSection, Skeleton, type SkeletonAnimation, SkeletonAvatar, SkeletonButton, SkeletonCard, SkeletonImage, type SkeletonProps, SkeletonText, type SpinnerSize, type SpinnerStyle, type Stat, StatsSection, type StatsSectionProps, type StepProps, StickyBar, type StickyBarProps, StructuredData, type StructuredDataProps, StyleGuide, type StyleGuideProps, type Tab, TableOfContents, type TableOfContentsProps, Tabs, type TabsProps, type Testimonial, TestimonialCarousel, type TestimonialCarouselProps, TestimonialSection, Textarea, type TextareaProps, Timeline, type TimelineItem, type TimelineProps, type Toast, type ToastPosition, ToastProvider, type ToastProviderProps, type ToastType, TrustBadges, type TrustBadgesProps, type TwitterMetadata, WhyChooseUsSection, generateMockNotifications, toast, useMultiStepForm, useToast, withLazyLoad };
|
package/dist/components/index.js
CHANGED
|
@@ -40,12 +40,12 @@ var require_objectWithoutPropertiesLoose = __commonJS({
|
|
|
40
40
|
"use strict";
|
|
41
41
|
function _objectWithoutPropertiesLoose(r2, e) {
|
|
42
42
|
if (null == r2) return {};
|
|
43
|
-
var
|
|
43
|
+
var t2 = {};
|
|
44
44
|
for (var n in r2) if ({}.hasOwnProperty.call(r2, n)) {
|
|
45
45
|
if (-1 !== e.indexOf(n)) continue;
|
|
46
|
-
|
|
46
|
+
t2[n] = r2[n];
|
|
47
47
|
}
|
|
48
|
-
return
|
|
48
|
+
return t2;
|
|
49
49
|
}
|
|
50
50
|
module2.exports = _objectWithoutPropertiesLoose, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
|
|
51
51
|
}
|
|
@@ -56,12 +56,12 @@ var require_objectWithoutProperties = __commonJS({
|
|
|
56
56
|
"node_modules/@babel/runtime/helpers/objectWithoutProperties.js"(exports2, module2) {
|
|
57
57
|
"use strict";
|
|
58
58
|
var objectWithoutPropertiesLoose = require_objectWithoutPropertiesLoose();
|
|
59
|
-
function _objectWithoutProperties2(e,
|
|
59
|
+
function _objectWithoutProperties2(e, t2) {
|
|
60
60
|
if (null == e) return {};
|
|
61
|
-
var o, r2, i = objectWithoutPropertiesLoose(e,
|
|
61
|
+
var o, r2, i = objectWithoutPropertiesLoose(e, t2);
|
|
62
62
|
if (Object.getOwnPropertySymbols) {
|
|
63
63
|
var n = Object.getOwnPropertySymbols(e);
|
|
64
|
-
for (r2 = 0; r2 < n.length; r2++) o = n[r2], -1 ===
|
|
64
|
+
for (r2 = 0; r2 < n.length; r2++) o = n[r2], -1 === t2.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
|
|
65
65
|
}
|
|
66
66
|
return i;
|
|
67
67
|
}
|
|
@@ -113,8 +113,8 @@ var require_unsupportedIterableToArray = __commonJS({
|
|
|
113
113
|
function _unsupportedIterableToArray(r2, a) {
|
|
114
114
|
if (r2) {
|
|
115
115
|
if ("string" == typeof r2) return arrayLikeToArray(r2, a);
|
|
116
|
-
var
|
|
117
|
-
return "Object" ===
|
|
116
|
+
var t2 = {}.toString.call(r2).slice(8, -1);
|
|
117
|
+
return "Object" === t2 && r2.constructor && (t2 = r2.constructor.name), "Map" === t2 || "Set" === t2 ? Array.from(r2) : "Arguments" === t2 || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t2) ? arrayLikeToArray(r2, a) : void 0;
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
module2.exports = _unsupportedIterableToArray, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
|
|
@@ -168,15 +168,15 @@ var require_toPrimitive = __commonJS({
|
|
|
168
168
|
"node_modules/@babel/runtime/helpers/toPrimitive.js"(exports2, module2) {
|
|
169
169
|
"use strict";
|
|
170
170
|
var _typeof = require_typeof()["default"];
|
|
171
|
-
function toPrimitive(
|
|
172
|
-
if ("object" != _typeof(
|
|
173
|
-
var e =
|
|
171
|
+
function toPrimitive(t2, r2) {
|
|
172
|
+
if ("object" != _typeof(t2) || !t2) return t2;
|
|
173
|
+
var e = t2[Symbol.toPrimitive];
|
|
174
174
|
if (void 0 !== e) {
|
|
175
|
-
var i = e.call(
|
|
175
|
+
var i = e.call(t2, r2 || "default");
|
|
176
176
|
if ("object" != _typeof(i)) return i;
|
|
177
177
|
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
178
178
|
}
|
|
179
|
-
return ("string" === r2 ? String : Number)(
|
|
179
|
+
return ("string" === r2 ? String : Number)(t2);
|
|
180
180
|
}
|
|
181
181
|
module2.exports = toPrimitive, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
|
|
182
182
|
}
|
|
@@ -188,8 +188,8 @@ var require_toPropertyKey = __commonJS({
|
|
|
188
188
|
"use strict";
|
|
189
189
|
var _typeof = require_typeof()["default"];
|
|
190
190
|
var toPrimitive = require_toPrimitive();
|
|
191
|
-
function toPropertyKey(
|
|
192
|
-
var i = toPrimitive(
|
|
191
|
+
function toPropertyKey(t2) {
|
|
192
|
+
var i = toPrimitive(t2, "string");
|
|
193
193
|
return "symbol" == _typeof(i) ? i : i + "";
|
|
194
194
|
}
|
|
195
195
|
module2.exports = toPropertyKey, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
|
|
@@ -201,13 +201,13 @@ var require_defineProperty = __commonJS({
|
|
|
201
201
|
"node_modules/@babel/runtime/helpers/defineProperty.js"(exports2, module2) {
|
|
202
202
|
"use strict";
|
|
203
203
|
var toPropertyKey = require_toPropertyKey();
|
|
204
|
-
function _defineProperty3(e, r2,
|
|
204
|
+
function _defineProperty3(e, r2, t2) {
|
|
205
205
|
return (r2 = toPropertyKey(r2)) in e ? Object.defineProperty(e, r2, {
|
|
206
|
-
value:
|
|
206
|
+
value: t2,
|
|
207
207
|
enumerable: true,
|
|
208
208
|
configurable: true,
|
|
209
209
|
writable: true
|
|
210
|
-
}) : e[r2] =
|
|
210
|
+
}) : e[r2] = t2, e;
|
|
211
211
|
}
|
|
212
212
|
module2.exports = _defineProperty3, module2.exports.__esModule = true, module2.exports["default"] = module2.exports;
|
|
213
213
|
}
|
|
@@ -220,8 +220,8 @@ var require_extends = __commonJS({
|
|
|
220
220
|
function _extends2() {
|
|
221
221
|
return module2.exports = _extends2 = Object.assign ? Object.assign.bind() : function(n) {
|
|
222
222
|
for (var e = 1; e < arguments.length; e++) {
|
|
223
|
-
var
|
|
224
|
-
for (var r2 in
|
|
223
|
+
var t2 = arguments[e];
|
|
224
|
+
for (var r2 in t2) ({}).hasOwnProperty.call(t2, r2) && (n[r2] = t2[r2]);
|
|
225
225
|
}
|
|
226
226
|
return n;
|
|
227
227
|
}, module2.exports.__esModule = true, module2.exports["default"] = module2.exports, _extends2.apply(null, arguments);
|
|
@@ -11161,7 +11161,7 @@ function markupTemplating(Prism2) {
|
|
|
11161
11161
|
var token = tokens[i];
|
|
11162
11162
|
if (typeof token === "string" || token.content && typeof token.content === "string") {
|
|
11163
11163
|
var k = keys[j2];
|
|
11164
|
-
var
|
|
11164
|
+
var t2 = env.tokenStack[k];
|
|
11165
11165
|
var s2 = typeof token === "string" ? token : token.content;
|
|
11166
11166
|
var placeholder = getPlaceholder(language, k);
|
|
11167
11167
|
var index = s2.indexOf(placeholder);
|
|
@@ -11170,9 +11170,9 @@ function markupTemplating(Prism2) {
|
|
|
11170
11170
|
var before = s2.substring(0, index);
|
|
11171
11171
|
var middle = new Prism3.Token(
|
|
11172
11172
|
language,
|
|
11173
|
-
Prism3.tokenize(
|
|
11173
|
+
Prism3.tokenize(t2, env.grammar),
|
|
11174
11174
|
"language-" + language,
|
|
11175
|
-
|
|
11175
|
+
t2
|
|
11176
11176
|
);
|
|
11177
11177
|
var after = s2.substring(index + placeholder.length);
|
|
11178
11178
|
var replacement = [];
|
|
@@ -14172,10 +14172,10 @@ function graphql(Prism2) {
|
|
|
14172
14172
|
continue;
|
|
14173
14173
|
}
|
|
14174
14174
|
for (; currentIndex < definitionEnd; currentIndex++) {
|
|
14175
|
-
var
|
|
14176
|
-
if (
|
|
14177
|
-
addAlias(
|
|
14178
|
-
inputVariables.push(
|
|
14175
|
+
var t2 = getToken(0);
|
|
14176
|
+
if (t2.type === "variable") {
|
|
14177
|
+
addAlias(t2, "variable-input");
|
|
14178
|
+
inputVariables.push(t2.content);
|
|
14179
14179
|
}
|
|
14180
14180
|
}
|
|
14181
14181
|
currentIndex = definitionEnd + 1;
|
|
@@ -28861,6 +28861,7 @@ __export(components_exports, {
|
|
|
28861
28861
|
ModalRoot: () => ModalRoot,
|
|
28862
28862
|
ModalTrigger: () => ModalTrigger,
|
|
28863
28863
|
MultiStepForm: () => MultiStepForm,
|
|
28864
|
+
NewsletterSignup: () => NewsletterSignup,
|
|
28864
28865
|
PersonalTaxesSection: () => PersonalTaxesSection,
|
|
28865
28866
|
PhoneLink: () => PhoneLink,
|
|
28866
28867
|
PolicyLayout: () => PolicyLayout,
|
|
@@ -31245,7 +31246,7 @@ function FileUpload({
|
|
|
31245
31246
|
break;
|
|
31246
31247
|
}
|
|
31247
31248
|
if (accept) {
|
|
31248
|
-
const acceptedTypes = accept.split(",").map((
|
|
31249
|
+
const acceptedTypes = accept.split(",").map((t2) => t2.trim());
|
|
31249
31250
|
const isAccepted = acceptedTypes.some((type) => {
|
|
31250
31251
|
if (type.startsWith(".")) {
|
|
31251
31252
|
return file.name.toLowerCase().endsWith(type.toLowerCase());
|
|
@@ -32489,22 +32490,22 @@ var import_extends = __toESM(require_extends());
|
|
|
32489
32490
|
var import_defineProperty = __toESM(require_defineProperty());
|
|
32490
32491
|
var import_react18 = __toESM(require("react"));
|
|
32491
32492
|
function ownKeys(e, r2) {
|
|
32492
|
-
var
|
|
32493
|
+
var t2 = Object.keys(e);
|
|
32493
32494
|
if (Object.getOwnPropertySymbols) {
|
|
32494
32495
|
var o = Object.getOwnPropertySymbols(e);
|
|
32495
32496
|
r2 && (o = o.filter(function(r3) {
|
|
32496
32497
|
return Object.getOwnPropertyDescriptor(e, r3).enumerable;
|
|
32497
|
-
})),
|
|
32498
|
+
})), t2.push.apply(t2, o);
|
|
32498
32499
|
}
|
|
32499
|
-
return
|
|
32500
|
+
return t2;
|
|
32500
32501
|
}
|
|
32501
32502
|
function _objectSpread(e) {
|
|
32502
32503
|
for (var r2 = 1; r2 < arguments.length; r2++) {
|
|
32503
|
-
var
|
|
32504
|
-
r2 % 2 ? ownKeys(Object(
|
|
32505
|
-
(0, import_defineProperty.default)(e, r3,
|
|
32506
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(
|
|
32507
|
-
Object.defineProperty(e, r3, Object.getOwnPropertyDescriptor(
|
|
32504
|
+
var t2 = null != arguments[r2] ? arguments[r2] : {};
|
|
32505
|
+
r2 % 2 ? ownKeys(Object(t2), true).forEach(function(r3) {
|
|
32506
|
+
(0, import_defineProperty.default)(e, r3, t2[r3]);
|
|
32507
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t2)) : ownKeys(Object(t2)).forEach(function(r3) {
|
|
32508
|
+
Object.defineProperty(e, r3, Object.getOwnPropertyDescriptor(t2, r3));
|
|
32508
32509
|
});
|
|
32509
32510
|
}
|
|
32510
32511
|
return e;
|
|
@@ -32603,22 +32604,22 @@ var checkForListedLanguage_default = (function(astGenerator, language) {
|
|
|
32603
32604
|
// node_modules/react-syntax-highlighter/dist/esm/highlight.js
|
|
32604
32605
|
var _excluded = ["language", "children", "style", "customStyle", "codeTagProps", "useInlineStyles", "showLineNumbers", "showInlineLineNumbers", "startingLineNumber", "lineNumberContainerStyle", "lineNumberStyle", "wrapLines", "wrapLongLines", "lineProps", "renderer", "PreTag", "CodeTag", "code", "astGenerator"];
|
|
32605
32606
|
function ownKeys2(e, r2) {
|
|
32606
|
-
var
|
|
32607
|
+
var t2 = Object.keys(e);
|
|
32607
32608
|
if (Object.getOwnPropertySymbols) {
|
|
32608
32609
|
var o = Object.getOwnPropertySymbols(e);
|
|
32609
32610
|
r2 && (o = o.filter(function(r3) {
|
|
32610
32611
|
return Object.getOwnPropertyDescriptor(e, r3).enumerable;
|
|
32611
|
-
})),
|
|
32612
|
+
})), t2.push.apply(t2, o);
|
|
32612
32613
|
}
|
|
32613
|
-
return
|
|
32614
|
+
return t2;
|
|
32614
32615
|
}
|
|
32615
32616
|
function _objectSpread2(e) {
|
|
32616
32617
|
for (var r2 = 1; r2 < arguments.length; r2++) {
|
|
32617
|
-
var
|
|
32618
|
-
r2 % 2 ? ownKeys2(Object(
|
|
32619
|
-
(0, import_defineProperty2.default)(e, r3,
|
|
32620
|
-
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(
|
|
32621
|
-
Object.defineProperty(e, r3, Object.getOwnPropertyDescriptor(
|
|
32618
|
+
var t2 = null != arguments[r2] ? arguments[r2] : {};
|
|
32619
|
+
r2 % 2 ? ownKeys2(Object(t2), true).forEach(function(r3) {
|
|
32620
|
+
(0, import_defineProperty2.default)(e, r3, t2[r3]);
|
|
32621
|
+
}) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t2)) : ownKeys2(Object(t2)).forEach(function(r3) {
|
|
32622
|
+
Object.defineProperty(e, r3, Object.getOwnPropertyDescriptor(t2, r3));
|
|
32622
32623
|
});
|
|
32623
32624
|
}
|
|
32624
32625
|
return e;
|
|
@@ -38337,6 +38338,8 @@ function BlogIndex({
|
|
|
38337
38338
|
className
|
|
38338
38339
|
}) {
|
|
38339
38340
|
const [activeTag, setActiveTag] = (0, import_react35.useState)(null);
|
|
38341
|
+
const [showAllTags, setShowAllTags] = (0, import_react35.useState)(false);
|
|
38342
|
+
const TAG_LIMIT = 8;
|
|
38340
38343
|
const resolvedTitle = title ? typeof title === "string" ? title : getLocalizedString(title, locale) : void 0;
|
|
38341
38344
|
const resolvedDescription = description ? typeof description === "string" ? description : getLocalizedString(description, locale) : void 0;
|
|
38342
38345
|
const allTags = (0, import_react35.useMemo)(() => {
|
|
@@ -38352,25 +38355,35 @@ function BlogIndex({
|
|
|
38352
38355
|
const featuredPosts = featuredFirst ? filteredPosts.filter((p) => p.metadata.featured) : [];
|
|
38353
38356
|
const regularPosts = featuredFirst ? filteredPosts.filter((p) => !p.metadata.featured) : filteredPosts;
|
|
38354
38357
|
const isFr = locale === "fr";
|
|
38355
|
-
return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: cn("max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-
|
|
38358
|
+
return /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: cn("max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12 sm:py-16", className), children: [
|
|
38356
38359
|
(resolvedTitle || resolvedDescription) && /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "mb-8 sm:mb-12", children: [
|
|
38357
38360
|
resolvedTitle && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("h1", { className: "text-3xl sm:text-4xl lg:text-5xl font-bold text-gray-900 mb-3", children: resolvedTitle }),
|
|
38358
38361
|
resolvedDescription && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("p", { className: "text-lg text-gray-600", children: resolvedDescription })
|
|
38359
38362
|
] }),
|
|
38360
|
-
showTagFilter && allTags.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.
|
|
38361
|
-
|
|
38362
|
-
|
|
38363
|
-
|
|
38364
|
-
|
|
38365
|
-
|
|
38366
|
-
|
|
38367
|
-
|
|
38368
|
-
|
|
38369
|
-
|
|
38370
|
-
|
|
38371
|
-
|
|
38363
|
+
showTagFilter && allTags.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsxs)("div", { className: "flex flex-wrap gap-2 mb-8", role: "group", "aria-label": isFr ? "Filtrer par tag" : "Filter by tag", children: [
|
|
38364
|
+
(showAllTags ? allTags : allTags.slice(0, TAG_LIMIT)).map((tag) => /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
38365
|
+
"button",
|
|
38366
|
+
{
|
|
38367
|
+
onClick: () => setActiveTag(activeTag === tag ? null : tag),
|
|
38368
|
+
className: cn(
|
|
38369
|
+
"px-3 py-1.5 text-sm font-medium rounded-full transition-colors",
|
|
38370
|
+
activeTag === tag ? "bg-primary text-white" : "bg-gray-100 text-gray-700 hover:bg-gray-200"
|
|
38371
|
+
),
|
|
38372
|
+
children: tag
|
|
38373
|
+
},
|
|
38374
|
+
tag
|
|
38375
|
+
)),
|
|
38376
|
+
allTags.length > TAG_LIMIT && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
38377
|
+
"button",
|
|
38378
|
+
{
|
|
38379
|
+
onClick: () => setShowAllTags(!showAllTags),
|
|
38380
|
+
className: "px-3 py-1.5 text-sm font-medium text-primary hover:underline",
|
|
38381
|
+
children: showAllTags ? isFr ? `Afficher moins` : `Show fewer` : isFr ? `Afficher tout (${allTags.length})` : `Show all (${allTags.length})`
|
|
38382
|
+
}
|
|
38383
|
+
)
|
|
38384
|
+
] }),
|
|
38372
38385
|
filteredPosts.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "text-center py-16", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("p", { className: "text-gray-500 text-lg", children: isFr ? "Aucun article trouv\xE9." : "No posts found." }) }),
|
|
38373
|
-
featuredPosts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "mb-12", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-
|
|
38386
|
+
featuredPosts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "mb-12", children: /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-8", children: featuredPosts.map((post) => /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
38374
38387
|
BlogCard,
|
|
38375
38388
|
{
|
|
38376
38389
|
locale,
|
|
@@ -38387,7 +38400,8 @@ function BlogIndex({
|
|
|
38387
38400
|
},
|
|
38388
38401
|
post.slug
|
|
38389
38402
|
)) }) }),
|
|
38390
|
-
regularPosts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("
|
|
38403
|
+
featuredPosts.length > 0 && regularPosts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("h2", { className: "text-2xl font-bold text-gray-900 mb-6", children: isFr ? "Tous les articles" : "All articles" }),
|
|
38404
|
+
regularPosts.length > 0 && /* @__PURE__ */ (0, import_jsx_runtime70.jsx)("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8", children: regularPosts.map((post) => /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
|
|
38391
38405
|
BlogCard,
|
|
38392
38406
|
{
|
|
38393
38407
|
locale,
|
|
@@ -38406,6 +38420,222 @@ function BlogIndex({
|
|
|
38406
38420
|
)) })
|
|
38407
38421
|
] });
|
|
38408
38422
|
}
|
|
38423
|
+
|
|
38424
|
+
// src/components/NewsletterSignup.tsx
|
|
38425
|
+
var import_react36 = require("react");
|
|
38426
|
+
var import_jsx_runtime71 = require("react/jsx-runtime");
|
|
38427
|
+
var i18n = {
|
|
38428
|
+
subscribe: { en: "Subscribe", fr: "S'abonner" },
|
|
38429
|
+
emailLabel: { en: "Email address", fr: "Adresse courriel" },
|
|
38430
|
+
nameLabel: { en: "Name", fr: "Nom" },
|
|
38431
|
+
emailPlaceholder: { en: "you@example.com", fr: "vous@exemple.com" },
|
|
38432
|
+
namePlaceholder: { en: "Your name", fr: "Votre nom" },
|
|
38433
|
+
emailRequired: { en: "Please enter your email address.", fr: "Veuillez entrer votre adresse courriel." },
|
|
38434
|
+
emailInvalid: { en: "Please enter a valid email address.", fr: "Veuillez entrer une adresse courriel valide." },
|
|
38435
|
+
privacyRequired: { en: "You must accept the privacy policy.", fr: "Vous devez accepter la politique de confidentialit\xE9." },
|
|
38436
|
+
privacyText: { en: "I agree to the", fr: "J'accepte la" },
|
|
38437
|
+
privacyLink: { en: "privacy policy", fr: "politique de confidentialit\xE9" },
|
|
38438
|
+
thankYou: { en: "Thank you for subscribing!", fr: "Merci pour votre inscription !" },
|
|
38439
|
+
error: { en: "Something went wrong. Please try again.", fr: "Une erreur est survenue. Veuillez r\xE9essayer." },
|
|
38440
|
+
submitting: { en: "Subscribing...", fr: "Inscription..." }
|
|
38441
|
+
};
|
|
38442
|
+
function t(key, locale) {
|
|
38443
|
+
return getLocalizedString(i18n[key], locale);
|
|
38444
|
+
}
|
|
38445
|
+
var EMAIL_REGEX = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
38446
|
+
function NewsletterSignup({
|
|
38447
|
+
onSubmit,
|
|
38448
|
+
variant = "stacked",
|
|
38449
|
+
size = "md",
|
|
38450
|
+
showName = false,
|
|
38451
|
+
showPrivacy = false,
|
|
38452
|
+
privacyUrl = "/privacy",
|
|
38453
|
+
locale = "en",
|
|
38454
|
+
buttonText,
|
|
38455
|
+
emailPlaceholder,
|
|
38456
|
+
namePlaceholder,
|
|
38457
|
+
successMessage,
|
|
38458
|
+
className
|
|
38459
|
+
}) {
|
|
38460
|
+
const [email, setEmail] = (0, import_react36.useState)("");
|
|
38461
|
+
const [name, setName] = (0, import_react36.useState)("");
|
|
38462
|
+
const [honeypot, setHoneypot] = (0, import_react36.useState)("");
|
|
38463
|
+
const [privacyAccepted, setPrivacyAccepted] = (0, import_react36.useState)(false);
|
|
38464
|
+
const [error, setError] = (0, import_react36.useState)(null);
|
|
38465
|
+
const [status, setStatus] = (0, import_react36.useState)("idle");
|
|
38466
|
+
const resolveText = (val, fallbackKey) => {
|
|
38467
|
+
if (!val) return t(fallbackKey, locale);
|
|
38468
|
+
return typeof val === "string" ? val : getLocalizedString(val, locale);
|
|
38469
|
+
};
|
|
38470
|
+
const sizeClasses2 = {
|
|
38471
|
+
sm: "text-sm",
|
|
38472
|
+
md: "text-base",
|
|
38473
|
+
lg: "text-lg"
|
|
38474
|
+
};
|
|
38475
|
+
const inputSizeClasses = {
|
|
38476
|
+
sm: "px-3 py-1.5 text-sm",
|
|
38477
|
+
md: "px-4 py-2 text-base",
|
|
38478
|
+
lg: "px-5 py-3 text-lg"
|
|
38479
|
+
};
|
|
38480
|
+
const buttonSizeClasses = {
|
|
38481
|
+
sm: "px-4 py-1.5 text-sm",
|
|
38482
|
+
md: "px-6 py-2 text-base",
|
|
38483
|
+
lg: "px-8 py-3 text-lg"
|
|
38484
|
+
};
|
|
38485
|
+
const handleSubmit = async (e) => {
|
|
38486
|
+
e.preventDefault();
|
|
38487
|
+
setError(null);
|
|
38488
|
+
if (honeypot) return;
|
|
38489
|
+
if (!email.trim()) {
|
|
38490
|
+
setError(t("emailRequired", locale));
|
|
38491
|
+
return;
|
|
38492
|
+
}
|
|
38493
|
+
if (!EMAIL_REGEX.test(email)) {
|
|
38494
|
+
setError(t("emailInvalid", locale));
|
|
38495
|
+
return;
|
|
38496
|
+
}
|
|
38497
|
+
if (showPrivacy && !privacyAccepted) {
|
|
38498
|
+
setError(t("privacyRequired", locale));
|
|
38499
|
+
return;
|
|
38500
|
+
}
|
|
38501
|
+
setStatus("submitting");
|
|
38502
|
+
try {
|
|
38503
|
+
const data = { email };
|
|
38504
|
+
if (showName && name.trim()) {
|
|
38505
|
+
data.name = name.trim();
|
|
38506
|
+
}
|
|
38507
|
+
const response = await onSubmit(data);
|
|
38508
|
+
if (response.success) {
|
|
38509
|
+
setStatus("success");
|
|
38510
|
+
setEmail("");
|
|
38511
|
+
setName("");
|
|
38512
|
+
setPrivacyAccepted(false);
|
|
38513
|
+
} else {
|
|
38514
|
+
setStatus("error");
|
|
38515
|
+
setError(response.error || t("error", locale));
|
|
38516
|
+
}
|
|
38517
|
+
} catch {
|
|
38518
|
+
setStatus("error");
|
|
38519
|
+
setError(t("error", locale));
|
|
38520
|
+
}
|
|
38521
|
+
};
|
|
38522
|
+
if (status === "success") {
|
|
38523
|
+
return /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: cn(sizeClasses2[size], variant === "card" && "bg-white rounded-lg border border-gray-200 p-6", className), children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("p", { className: "text-green-700 font-medium", role: "status", children: resolveText(successMessage, "thankYou") }) });
|
|
38524
|
+
}
|
|
38525
|
+
const isInline = variant === "inline";
|
|
38526
|
+
const isMinimal = variant === "minimal";
|
|
38527
|
+
const inputClasses = cn(
|
|
38528
|
+
"border border-gray-300 rounded-lg",
|
|
38529
|
+
"focus:ring-2 focus:ring-primary focus:border-primary outline-none",
|
|
38530
|
+
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
38531
|
+
inputSizeClasses[size]
|
|
38532
|
+
);
|
|
38533
|
+
const buttonLabel = resolveText(buttonText, "subscribe");
|
|
38534
|
+
const formContent = /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(import_jsx_runtime71.Fragment, { children: [
|
|
38535
|
+
showName && !isMinimal && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: isInline ? "" : "w-full", children: [
|
|
38536
|
+
!isMinimal && !isInline && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("label", { htmlFor: "newsletter-name", className: "block text-sm font-medium text-gray-700 mb-1", children: t("nameLabel", locale) }),
|
|
38537
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
38538
|
+
"input",
|
|
38539
|
+
{
|
|
38540
|
+
id: "newsletter-name",
|
|
38541
|
+
type: "text",
|
|
38542
|
+
value: name,
|
|
38543
|
+
onChange: (e) => setName(e.target.value),
|
|
38544
|
+
placeholder: resolveText(namePlaceholder, "namePlaceholder"),
|
|
38545
|
+
className: cn(inputClasses, isInline ? "" : "w-full"),
|
|
38546
|
+
disabled: status === "submitting",
|
|
38547
|
+
"aria-label": isInline ? t("nameLabel", locale) : void 0
|
|
38548
|
+
}
|
|
38549
|
+
)
|
|
38550
|
+
] }),
|
|
38551
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("div", { className: isInline ? "flex-1" : "w-full", children: [
|
|
38552
|
+
!isMinimal && !isInline && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("label", { htmlFor: "newsletter-email", className: "block text-sm font-medium text-gray-700 mb-1", children: t("emailLabel", locale) }),
|
|
38553
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
38554
|
+
"input",
|
|
38555
|
+
{
|
|
38556
|
+
id: "newsletter-email",
|
|
38557
|
+
type: "email",
|
|
38558
|
+
value: email,
|
|
38559
|
+
onChange: (e) => setEmail(e.target.value),
|
|
38560
|
+
placeholder: resolveText(emailPlaceholder, "emailPlaceholder"),
|
|
38561
|
+
className: cn(inputClasses, isInline ? "" : "w-full"),
|
|
38562
|
+
disabled: status === "submitting",
|
|
38563
|
+
required: true,
|
|
38564
|
+
"aria-label": isMinimal || isInline ? t("emailLabel", locale) : void 0
|
|
38565
|
+
}
|
|
38566
|
+
)
|
|
38567
|
+
] }),
|
|
38568
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
38569
|
+
"button",
|
|
38570
|
+
{
|
|
38571
|
+
type: "submit",
|
|
38572
|
+
disabled: status === "submitting",
|
|
38573
|
+
className: cn(
|
|
38574
|
+
"font-medium rounded-lg bg-primary text-white",
|
|
38575
|
+
"hover:bg-primary/90 transition-colors",
|
|
38576
|
+
"disabled:opacity-50 disabled:cursor-not-allowed",
|
|
38577
|
+
buttonSizeClasses[size],
|
|
38578
|
+
!isInline && "w-full"
|
|
38579
|
+
),
|
|
38580
|
+
children: status === "submitting" ? t("submitting", locale) : buttonLabel
|
|
38581
|
+
}
|
|
38582
|
+
)
|
|
38583
|
+
] });
|
|
38584
|
+
return /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
|
|
38585
|
+
"div",
|
|
38586
|
+
{
|
|
38587
|
+
className: cn(
|
|
38588
|
+
sizeClasses2[size],
|
|
38589
|
+
variant === "card" && "bg-white rounded-lg border border-gray-200 p-6 shadow-sm",
|
|
38590
|
+
className
|
|
38591
|
+
),
|
|
38592
|
+
children: [
|
|
38593
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)(
|
|
38594
|
+
"form",
|
|
38595
|
+
{
|
|
38596
|
+
onSubmit: handleSubmit,
|
|
38597
|
+
className: cn(
|
|
38598
|
+
isInline ? "flex items-end gap-3" : "flex flex-col gap-4"
|
|
38599
|
+
),
|
|
38600
|
+
noValidate: true,
|
|
38601
|
+
children: [
|
|
38602
|
+
formContent,
|
|
38603
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("div", { className: "hidden", "aria-hidden": "true", children: /* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
38604
|
+
"input",
|
|
38605
|
+
{
|
|
38606
|
+
type: "text",
|
|
38607
|
+
name: "_honeypot",
|
|
38608
|
+
value: honeypot,
|
|
38609
|
+
onChange: (e) => setHoneypot(e.target.value),
|
|
38610
|
+
tabIndex: -1,
|
|
38611
|
+
autoComplete: "off"
|
|
38612
|
+
}
|
|
38613
|
+
) }),
|
|
38614
|
+
showPrivacy && /* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("label", { className: cn("flex items-start gap-2 text-sm text-gray-600", isInline && "items-center"), children: [
|
|
38615
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)(
|
|
38616
|
+
"input",
|
|
38617
|
+
{
|
|
38618
|
+
type: "checkbox",
|
|
38619
|
+
checked: privacyAccepted,
|
|
38620
|
+
onChange: (e) => setPrivacyAccepted(e.target.checked),
|
|
38621
|
+
className: "mt-0.5 rounded border-gray-300 text-primary focus:ring-primary",
|
|
38622
|
+
disabled: status === "submitting"
|
|
38623
|
+
}
|
|
38624
|
+
),
|
|
38625
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsxs)("span", { children: [
|
|
38626
|
+
t("privacyText", locale),
|
|
38627
|
+
" ",
|
|
38628
|
+
/* @__PURE__ */ (0, import_jsx_runtime71.jsx)("a", { href: privacyUrl, className: "text-primary hover:underline", target: "_blank", rel: "noopener noreferrer", children: t("privacyLink", locale) })
|
|
38629
|
+
] })
|
|
38630
|
+
] })
|
|
38631
|
+
]
|
|
38632
|
+
}
|
|
38633
|
+
),
|
|
38634
|
+
error && /* @__PURE__ */ (0, import_jsx_runtime71.jsx)("p", { className: "mt-2 text-sm text-red-600", role: "alert", children: error })
|
|
38635
|
+
]
|
|
38636
|
+
}
|
|
38637
|
+
);
|
|
38638
|
+
}
|
|
38409
38639
|
// Annotate the CommonJS export names for ESM import in node:
|
|
38410
38640
|
0 && (module.exports = {
|
|
38411
38641
|
AboutSection,
|
|
@@ -38463,6 +38693,7 @@ function BlogIndex({
|
|
|
38463
38693
|
ModalRoot,
|
|
38464
38694
|
ModalTrigger,
|
|
38465
38695
|
MultiStepForm,
|
|
38696
|
+
NewsletterSignup,
|
|
38466
38697
|
PersonalTaxesSection,
|
|
38467
38698
|
PhoneLink,
|
|
38468
38699
|
PolicyLayout,
|