@opensite/ui 1.5.2 → 1.5.3

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.
@@ -1357,6 +1357,78 @@ var Section = React__namespace.default.forwardRef(
1357
1357
  }
1358
1358
  );
1359
1359
  Section.displayName = "Section";
1360
+ function isThemedLogo(logo) {
1361
+ return "light" in logo || "dark" in logo;
1362
+ }
1363
+ var FooterLogo = ({
1364
+ logo,
1365
+ logoSlot,
1366
+ logoClassName,
1367
+ logoImageClassName,
1368
+ logoTitleClassName,
1369
+ optixFlowConfig
1370
+ }) => {
1371
+ if (logoSlot) return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: logoSlot });
1372
+ if (!logo) return null;
1373
+ const hasThemedSources = isThemedLogo(logo) && (logo.light || logo.dark);
1374
+ const hasStandardSource = !isThemedLogo(logo) && logo.src;
1375
+ const logoContent = hasThemedSources ? (
1376
+ // Themed logo with light/dark mode sources
1377
+ /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1378
+ logo.light && /* @__PURE__ */ jsxRuntime.jsx(
1379
+ img.Img,
1380
+ {
1381
+ src: logo.light,
1382
+ alt: logo.alt || "Logo",
1383
+ className: cn(
1384
+ "h-8 w-auto object-contain dark:hidden md:h-10",
1385
+ logoImageClassName
1386
+ ),
1387
+ optixFlowConfig
1388
+ }
1389
+ ),
1390
+ logo.dark && /* @__PURE__ */ jsxRuntime.jsx(
1391
+ img.Img,
1392
+ {
1393
+ src: logo.dark,
1394
+ alt: logo.alt || "Logo",
1395
+ className: cn(
1396
+ "hidden h-8 w-auto object-contain dark:block md:h-10",
1397
+ logoImageClassName
1398
+ ),
1399
+ optixFlowConfig
1400
+ }
1401
+ )
1402
+ ] })
1403
+ ) : hasStandardSource ? (
1404
+ // Standard single logo image
1405
+ /* @__PURE__ */ jsxRuntime.jsx(
1406
+ img.Img,
1407
+ {
1408
+ src: logo.src,
1409
+ alt: logo.alt || "Logo",
1410
+ className: cn("h-8 w-auto object-contain md:h-10", logoImageClassName),
1411
+ optixFlowConfig
1412
+ }
1413
+ )
1414
+ ) : logo.title ? (
1415
+ // Text-based logo fallback
1416
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("text-lg font-semibold md:text-xl", logoTitleClassName), children: logo.title })
1417
+ ) : null;
1418
+ if (!logoContent) return null;
1419
+ if (logo.url) {
1420
+ return /* @__PURE__ */ jsxRuntime.jsx(
1421
+ Pressable,
1422
+ {
1423
+ href: logo.url,
1424
+ className: cn("inline-flex items-center", logoClassName),
1425
+ children: logoContent
1426
+ }
1427
+ );
1428
+ }
1429
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("inline-flex items-center", logoClassName), children: logoContent });
1430
+ };
1431
+ var footer_logo_default = FooterLogo;
1360
1432
  function FooterBackgroundCard({
1361
1433
  logo,
1362
1434
  backgroundImage,
@@ -1370,6 +1442,8 @@ function FooterBackgroundCard({
1370
1442
  menuItems,
1371
1443
  copyright,
1372
1444
  bottomLinks,
1445
+ logoWrapperClassName,
1446
+ logoClassName,
1373
1447
  className,
1374
1448
  cardClassName,
1375
1449
  gridClassName,
@@ -1388,7 +1462,8 @@ function FooterBackgroundCard({
1388
1462
  copyrightClassName,
1389
1463
  bottomLinksClassName,
1390
1464
  background,
1391
- spacing,
1465
+ containerClassName = "px-6 sm:px-6 md:px-8 lg:px-8",
1466
+ spacing = "py-6 md:py-32",
1392
1467
  pattern,
1393
1468
  patternOpacity,
1394
1469
  optixFlowConfig
@@ -1406,79 +1481,174 @@ function FooterBackgroundCard({
1406
1481
  patternOpacity,
1407
1482
  className: cn("bg-cover bg-center bg-no-repeat", className),
1408
1483
  style: sectionStyle,
1409
- children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mx-auto max-w-7xl rounded-lg p-8 shadow-lg md:p-12", cardClassName), children: [
1410
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-4 lg:gap-12", gridClassName), children: [
1411
- (profileImage || tagline || personalMessage || ctaText) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("lg:col-span-1", profileSectionClassName), children: [
1412
- (profileImage || tagline) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 flex items-center gap-4", children: [
1413
- profileImage && /* @__PURE__ */ jsxRuntime.jsx(
1414
- img.Img,
1415
- {
1416
- src: profileImage,
1417
- alt: "Profile",
1418
- className: cn("h-16 w-16 rounded-full object-cover", profileImageClassName),
1419
- optixFlowConfig
1420
- }
1421
- ),
1422
- tagline && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("text-2xl font-medium", taglineClassName), children: tagline })
1423
- ] }),
1424
- personalMessage && /* @__PURE__ */ jsxRuntime.jsx("p", { className: cn("mb-6 text-sm leading-relaxed opacity-80", messageClassName), children: personalMessage }),
1425
- ctaText && /* @__PURE__ */ jsxRuntime.jsx(
1426
- Pressable,
1427
- {
1428
- href: ctaUrl || "#",
1429
- className: cn("inline-flex items-center justify-center whitespace-nowrap rounded-md border text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:opacity-80 h-10 px-4 py-2", ctaClassName),
1430
- children: ctaText
1431
- }
1432
- )
1433
- ] }),
1434
- menuItems && menuItems.length > 0 && menuItems.map((menu, idx) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(menuSectionClassName), children: [
1435
- /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("mb-4 text-sm font-medium tracking-wider uppercase", menuTitleClassName), children: menu.title }),
1436
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-3", children: menu.links.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
1437
- Pressable,
1484
+ containerClassName,
1485
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1486
+ "div",
1487
+ {
1488
+ className: cn(
1489
+ "mx-auto max-w-7xl rounded-2xl p-12 shadow-xl md:p-16 bg-card text-card-foreground",
1490
+ cardClassName
1491
+ ),
1492
+ children: [
1493
+ /* @__PURE__ */ jsxRuntime.jsxs(
1494
+ "div",
1438
1495
  {
1439
- href: link.url,
1440
- className: cn("border-b border-transparent opacity-80 transition-all duration-300 ease-in-out hover:opacity-100", menuLinkClassName),
1441
- children: link.text
1496
+ className: cn(
1497
+ "grid grid-cols-1 gap-8 md:grid-cols-2 lg:grid-cols-4 lg:gap-12",
1498
+ gridClassName
1499
+ ),
1500
+ children: [
1501
+ (profileImage || tagline || personalMessage || ctaText || logo) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("lg:col-span-1", profileSectionClassName), children: [
1502
+ /* @__PURE__ */ jsxRuntime.jsx(
1503
+ footer_logo_default,
1504
+ {
1505
+ logo,
1506
+ logoClassName: cn("mb-12", logoWrapperClassName),
1507
+ logoImageClassName: logoClassName,
1508
+ optixFlowConfig
1509
+ }
1510
+ ),
1511
+ (profileImage || tagline) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mb-4 flex items-center gap-4", children: [
1512
+ profileImage && /* @__PURE__ */ jsxRuntime.jsx(
1513
+ img.Img,
1514
+ {
1515
+ src: profileImage,
1516
+ alt: "Profile",
1517
+ className: cn(
1518
+ "h-16 w-16 rounded-full object-cover",
1519
+ profileImageClassName
1520
+ ),
1521
+ optixFlowConfig
1522
+ }
1523
+ ),
1524
+ tagline && /* @__PURE__ */ jsxRuntime.jsx(
1525
+ "h3",
1526
+ {
1527
+ className: cn("text-2xl font-medium", taglineClassName),
1528
+ children: tagline
1529
+ }
1530
+ )
1531
+ ] }),
1532
+ personalMessage && /* @__PURE__ */ jsxRuntime.jsx(
1533
+ "p",
1534
+ {
1535
+ className: cn(
1536
+ "mb-6 text-sm leading-relaxed opacity-80",
1537
+ messageClassName
1538
+ ),
1539
+ children: personalMessage
1540
+ }
1541
+ ),
1542
+ ctaText && /* @__PURE__ */ jsxRuntime.jsx(
1543
+ Pressable,
1544
+ {
1545
+ href: ctaUrl || "#",
1546
+ className: cn(
1547
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md border text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 hover:opacity-80 h-10 px-4 py-2",
1548
+ ctaClassName
1549
+ ),
1550
+ children: ctaText
1551
+ }
1552
+ )
1553
+ ] }),
1554
+ menuItems && menuItems.length > 0 && menuItems.map((menu, idx) => /* @__PURE__ */ jsxRuntime.jsxs(
1555
+ "div",
1556
+ {
1557
+ className: cn("pl-0 md:pl-8", menuSectionClassName),
1558
+ children: [
1559
+ /* @__PURE__ */ jsxRuntime.jsx(
1560
+ "h3",
1561
+ {
1562
+ className: cn(
1563
+ "mb-4 text-sm font-medium tracking-wider uppercase",
1564
+ menuTitleClassName
1565
+ ),
1566
+ children: menu.title
1567
+ }
1568
+ ),
1569
+ /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "space-y-3", children: menu.links.map((link, index) => /* @__PURE__ */ jsxRuntime.jsx("li", { children: /* @__PURE__ */ jsxRuntime.jsx(
1570
+ Pressable,
1571
+ {
1572
+ href: link.url,
1573
+ className: cn(
1574
+ "border-b border-transparent opacity-80 transition-all duration-300 ease-in-out hover:opacity-100",
1575
+ menuLinkClassName
1576
+ ),
1577
+ children: link.text
1578
+ }
1579
+ ) }, index)) })
1580
+ ]
1581
+ },
1582
+ idx
1583
+ )),
1584
+ (contactTitle || contact) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("pl-0 md:pl-8", contactSectionClassName), children: [
1585
+ contactTitle && /* @__PURE__ */ jsxRuntime.jsx(
1586
+ "h3",
1587
+ {
1588
+ className: cn(
1589
+ "mb-4 text-sm font-medium tracking-wider uppercase",
1590
+ contactTitleClassName
1591
+ ),
1592
+ children: contactTitle
1593
+ }
1594
+ ),
1595
+ contact && /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "space-y-3", children: [
1596
+ contact.phone && /* @__PURE__ */ jsxRuntime.jsx("li", { className: cn("opacity-80", contactItemClassName), children: contact.phone }),
1597
+ contact.email && /* @__PURE__ */ jsxRuntime.jsx("li", { className: cn("opacity-80", contactItemClassName), children: contact.email }),
1598
+ (contact.location || contact.timezone) && /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("opacity-80", contactItemClassName), children: [
1599
+ contact.location,
1600
+ contact.location && contact.timezone && " \u2022 ",
1601
+ contact.timezone
1602
+ ] })
1603
+ ] })
1604
+ ] })
1605
+ ]
1442
1606
  }
