@opensite/ui 2.3.3 → 2.3.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/registry.cjs CHANGED
@@ -41941,9 +41941,24 @@ function FooterNewsletterContact({
41941
41941
  }
41942
41942
  );
41943
41943
  }
41944
+ var DEFAULT_STYLE_RULES41 = {
41945
+ formContainer: "flex items-stretch w-full",
41946
+ fieldsContainer: "",
41947
+ fieldClassName: "",
41948
+ formClassName: ""
41949
+ };
41950
+ var DEFAULT_FORM_FIELDS42 = [
41951
+ {
41952
+ name: "email",
41953
+ type: "email",
41954
+ label: "Email Address",
41955
+ placeholder: "Enter your email",
41956
+ required: true,
41957
+ columnSpan: 12
41958
+ }
41959
+ ];
41944
41960
  function FooterSplitImageAccordion({
41945
41961
  newsletterTitle,
41946
- emailPlaceholder,
41947
41962
  footerLinks,
41948
41963
  socialLinks,
41949
41964
  paymentPlatforms,
@@ -41952,7 +41967,7 @@ function FooterSplitImageAccordion({
41952
41967
  copyright,
41953
41968
  background,
41954
41969
  containerClassName = "w-screen px-0 sm:px-0 lg:px-0 max-w-screen relative z-10",
41955
- spacing = "py-6 md:py-0",
41970
+ spacing = "none",
41956
41971
  pattern,
41957
41972
  patternOpacity,
41958
41973
  className,
@@ -41974,51 +41989,46 @@ function FooterSplitImageAccordion({
41974
41989
  copyrightClassName,
41975
41990
  submenuLinksClassName,
41976
41991
  optixFlowConfig,
41977
- formConfig,
41978
- onSubmit,
41979
- onSuccess,
41980
- onError
41992
+ formEngineSetup,
41993
+ buttonAction,
41994
+ formSlot
41981
41995
  }) {
41982
- const form = forms.useForm({
41983
- initialValues: {
41984
- email: ""
41985
- },
41986
- validationSchema: {
41987
- email: (value) => {
41988
- if (!value) return "Email is required";
41989
- if (!integration.isValidEmail(value)) return "Please enter a valid email address";
41990
- return void 0;
41991
- }
41992
- },
41993
- onSubmit: async (values, helpers) => {
41994
- const shouldAutoSubmit = Boolean(formConfig?.endpoint);
41995
- if (!shouldAutoSubmit && !onSubmit) {
41996
- return;
41997
- }
41998
- try {
41999
- let result;
42000
- if (shouldAutoSubmit) {
42001
- result = await integration.submitPageSpeedForm(values, formConfig);
42002
- }
42003
- if (onSubmit) {
42004
- await onSubmit(values.email);
42005
- }
42006
- if (shouldAutoSubmit || onSubmit) {
42007
- if (formConfig?.resetOnSuccess !== false) {
42008
- helpers.resetForm();
41996
+ const renderForm = React26__namespace.useMemo(() => {
41997
+ if (formSlot) return formSlot;
41998
+ if (!formEngineSetup) return null;
41999
+ const defaultButtonAction = {
42000
+ label: "",
42001
+ variant: "default",
42002
+ icon: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
42003
+ };
42004
+ const action = buttonAction || defaultButtonAction;
42005
+ return /* @__PURE__ */ jsxRuntime.jsx(
42006
+ integration.FormEngine,
42007
+ {
42008
+ formEngineSetup: {
42009
+ ...formEngineSetup,
42010
+ formLayoutSettings: {
42011
+ ...formEngineSetup.formLayoutSettings,
42012
+ formLayout: "button-group",
42013
+ buttonGroupSetup: {
42014
+ ...formEngineSetup.formLayoutSettings?.buttonGroupSetup,
42015
+ size: "default",
42016
+ submitLabel: action.icon || action.label,
42017
+ submitVariant: action.variant || "default"
42018
+ }
42009
42019
  }
42010
- onSuccess?.(result);
42011
- }
42012
- } catch (error) {
42013
- if (error instanceof integration.PageSpeedFormSubmissionError && error.formErrors) {
42014
- helpers.setErrors(error.formErrors);
42020
+ },
42021
+ defaultFields: DEFAULT_FORM_FIELDS42,
42022
+ defaultStyleRules: {
42023
+ ...DEFAULT_STYLE_RULES41,
42024
+ formContainer: cn(
42025
+ DEFAULT_STYLE_RULES41.formContainer,
42026
+ newsletterFormClassName
42027
+ )
42015
42028
  }
42016
- onError?.(error);
42017
- throw error;
42018
42029
  }
42019
- }
42020
- });
42021
- const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
42030
+ );
42031
+ }, [formSlot, formEngineSetup, buttonAction, newsletterFormClassName]);
42022
42032
  return /* @__PURE__ */ jsxRuntime.jsx(
42023
42033
  Section,
42024
42034
  {
@@ -42059,40 +42069,7 @@ function FooterSplitImageAccordion({
42059
42069
  children: newsletterTitle
42060
42070
  }
42061
42071
  ),
42062
- /* @__PURE__ */ jsxRuntime.jsxs(
42063
- forms.Form,
42064
- {
42065
- form,
42066
- action: formConfig?.endpoint,
42067
- method: formMethod,
42068
- className: cn("flex items-stretch", newsletterFormClassName),
42069
- children: [
42070
- /* @__PURE__ */ jsxRuntime.jsx(forms.Field, { name: "email", className: "flex-1", children: ({ field }) => /* @__PURE__ */ jsxRuntime.jsx(
42071
- "input",
42072
- {
42073
- ...field,
42074
- type: "email",
42075
- placeholder: emailPlaceholder,
42076
- className: "flex h-10 w-full rounded-l-md rounded-r-none border border-r-0 border-input px-3 py-2 text-sm ring-offset-background placeholder:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50",
42077
- "aria-label": emailPlaceholder
42078
- }
42079
- ) }),
42080
- /* @__PURE__ */ jsxRuntime.jsx(
42081
- Pressable,
42082
- {
42083
- componentType: "button",
42084
- type: "submit",
42085
- variant: "default",
42086
- size: "icon",
42087
- asButton: true,
42088
- className: "rounded-l-none rounded-r-md shrink-0 h-10",
42089
- disabled: form.isSubmitting,
42090
- children: /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/arrow-right", size: 16 })
42091
- }
42092
- )
42093
- ]
42094
- }
42095
- ),
42072
+ renderForm,
42096
42073
  socialLinks && socialLinks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
42097
42074
  "ul",
42098
42075
  {
@@ -42117,19 +42094,31 @@ function FooterSplitImageAccordion({
42117
42094
  footerData.logo && /* @__PURE__ */ jsxRuntime.jsx(
42118
42095
  FooterLogo,
42119
42096
  {
42120
- logo: { ...footerData.logo, url: footerData.logoUrl },
42097
+ logo: { ...footerData.logo, url: footerData.logo.url || "/" },
42121
42098
  logoClassName: cn("inline-block max-w-60", logoClassName),
42122
42099
  optixFlowConfig
42123
42100
  }
42124
42101
  ),
42125
- footerData.title && /* @__PURE__ */ jsxRuntime.jsx(
42102
+ footerData.heading && /* @__PURE__ */ jsxRuntime.jsx(
42126
42103
  "h4",
42127
42104
  {
42128
- className: cn("text-xl font-semibold", brandTitleClassName),
42129
- children: footerData.title
42105
+ className: cn(
42106
+ "text-xl font-semibold text-pretty",
42107
+ brandTitleClassName
42108
+ ),
42109
+ children: footerData.heading
42130
42110
  }
42131
42111
  ),
42132
- footerData.description && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("opacity-80", brandDescriptionClassName), children: footerData.description })
42112
+ footerData.description && /* @__PURE__ */ jsxRuntime.jsx(
42113
+ "p",
42114
+ {
42115
+ className: cn(
42116
+ "opacity-80 text-balance",
42117
+ brandDescriptionClassName
42118
+ ),
42119
+ children: footerData.description
42120
+ }
42121
+ )
42133
42122
  ] }),
42134
42123
  footerLinks && footerLinks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(
42135
42124
  "div",
@@ -47803,13 +47792,13 @@ function HeroImageLeftContent({
47803
47792
  }
47804
47793
  );
47805
47794
  }
47806
- var DEFAULT_STYLE_RULES41 = {
47795
+ var DEFAULT_STYLE_RULES42 = {
47807
47796
  formContainer: "",
47808
47797
  fieldsContainer: "",
47809
47798
  fieldClassName: "",
47810
47799
  formClassName: "space-y-4"
47811
47800
  };
47812
- var DEFAULT_FORM_FIELDS42 = [
47801
+ var DEFAULT_FORM_FIELDS43 = [
47813
47802
  {
47814
47803
  name: "firstName",
47815
47804
  type: "text",
@@ -48046,8 +48035,8 @@ function HeroImageSlider({
48046
48035
  }
48047
48036
  }
48048
48037
  },
48049
- defaultFields: DEFAULT_FORM_FIELDS42,
48050
- defaultStyleRules: DEFAULT_STYLE_RULES41
48038
+ defaultFields: DEFAULT_FORM_FIELDS43,
48039
+ defaultStyleRules: DEFAULT_STYLE_RULES42
48051
48040
  }
48052
48041
  ),
48053
48042
  privacyNotice && /* @__PURE__ */ jsxRuntime.jsx(
@@ -53544,7 +53533,7 @@ function HeroHiringAnimatedText({
53544
53533
  }
53545
53534
  );
53546
53535
  }
53547
- var DEFAULT_FORM_FIELDS43 = [
53536
+ var DEFAULT_FORM_FIELDS44 = [
53548
53537
  {
53549
53538
  name: "email",
53550
53539
  type: "email",
@@ -53557,7 +53546,7 @@ var DEFAULT_FORM_FIELDS43 = [
53557
53546
  function HeroSplitImageNewsletter({
53558
53547
  heading,
53559
53548
  description,
53560
- formFields = DEFAULT_FORM_FIELDS43,
53549
+ formFields = DEFAULT_FORM_FIELDS44,
53561
53550
  formConfig,
53562
53551
  onSubmit,
53563
53552
  onSuccess,
@@ -55048,7 +55037,7 @@ function HeroProductShowcaseFloating({
55048
55037
  }
55049
55038
  );
55050
55039
  }
55051
- var DEFAULT_FORM_FIELDS44 = [
55040
+ var DEFAULT_FORM_FIELDS45 = [
55052
55041
  {
55053
55042
  name: "email",
55054
55043
  type: "email",
@@ -55064,7 +55053,7 @@ function HeroSaasDashboardPreview({
55064
55053
  badgeSlot,
55065
55054
  heading,
55066
55055
  description,
55067
- formFields = DEFAULT_FORM_FIELDS44,
55056
+ formFields = DEFAULT_FORM_FIELDS45,
55068
55057
  formConfig,
55069
55058
  onSubmit,
55070
55059
  onSuccess,
@@ -57853,13 +57842,13 @@ function HeroPricingComparison({
57853
57842
  }
57854
57843
  );
57855
57844
  }
57856
- var DEFAULT_STYLE_RULES42 = {
57845
+ var DEFAULT_STYLE_RULES43 = {
57857
57846
  formContainer: "mt-10 flex justify-center items-center w-full max-w-md flex-col gap-4 sm:flex-row",
57858
57847
  fieldsContainer: "",
57859
57848
  fieldClassName: "",
57860
57849
  formClassName: ""
57861
57850
  };
57862
- var DEFAULT_FORM_FIELDS45 = [
57851
+ var DEFAULT_FORM_FIELDS46 = [
57863
57852
  {
57864
57853
  name: "email",
57865
57854
  type: "email",
@@ -57945,8 +57934,8 @@ function HeroNewsletterMinimal({
57945
57934
  }
57946
57935
  }
57947
57936
  },
57948
- defaultFields: DEFAULT_FORM_FIELDS45,
57949
- defaultStyleRules: DEFAULT_STYLE_RULES42
57937
+ defaultFields: DEFAULT_FORM_FIELDS46,
57938
+ defaultStyleRules: DEFAULT_STYLE_RULES43
57950
57939
  }
57951
57940
  ),
57952
57941
  helperText && (typeof helperText === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm mt-2 text-center"), children: helperText }) : helperText)
@@ -58004,7 +57993,7 @@ function HeroNewsletterMinimal({
58004
57993
  }
58005
57994
  );
58006
57995
  }
58007
- var DEFAULT_FORM_FIELDS46 = [
57996
+ var DEFAULT_FORM_FIELDS47 = [
58008
57997
  {
58009
57998
  name: "email",
58010
57999
  type: "email",
@@ -58059,7 +58048,7 @@ function HeroComingSoonCountdown({
58059
58048
  description,
58060
58049
  countdownDate,
58061
58050
  countdownSlot,
58062
- formFields = DEFAULT_FORM_FIELDS46,
58051
+ formFields = DEFAULT_FORM_FIELDS47,
58063
58052
  formConfig,
58064
58053
  onSubmit,
58065
58054
  onSuccess,
@@ -81908,7 +81897,7 @@ function ListSearchableGrid({
81908
81897
  }
81909
81898
  );
81910
81899
  }
81911
- var { useMemo: useMemo412 } = React26__namespace;
81900
+ var { useMemo: useMemo413 } = React26__namespace;
81912
81901
  function OfferModalNewsletterDiscount({
81913
81902
  title,
81914
81903
  emailPlaceholder,
@@ -81976,7 +81965,7 @@ function OfferModalNewsletterDiscount({
81976
81965
  });
81977
81966
  const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
81978
81967
  const dialogProps = open !== void 0 ? { open, onOpenChange } : { defaultOpen };
81979
- const renderCloseButton = useMemo412(() => {
81968
+ const renderCloseButton = useMemo413(() => {
81980
81969
  if (closeButtonSlot) return closeButtonSlot;
81981
81970
  if (!closeButtonText) return null;
81982
81971
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute end-1.5 top-1.5", children: /* @__PURE__ */ jsxRuntime.jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -81990,12 +81979,12 @@ function OfferModalNewsletterDiscount({
81990
81979
  }
81991
81980
  ) }) });
81992
81981
  }, [closeButtonSlot, closeButtonText, closeClassName]);
81993
- const renderHeader = useMemo412(() => {
81982
+ const renderHeader = useMemo413(() => {
81994
81983
  if (headerSlot) return headerSlot;
81995
81984
  if (!title) return null;
81996
81985
  return /* @__PURE__ */ jsxRuntime.jsx(DialogHeader, { className: headerClassName, children: typeof title === "string" ? /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: cn("text-start font-serif text-2xl font-normal leading-snug", titleClassName), children: title }) : /* @__PURE__ */ jsxRuntime.jsx(DialogTitle, { className: cn("text-start font-serif text-2xl font-normal leading-snug", titleClassName), children: title }) });
81997
81986
  }, [headerSlot, title, headerClassName, titleClassName]);
81998
- const renderForm = useMemo412(() => {
81987
+ const renderForm = useMemo413(() => {
81999
81988
  if (formSlot) return formSlot;
82000
81989
  return /* @__PURE__ */ jsxRuntime.jsxs(
82001
81990
  forms.Form,
@@ -82057,7 +82046,7 @@ function OfferModalNewsletterDiscount({
82057
82046
  }
82058
82047
  ) });
82059
82048
  }
82060
- var { useMemo: useMemo413 } = React26__namespace;
82049
+ var { useMemo: useMemo414 } = React26__namespace;
82061
82050
  function OfferModalMembershipImage({
82062
82051
  overline,
82063
82052
  title,
@@ -82134,7 +82123,7 @@ function OfferModalMembershipImage({
82134
82123
  });
82135
82124
  const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
82136
82125
  const dialogProps = open !== void 0 ? { open, onOpenChange } : { defaultOpen };
82137
- const renderImage = useMemo413(() => {
82126
+ const renderImage = useMemo414(() => {
82138
82127
  if (imageSlot) return imageSlot;
82139
82128
  if (!image) return null;
82140
82129
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("max-h-[290px] h-full overflow-hidden max-lg:hidden", imageWrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -82147,7 +82136,7 @@ function OfferModalMembershipImage({
82147
82136
  }
82148
82137
  ) });
82149
82138
  }, [imageSlot, image, imageWrapperClassName, imageClassName, optixFlowConfig]);
82150
- const renderCloseButton = useMemo413(() => {
82139
+ const renderCloseButton = useMemo414(() => {
82151
82140
  if (closeButtonSlot) return closeButtonSlot;
82152
82141
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute -end-px -top-px z-10", children: /* @__PURE__ */ jsxRuntime.jsx(DialogClose, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsx(
82153
82142
  Pressable,
@@ -82163,7 +82152,7 @@ function OfferModalMembershipImage({
82163
82152
  }
82164
82153
  ) }) });
82165
82154
  }, [closeButtonSlot, closeClassName]);
82166
- const renderForm = useMemo413(() => {
82155
+ const renderForm = useMemo414(() => {
82167
82156
  if (formSlot) return formSlot;
82168
82157
  return /* @__PURE__ */ jsxRuntime.jsxs(
82169
82158
  forms.Form,
@@ -82226,7 +82215,7 @@ function OfferModalMembershipImage({
82226
82215
  }
82227
82216
  );
82228
82217
  }, [formSlot, form, formConfig, formMethod, emailPlaceholder, inputClassName, submitClassName, buttonText, formClassName]);
82229
- const renderFooter = useMemo413(() => {
82218
+ const renderFooter = useMemo414(() => {
82230
82219
  if (footerSlot) return footerSlot;
82231
82220
  if (!description) return null;
82232
82221
  return /* @__PURE__ */ jsxRuntime.jsx(DialogFooter, { className: footerClassName, children: /* @__PURE__ */ jsxRuntime.jsx(DialogDescription, { className: cn("text-muted-foreground text-center text-xs leading-relaxed", descriptionClassName), children: description }) });
@@ -82346,7 +82335,7 @@ function SheetDescription({
82346
82335
  }
82347
82336
  );
82348
82337
  }
82349
- var { useMemo: useMemo414 } = React26__namespace;
82338
+ var { useMemo: useMemo415 } = React26__namespace;
82350
82339
  function OfferModalSheetNewsletter({
82351
82340
  logo,
82352
82341
  logoSlot,
@@ -82429,7 +82418,7 @@ function OfferModalSheetNewsletter({
82429
82418
  });
82430
82419
  const formMethod = formConfig?.method?.toLowerCase() === "get" ? "get" : "post";
82431
82420
  const sheetProps = open !== void 0 ? { open, onOpenChange } : { defaultOpen };
82432
- const renderLogo = useMemo414(() => {
82421
+ const renderLogo = useMemo415(() => {
82433
82422
  if (logoSlot) return logoSlot;
82434
82423
  if (!logo) return null;
82435
82424
  const logoSrc = typeof logo.src === "string" ? logo.src : logo.src.light;
@@ -82443,7 +82432,7 @@ function OfferModalSheetNewsletter({
82443
82432
  }
82444
82433
  );
82445
82434
  }, [logoSlot, logo, logoClassName, optixFlowConfig]);
82446
- const renderHeader = useMemo414(() => {
82435
+ const renderHeader = useMemo415(() => {
82447
82436
  if (headerSlot) return headerSlot;
82448
82437
  return /* @__PURE__ */ jsxRuntime.jsxs(SheetHeader, { className: cn("gap-8 p-0", headerClassName), children: [
82449
82438
  renderLogo,
@@ -82453,7 +82442,7 @@ function OfferModalSheetNewsletter({
82453
82442
  ] })
82454
82443
  ] });
82455
82444
  }, [headerSlot, renderLogo, headerClassName, title, titleClassName, description, descriptionClassName]);
82456
- const renderForm = useMemo414(() => {
82445
+ const renderForm = useMemo415(() => {
82457
82446
  if (formSlot) return formSlot;
82458
82447
  return /* @__PURE__ */ jsxRuntime.jsx(
82459
82448
  forms.Form,
@@ -82501,7 +82490,7 @@ function OfferModalSheetNewsletter({
82501
82490
  }
82502
82491
  );
82503
82492
  }, [formSlot, form, formConfig, formMethod, emailPlaceholder, inputClassName, submitClassName, buttonText, formClassName]);
82504
- const renderLegal = useMemo414(() => {
82493
+ const renderLegal = useMemo415(() => {
82505
82494
  if (legalSlot) return legalSlot;
82506
82495
  if (!termsUrl || !termsText || !privacyUrl || !privacyText) return null;
82507
82496
  return /* @__PURE__ */ jsxRuntime.jsxs("p", { className: cn("text-muted-foreground text-xs", legalClassName), children: [
@@ -82515,7 +82504,7 @@ function OfferModalSheetNewsletter({
82515
82504
  "."
82516
82505
  ] });
82517
82506
  }, [legalSlot, termsUrl, termsText, privacyUrl, privacyText, legalClassName]);
82518
- const renderImage = useMemo414(() => {
82507
+ const renderImage = useMemo415(() => {
82519
82508
  if (imageSlot) return imageSlot;
82520
82509
  if (!image) return null;
82521
82510
  return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("h-1/2 basis-1/2", imageWrapperClassName), children: /* @__PURE__ */ jsxRuntime.jsx(AspectRatio, { ratio: 1, className: "overflow-hidden", children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -98701,32 +98690,20 @@ function LinkTreeBlock({
98701
98690
  "flex flex-wrap items-center justify-center gap-2",
98702
98691
  socialLinksClassName
98703
98692
  ),
98704
- children: socialLinks.map((social, index) => {
98705
- const { iconName, ...socialPressableProps } = social;
98706
- const icon = social.icon || (iconName ? /* @__PURE__ */ jsxRuntime.jsx(
98707
- DynamicIcon,
98708
- {
98709
- name: iconName,
98710
- size: 20,
98711
- className: socialIconClassName
98712
- }
98713
- ) : null);
98714
- const ariaLabel = social["aria-label"] || (typeof social.label === "string" ? social.label : void 0) || social.platform;
98715
- return /* @__PURE__ */ jsxRuntime.jsx(
98716
- Pressable,
98717
- {
98718
- ...socialPressableProps,
98719
- "aria-label": ariaLabel,
98720
- className: cn(
98721
- "flex h-12 w-12 items-center justify-center rounded-full p-2.5 transition-all duration-200",
98722
- socialLinkClassName,
98723
- social.className
98724
- ),
98725
- children: icon
98726
- },
98727
- social.id ?? index
98728
- );
98729
- })
98693
+ children: socialLinks.map((social, index) => /* @__PURE__ */ jsxRuntime.jsx(
98694
+ SocialLinkIcon,
98695
+ {
98696
+ href: social.href,
98697
+ label: social["aria-label"] || (typeof social.label === "string" ? social.label : void 0),
98698
+ className: cn(
98699
+ "flex h-12 w-12 items-center justify-center rounded-full p-2.5 transition-all duration-200",
98700
+ socialLinkClassName,
98701
+ social.className
98702
+ ),
98703
+ iconClassName: socialIconClassName
98704
+ },
98705
+ social.id ?? social.href ?? index
98706
+ ))
98730
98707
  }
98731
98708
  );
98732
98709
  }, [
@@ -98974,33 +98951,16 @@ function LinkPageMinimalProfile({
98974
98951
  "flex items-center justify-center gap-4 pt-4",
98975
98952
  socialLinksClassName
98976
98953
  ),
98977
- children: socialLinks.map((social, index) => {
98978
- const { iconName: socialIconName, ...socialRest } = social;
98979
- const icon = social.icon || (socialIconName ? /* @__PURE__ */ jsxRuntime.jsx(
98980
- DynamicIcon,
98981
- {
98982
- name: socialIconName,
98983
- size: 20,
98984
- className: socialIconClassName
98985
- }
98986
- ) : null);
98987
- const ariaLabel = social["aria-label"] || (typeof social.label === "string" ? social.label : void 0) || social.platform;
98988
- return /* @__PURE__ */ jsxRuntime.jsx(
98989
- Pressable,
98990
- {
98991
- href: social.href,
98992
- "aria-label": ariaLabel,
98993
- className: cn(
98994
- "rounded-full p-2 transition-colors",
98995
- "hover:opacity-80",
98996
- socialLinkClassName,
98997
- social.className
98998
- ),
98999
- children: icon
99000
- },
99001
- social.id ?? index
99002
- );
99003
- })
98954
+ children: socialLinks.map((social, index) => /* @__PURE__ */ jsxRuntime.jsx(
98955
+ SocialLinkIcon,
98956
+ {
98957
+ href: social.href,
98958
+ label: social["aria-label"] || (typeof social.label === "string" ? social.label : void 0),
98959
+ className: cn(socialLinkClassName, social.className),
98960
+ iconClassName: socialIconClassName
98961
+ },
98962
+ social.href || index
98963
+ ))
99004
98964
  }
99005
98965
  );
99006
98966
  }, [
@@ -99067,13 +99027,13 @@ function LinkPageMinimalProfile({
99067
99027
  }
99068
99028
  );
99069
99029
  }
99070
- var DEFAULT_STYLE_RULES43 = {
99030
+ var DEFAULT_STYLE_RULES44 = {
99071
99031
  formContainer: "w-full flex flex-col gap-3 justify-center items-center",
99072
99032
  fieldsContainer: "",
99073
99033
  fieldClassName: "",
99074
99034
  formClassName: ""
99075
99035
  };
99076
- var DEFAULT_FORM_FIELDS47 = [
99036
+ var DEFAULT_FORM_FIELDS48 = [
99077
99037
  {
99078
99038
  name: "email",
99079
99039
  type: "email",
@@ -99191,34 +99151,22 @@ function LinkPageNewsletterSocial({
99191
99151
  "flex items-center justify-center gap-3",
99192
99152
  socialLinksClassName
99193
99153
  ),
99194
- children: socialLinks.map((social, index) => {
99195
- const { iconName, ...socialPressableProps } = social;
99196
- const icon = social.icon || (iconName ? /* @__PURE__ */ jsxRuntime.jsx(
99197
- DynamicIcon,
99198
- {
99199
- name: iconName,
99200
- size: 20,
99201
- className: socialIconClassName
99202
- }
99203
- ) : null);
99204
- const ariaLabel = social["aria-label"] || (typeof social.label === "string" ? social.label : void 0) || social.platform;
99205
- return /* @__PURE__ */ jsxRuntime.jsx(
99206
- Pressable,
99207
- {
99208
- ...socialPressableProps,
99209
- "aria-label": ariaLabel,
99210
- asButton: true,
99211
- size: "icon-lg",
99212
- className: cn(
99213
- "rounded-full p-2.5 transition-all duration-200",
99214
- socialLinkClassName,
99215
- social.className
99216
- ),
99217
- children: icon
99218
- },
99219
- social.id ?? index
99220
- );
99221
- })
99154
+ children: socialLinks.map((social, index) => /* @__PURE__ */ jsxRuntime.jsx(
99155
+ SocialLinkIcon,
99156
+ {
99157
+ href: social.href,
99158
+ label: social["aria-label"] || (typeof social.label === "string" ? social.label : void 0),
99159
+ asButton: true,
99160
+ size: "icon-lg",
99161
+ className: cn(
99162
+ "rounded-full p-2.5 transition-all duration-200",
99163
+ socialLinkClassName,
99164
+ social.className
99165
+ ),
99166
+ iconClassName: socialIconClassName
99167
+ },
99168
+ social.id ?? social.href ?? index
99169
+ ))
99222
99170
  }
99223
99171
  );
99224
99172
  }, [
@@ -99256,8 +99204,8 @@ function LinkPageNewsletterSocial({
99256
99204
  }
99257
99205
  }
99258
99206
  },
99259
- defaultFields: DEFAULT_FORM_FIELDS47,
99260
- defaultStyleRules: DEFAULT_STYLE_RULES43
99207
+ defaultFields: DEFAULT_FORM_FIELDS48,
99208
+ defaultStyleRules: DEFAULT_STYLE_RULES44
99261
99209
  }
99262
99210
  ),
99263
99211
  helperText && (typeof helperText === "string" ? /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("text-sm mt-2 text-center"), children: helperText }) : helperText)
@@ -99525,34 +99473,22 @@ function LinkPageGridCards({
99525
99473
  "flex items-center justify-center gap-2",
99526
99474
  socialLinksClassName
99527
99475
  ),
99528
- children: socialLinks.map((social, index) => {
99529
- const { iconName, ...socialPressableProps } = social;
99530
- const icon = social.icon || (iconName ? /* @__PURE__ */ jsxRuntime.jsx(
99531
- DynamicIcon,
99532
- {
99533
- name: iconName,
99534
- size: 18,
99535
- className: socialIconClassName
99536
- }
99537
- ) : null);
99538
- const ariaLabel = social["aria-label"] || (typeof social.label === "string" ? social.label : void 0) || social.platform;
99539
- return /* @__PURE__ */ jsxRuntime.jsx(
99540
- Pressable,
99541
- {
99542
- ...socialPressableProps,
99543
- "aria-label": ariaLabel,
99544
- className: cn(
99545
- "rounded-lg p-2 transition-all duration-200",
99546
- "bg-card text-card-foreground hover:opacity-80",
99547
- "size-12 flex items-center justify-center",
99548
- socialLinkClassName,
99549
- social.className
99550
- ),
99551
- children: icon
99552
- },
99553
- social.id ?? index
99554
- );
99555
- })
99476
+ children: socialLinks.map((social, index) => /* @__PURE__ */ jsxRuntime.jsx(
99477
+ SocialLinkIcon,
99478
+ {
99479
+ href: social.href,
99480
+ label: social["aria-label"] || (typeof social.label === "string" ? social.label : void 0),
99481
+ className: cn(
99482
+ "rounded-lg p-2 transition-all duration-200",
99483
+ "bg-card text-card-foreground hover:opacity-80",
99484
+ "size-12 flex items-center justify-center",
99485
+ socialLinkClassName,
99486
+ social.className
99487
+ ),
99488
+ iconClassName: socialIconClassName
99489
+ },
99490
+ social.id ?? social.href ?? index
99491
+ ))
99556
99492
  }
99557
99493
  );
99558
99494
  }, [
@@ -99785,34 +99721,22 @@ function LinkPageBentoLayout({
99785
99721
  const renderSocialLinks = React26.useMemo(() => {
99786
99722
  if (socialLinksSlot) return socialLinksSlot;
99787
99723
  if (!socialLinks || socialLinks.length === 0) return null;
99788
- return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center gap-2 pt-1", socialLinksClassName), children: socialLinks.map((social, index) => {
99789
- const { iconName, ...socialPressableProps } = social;
99790
- const icon = social.icon || (iconName ? /* @__PURE__ */ jsxRuntime.jsx(
99791
- DynamicIcon,
99792
- {
99793
- name: iconName,
99794
- size: 18,
99795
- className: socialIconClassName
99796
- }
99797
- ) : null);
99798
- const ariaLabel = social["aria-label"] || (typeof social.label === "string" ? social.label : void 0) || social.platform;
99799
- return /* @__PURE__ */ jsxRuntime.jsx(
99800
- Pressable,
99801
- {
99802
- ...socialPressableProps,
99803
- "aria-label": ariaLabel,
99804
- className: cn(
99805
- "rounded-full p-2 transition-all duration-200",
99806
- "hover:scale-110 active:scale-95",
99807
- "hover:opacity-80",
99808
- socialLinkClassName,
99809
- social.className
99810
- ),
99811
- children: icon
99812
- },
99813
- social.id ?? index
99814
- );
99815
- }) });
99724
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex items-center gap-2 pt-1", socialLinksClassName), children: socialLinks.map((social, index) => /* @__PURE__ */ jsxRuntime.jsx(
99725
+ SocialLinkIcon,
99726
+ {
99727
+ href: social.href,
99728
+ label: social["aria-label"] || (typeof social.label === "string" ? social.label : void 0),
99729
+ className: cn(
99730
+ "rounded-full p-2 transition-all duration-200",
99731
+ "hover:scale-110 active:scale-95",
99732
+ "hover:opacity-80",
99733
+ socialLinkClassName,
99734
+ social.className
99735
+ ),
99736
+ iconClassName: socialIconClassName
99737
+ },
99738
+ social.id ?? social.href ?? index
99739
+ )) });
99816
99740
  }, [
99817
99741
  socialLinksSlot,
99818
99742
  socialLinks,
@@ -116710,7 +116634,7 @@ var BLOCK_REGISTRY = {
116710
116634
  "footer-split-image-accordion": {
116711
116635
  id: "footer-split-image-accordion",
116712
116636
  name: "Footer Split Image Accordion",
116713
- description: "A split-layout footer with large image, newsletter signup, accordion navigation, and payment methods. Features a two-column split with image on left, content on right, and responsive accordion links for mobile. Best for e-commerce sites, fashion brands, and lifestyle businesses.",
116637
+ description: "A split-layout footer with large image, newsletter signup powered by FormEngine, accordion navigation, and payment methods. Features a two-column split with image on left, content on right, and responsive accordion links for mobile. Uses @page-speed/forms/integration for form handling. Best for e-commerce sites, fashion brands, and lifestyle businesses.",
116714
116638
  semanticTags: [
116715
116639
  "footer",
116716
116640
  "split",
@@ -116727,6 +116651,9 @@ var BLOCK_REGISTRY = {
116727
116651
  exampleUsage: `
116728
116652
  <FooterSplitImageAccordion
116729
116653
  newsletterTitle="Get updates and save 20%"
116654
+ formEngineSetup={{
116655
+ formConfig: { endpoint: "/api/subscribe", format: "json" },
116656
+ }}
116730
116657
  footerLinks={[
116731
116658
  { title: "Collections", id: "collections", items: [...] },
116732
116659
  ]}