@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.
@@ -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
- 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 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 };
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
- 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 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 };
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 };
@@ -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 t = {};
43
+ var t2 = {};
44
44
  for (var n in r2) if ({}.hasOwnProperty.call(r2, n)) {
45
45
  if (-1 !== e.indexOf(n)) continue;
46
- t[n] = r2[n];
46
+ t2[n] = r2[n];
47
47
  }
48
- return t;
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, t) {
59
+ function _objectWithoutProperties2(e, t2) {
60
60
  if (null == e) return {};
61
- var o, r2, i = objectWithoutPropertiesLoose(e, t);
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 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);
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 t = {}.toString.call(r2).slice(8, -1);
117
- return "Object" === t && r2.constructor && (t = r2.constructor.name), "Map" === t || "Set" === t ? Array.from(r2) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r2, a) : void 0;
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(t, r2) {
172
- if ("object" != _typeof(t) || !t) return t;
173
- var e = t[Symbol.toPrimitive];
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(t, r2 || "default");
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)(t);
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(t) {
192
- var i = toPrimitive(t, "string");
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, t) {
204
+ function _defineProperty3(e, r2, t2) {
205
205
  return (r2 = toPropertyKey(r2)) in e ? Object.defineProperty(e, r2, {
206
- value: t,
206
+ value: t2,
207
207
  enumerable: true,
208
208
  configurable: true,
209
209
  writable: true
210
- }) : e[r2] = t, e;
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 t = arguments[e];
224
- for (var r2 in t) ({}).hasOwnProperty.call(t, r2) && (n[r2] = t[r2]);
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 t = env.tokenStack[k];
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(t, env.grammar),
11173
+ Prism3.tokenize(t2, env.grammar),
11174
11174
  "language-" + language,
11175
- t
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 t = getToken(0);
14176
- if (t.type === "variable") {
14177
- addAlias(t, "variable-input");
14178
- inputVariables.push(t.content);
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((t) => t.trim());
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 t = Object.keys(e);
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
- })), t.push.apply(t, o);
32498
+ })), t2.push.apply(t2, o);
32498
32499
  }
32499
- return t;
32500
+ return t2;
32500
32501
  }
32501
32502
  function _objectSpread(e) {
32502
32503
  for (var r2 = 1; r2 < arguments.length; r2++) {
32503
- var t = null != arguments[r2] ? arguments[r2] : {};
32504
- r2 % 2 ? ownKeys(Object(t), true).forEach(function(r3) {
32505
- (0, import_defineProperty.default)(e, r3, t[r3]);
32506
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function(r3) {
32507
- Object.defineProperty(e, r3, Object.getOwnPropertyDescriptor(t, r3));
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 t = Object.keys(e);
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
- })), t.push.apply(t, o);
32612
+ })), t2.push.apply(t2, o);
32612
32613
  }
32613
- return t;
32614
+ return t2;
32614
32615
  }
32615
32616
  function _objectSpread2(e) {
32616
32617
  for (var r2 = 1; r2 < arguments.length; r2++) {
32617
- var t = null != arguments[r2] ? arguments[r2] : {};
32618
- r2 % 2 ? ownKeys2(Object(t), true).forEach(function(r3) {
32619
- (0, import_defineProperty2.default)(e, r3, t[r3]);
32620
- }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys2(Object(t)).forEach(function(r3) {
32621
- Object.defineProperty(e, r3, Object.getOwnPropertyDescriptor(t, r3));
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-8 sm:py-12", className), children: [
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.jsx)("div", { className: "flex flex-wrap gap-2 mb-8", role: "group", "aria-label": isFr ? "Filtrer par tag" : "Filter by tag", children: allTags.map((tag) => /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
38361
- "button",
38362
- {
38363
- onClick: () => setActiveTag(activeTag === tag ? null : tag),
38364
- className: cn(
38365
- "px-3 py-1.5 text-sm font-medium rounded-full transition-colors",
38366
- activeTag === tag ? "bg-primary text-white" : "bg-gray-100 text-gray-700 hover:bg-gray-200"
38367
- ),
38368
- children: tag
38369
- },
38370
- tag
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-6", children: featuredPosts.map((post) => /* @__PURE__ */ (0, import_jsx_runtime70.jsx)(
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)("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6", children: regularPosts.map((post) => /* @__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,