1443
- ) }, index)) })
1444
- ] }, idx)),
1445
- (contactTitle || contact) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn(contactSectionClassName), children: [
1446
- contactTitle && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: cn("mb-4 text-sm font-medium tracking-wider uppercase", contactTitleClassName), children: contactTitle }),
1447
- contact && /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "space-y-3", children: [
1448
- contact.phone && /* @__PURE__ */ jsxRuntime.jsx("li", { className: cn("opacity-80", contactItemClassName), children: contact.phone }),
1449
- contact.email && /* @__PURE__ */ jsxRuntime.jsx("li", { className: cn("opacity-80", contactItemClassName), children: contact.email }),
1450
- (contact.location || contact.timezone) && /* @__PURE__ */ jsxRuntime.jsxs("li", { className: cn("opacity-80", contactItemClassName), children: [
1451
- contact.location,
1452
- contact.location && contact.timezone && " \u2022 ",
1453
- contact.timezone
1454
- ] })
1455
- ] })
1456
- ] })
1457
- ] }),
1458
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("mt-12 flex flex-col items-center justify-between gap-4 border-t pt-8 md:flex-row", bottomClassName), children: [
1459
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: cn("flex flex-col gap-2 text-sm opacity-80 md:flex-row md:items-center md:gap-4", copyrightClassName), children: [
1460
- /* @__PURE__ */ jsxRuntime.jsx(FooterCopyright, { copyright }),
1461
- /* @__PURE__ */ jsxRuntime.jsx(
1462
- BrandAttribution,
1607
+ ),
1608
+ /* @__PURE__ */ jsxRuntime.jsxs(
1609
+ "div",
1463
1610
  {
1464
- internalBrandSlug: "open_site_ai",
1465
- optionIndex: 3,
1466
- variant: "span",
1467
- linkClassName: "hover:opacity-100"
1611
+ className: cn(
1612
+ "mt-12 flex flex-col items-center justify-between gap-4 border-t pt-8 md:flex-row",
1613
+ bottomClassName
1614
+ ),
1615
+ children: [
1616
+ /* @__PURE__ */ jsxRuntime.jsxs(
1617
+ "div",
1618
+ {
1619
+ className: cn(
1620
+ "flex flex-col gap-2 text-sm opacity-80 md:flex-row md:items-center md:gap-4",
1621
+ copyrightClassName
1622
+ ),
1623
+ children: [
1624
+ /* @__PURE__ */ jsxRuntime.jsx(FooterCopyright, { copyright }),
1625
+ /* @__PURE__ */ jsxRuntime.jsx(
1626
+ BrandAttribution,
1627
+ {
1628
+ internalBrandSlug: "open_site_ai",
1629
+ optionIndex: 3,
1630
+ variant: "span",
1631
+ linkClassName: "hover:opacity-100"
1632
+ }
1633
+ )
1634
+ ]
1635
+ }
1636
+ ),
1637
+ bottomLinks && bottomLinks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-4", bottomLinksClassName), children: bottomLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(
1638
+ Pressable,
1639
+ {
1640
+ href: link.url,
1641
+ className: "text-sm opacity-80 transition-colors hover:opacity-100",
1642
+ children: link.text
1643
+ },
1644
+ idx
1645
+ )) })
1646
+ ]
1468
1647
  }
1469
1648
  )
1470
- ] }),
1471
- bottomLinks && bottomLinks.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("flex gap-4", bottomLinksClassName), children: bottomLinks.map((link, idx) => /* @__PURE__ */ jsxRuntime.jsx(
1472
- Pressable,
1473
- {
1474
- href: link.url,
1475
- className: "text-sm opacity-80 transition-colors hover:opacity-100",
1476
- children: link.text
1477
- },
1478
- idx
1479
- )) })
1480
- ] })
1481
- ] })
1649
+ ]
1650
+ }
1651
+ )
1482
1652
  }
1483
1653
  );
1484
1654
  }
@@ -78,6 +78,10 @@ interface FooterBackgroundCardProps {
78
78
  copyright?: string;
79
79
  /** Bottom links */
80
80
  bottomLinks?: FooterBackgroundCardLink[];
81
+ /** Additional CSS classes for the logo wrapper */
82
+ logoWrapperClassName?: string;
83
+ /** Additional CSS classes for the logo image */
84
+ logoClassName?: string;
81
85
  /** Additional CSS classes for the section wrapper */
82
86
  className?: string;
83
87
  /** Additional CSS classes for the card wrapper */
@@ -114,6 +118,10 @@ interface FooterBackgroundCardProps {
114
118
  bottomLinksClassName?: string;
115
119
  /** Section background variant */
116
120
  background?: SectionBackground;
121
+ /**
122
+ * Additional CSS classes for the container
123
+ */
124
+ containerClassName?: string;
117
125
  /** Section spacing variant */
118
126
  spacing?: SectionSpacing;
119
127
  /** Optional background pattern */
@@ -131,6 +139,6 @@ interface FooterBackgroundCardProps {
131
139
  * creative professionals, agencies, portfolios, and businesses that want a visually
132
140
  * striking footer with a personal touch.
133
141
  */
134
- declare function FooterBackgroundCard({ logo, backgroundImage, profileImage, tagline, personalMessage, ctaText, ctaUrl, contactTitle, contact, menuItems, copyright, bottomLinks, className, cardClassName, gridClassName, profileSectionClassName, profileImageClassName, taglineClassName, messageClassName, ctaClassName, menuSectionClassName, menuTitleClassName, menuLinkClassName, contactSectionClassName, contactTitleClassName, contactItemClassName, bottomClassName, copyrightClassName, bottomLinksClassName, background, spacing, pattern, patternOpacity, optixFlowConfig, }: FooterBackgroundCardProps): React.JSX.Element;
142
+ declare function FooterBackgroundCard({ logo, backgroundImage, profileImage, tagline, personalMessage, ctaText, ctaUrl, contactTitle, contact, menuItems, copyright, bottomLinks, logoWrapperClassName, logoClassName, className, cardClassName, gridClassName, profileSectionClassName, profileImageClassName, taglineClassName, messageClassName, ctaClassName, menuSectionClassName, menuTitleClassName, menuLinkClassName, contactSectionClassName, contactTitleClassName, contactItemClassName, bottomClassName, copyrightClassName, bottomLinksClassName, background, containerClassName, spacing, pattern, patternOpacity, optixFlowConfig, }: FooterBackgroundCardProps): React.JSX.Element;
135
143
 
136
144
  export { FooterBackgroundCard, type FooterBackgroundCardContact, type FooterBackgroundCardMenuItem, type FooterBackgroundCardProps };
@@ -78,6 +78,10 @@ interface FooterBackgroundCardProps {
78
78
  copyright?: string;
79
79
  /** Bottom links */
80
80
  bottomLinks?: FooterBackgroundCardLink[];
81
+ /** Additional CSS classes for the logo wrapper */
82
+ logoWrapperClassName?: string;
83
+ /** Additional CSS classes for the logo image */
84
+ logoClassName?: string;
81
85
  /** Additional CSS classes for the section wrapper */
82
86
  className?: string;
83
87
  /** Additional CSS classes for the card wrapper */
@@ -114,6 +118,10 @@ interface FooterBackgroundCardProps {
114
118
  bottomLinksClassName?: string;
115
119
  /** Section background variant */
116
120
  background?: SectionBackground;
121
+ /**
122
+ * Additional CSS classes for the container
123
+ */
124
+ containerClassName?: string;
117
125
  /** Section spacing variant */
118
126
  spacing?: SectionSpacing;
119
127
  /** Optional background pattern */
@@ -131,6 +139,6 @@ interface FooterBackgroundCardProps {
131
139
  * creative professionals, agencies, portfolios, and businesses that want a visually
132
140
  * striking footer with a personal touch.
133
141
  */
134
- declare function FooterBackgroundCard({ logo, backgroundImage, profileImage, tagline, personalMessage, ctaText, ctaUrl, contactTitle, contact, menuItems, copyright, bottomLinks, className, cardClassName, gridClassName, profileSectionClassName, profileImageClassName, taglineClassName, messageClassName, ctaClassName, menuSectionClassName, menuTitleClassName, menuLinkClassName, contactSectionClassName, contactTitleClassName, contactItemClassName, bottomClassName, copyrightClassName, bottomLinksClassName, background, spacing, pattern, patternOpacity, optixFlowConfig, }: FooterBackgroundCardProps): React.JSX.Element;
142
+ declare function FooterBackgroundCard({ logo, backgroundImage, profileImage, tagline, personalMessage, ctaText, ctaUrl, contactTitle, contact, menuItems, copyright, bottomLinks, logoWrapperClassName, logoClassName, className, cardClassName, gridClassName, profileSectionClassName, profileImageClassName, taglineClassName, messageClassName, ctaClassName, menuSectionClassName, menuTitleClassName, menuLinkClassName, contactSectionClassName, contactTitleClassName, contactItemClassName, bottomClassName, copyrightClassName, bottomLinksClassName, background, containerClassName, spacing, pattern, patternOpacity, optixFlowConfig, }: FooterBackgroundCardProps): React.JSX.Element;
135
143
 
136
144
  export { FooterBackgroundCard, type FooterBackgroundCardContact, type FooterBackgroundCardMenuItem, type FooterBackgroundCardProps };