@opensite/ui 1.0.9 → 1.1.0

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.
Files changed (41) hide show
  1. package/dist/navbar-animated-preview.cjs +27 -17
  2. package/dist/navbar-animated-preview.js +27 -17
  3. package/dist/navbar-centered-menu.cjs +20 -10
  4. package/dist/navbar-centered-menu.js +20 -10
  5. package/dist/navbar-dark-icons.cjs +20 -10
  6. package/dist/navbar-dark-icons.js +20 -10
  7. package/dist/navbar-dropdown-menu.cjs +20 -10
  8. package/dist/navbar-dropdown-menu.js +20 -10
  9. package/dist/navbar-education-platform.cjs +81 -56
  10. package/dist/navbar-education-platform.js +81 -56
  11. package/dist/navbar-enterprise-mega.cjs +21 -11
  12. package/dist/navbar-enterprise-mega.js +21 -11
  13. package/dist/navbar-feature-grid.cjs +20 -10
  14. package/dist/navbar-feature-grid.js +20 -10
  15. package/dist/navbar-icon-links.cjs +20 -10
  16. package/dist/navbar-icon-links.js +20 -10
  17. package/dist/navbar-image-preview.cjs +20 -10
  18. package/dist/navbar-image-preview.js +20 -10
  19. package/dist/navbar-mega-menu.cjs +20 -10
  20. package/dist/navbar-mega-menu.js +20 -10
  21. package/dist/navbar-multi-column-groups.cjs +52 -35
  22. package/dist/navbar-multi-column-groups.js +52 -35
  23. package/dist/navbar-platform-resources.cjs +20 -10
  24. package/dist/navbar-platform-resources.js +20 -10
  25. package/dist/navbar-search-focused.cjs +20 -10
  26. package/dist/navbar-search-focused.js +20 -10
  27. package/dist/navbar-sidebar-mobile.cjs +21 -10
  28. package/dist/navbar-sidebar-mobile.js +21 -10
  29. package/dist/navbar-simple-links.cjs +22 -12
  30. package/dist/navbar-simple-links.js +22 -12
  31. package/dist/navbar-split-cta.cjs +20 -10
  32. package/dist/navbar-split-cta.js +20 -10
  33. package/dist/navbar-sticky-compact.cjs +240 -123
  34. package/dist/navbar-sticky-compact.js +239 -123
  35. package/dist/navbar-tabbed-sections.cjs +20 -10
  36. package/dist/navbar-tabbed-sections.js +20 -10
  37. package/dist/navbar-transparent-overlay.cjs +21 -10
  38. package/dist/navbar-transparent-overlay.js +21 -10
  39. package/dist/registry.cjs +285 -206
  40. package/dist/registry.js +285 -206
  41. package/package.json +1 -1
@@ -7,6 +7,7 @@ var tailwindMerge = require('tailwind-merge');
7
7
  var classVarianceAuthority = require('class-variance-authority');
8
8
  var jsxRuntime = require('react/jsx-runtime');
9
9
  var img = require('@page-speed/img');
10
+ var AccordionPrimitive = require('@radix-ui/react-accordion');
10
11
  var NavigationMenuPrimitive = require('@radix-ui/react-navigation-menu');
11
12
 
12
13
  function _interopNamespace(e) {
@@ -28,6 +29,7 @@ function _interopNamespace(e) {
28
29
  }
29
30
 
30
31
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
+ var AccordionPrimitive__namespace = /*#__PURE__*/_interopNamespace(AccordionPrimitive);
31
33
  var NavigationMenuPrimitive__namespace = /*#__PURE__*/_interopNamespace(NavigationMenuPrimitive);
32
34
 
33
35
  // components/blocks/navbars/navbar-sticky-compact.tsx
@@ -992,6 +994,66 @@ var NavbarLogo = ({
992
994
  }
993
995
  );
994
996
  };
997
+ function Accordion({
998
+ ...props
999
+ }) {
1000
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Root, { "data-slot": "accordion", ...props });
1001
+ }
1002
+ function AccordionItem({
1003
+ className,
1004
+ ...props
1005
+ }) {
1006
+ return /* @__PURE__ */ jsxRuntime.jsx(
1007
+ AccordionPrimitive__namespace.Item,
1008
+ {
1009
+ "data-slot": "accordion-item",
1010
+ className: cn("border-b ", className),
1011
+ ...props
1012
+ }
1013
+ );
1014
+ }
1015
+ function AccordionTrigger({
1016
+ className,
1017
+ children,
1018
+ ...props
1019
+ }) {
1020
+ return /* @__PURE__ */ jsxRuntime.jsx(AccordionPrimitive__namespace.Header, { className: "flex", children: /* @__PURE__ */ jsxRuntime.jsxs(
1021
+ AccordionPrimitive__namespace.Trigger,
1022
+ {
1023
+ "data-slot": "accordion-trigger",
1024
+ className: cn(
1025
+ "focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-center justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
1026
+ className
1027
+ ),
1028
+ ...props,
1029
+ children: [
1030
+ children,
1031
+ /* @__PURE__ */ jsxRuntime.jsx(
1032
+ DynamicIcon,
1033
+ {
1034
+ name: "lucide/chevron-down",
1035
+ className: "text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200"
1036
+ }
1037
+ )
1038
+ ]
1039
+ }
1040
+ ) });
1041
+ }
1042
+ function AccordionContent({
1043
+ className,
1044
+ children,
1045
+ ...props
1046
+ }) {
1047
+ return /* @__PURE__ */ jsxRuntime.jsx(
1048
+ AccordionPrimitive__namespace.Content,
1049
+ {
1050
+ "data-slot": "accordion-content",
1051
+ className: "data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm",
1052
+ ...props,
1053
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: cn("pt-0 pb-4", className), children })
1054
+ }
1055
+ );
1056
+ }
995
1057
  function NavigationMenu({
996
1058
  className,
997
1059
  children,
@@ -1136,6 +1198,7 @@ var NavbarMobileMenu = ({
1136
1198
  children,
1137
1199
  className,
1138
1200
  contentClassName,
1201
+ closeContainerClassName = "",
1139
1202
  title = "Mobile Navigation"
1140
1203
  }) => {
1141
1204
  React__namespace.useEffect(() => {
@@ -1160,18 +1223,27 @@ var NavbarMobileMenu = ({
1160
1223
  "data-state": open ? "open" : "closed",
1161
1224
  children: [
1162
1225
  /* @__PURE__ */ jsxRuntime.jsx("div", { className: "sr-only", children: /* @__PURE__ */ jsxRuntime.jsx("h2", { children: title }) }),
1163
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "absolute top-0 left-0 right-0 p-4 bg-background flex justify-end items-center z-10 w-screen", children: /* @__PURE__ */ jsxRuntime.jsxs(
1164
- "button",
1226
+ /* @__PURE__ */ jsxRuntime.jsx(
1227
+ "div",
1165
1228
  {
1166
- onClick: onClose,
1167
- className: "flex size-10 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",
1168
- "aria-label": "Close mobile menu",
1169
- children: [
1170
- /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", className: "size-4" }),
1171
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Close" })
1172
- ]
1229
+ className: cn(
1230
+ closeContainerClassName,
1231
+ "absolute top-0 left-0 right-0 p-4 bg-background flex justify-end items-center z-10 w-screen"
1232
+ ),
1233
+ children: /* @__PURE__ */ jsxRuntime.jsxs(
1234
+ "button",
1235
+ {
1236
+ onClick: onClose,
1237
+ className: "flex size-10 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none",
1238
+ "aria-label": "Close mobile menu",
1239
+ children: [
1240
+ /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: "lucide/x", className: "size-4" }),
1241
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Close" })
1242
+ ]
1243
+ }
1244
+ )
1173
1245
  }
1174
- ) }),
1246
+ ),
1175
1247
  /* @__PURE__ */ jsxRuntime.jsx(
1176
1248
  "div",
1177
1249
  {
@@ -1321,37 +1393,6 @@ var NavbarStickyCompact = ({
1321
1393
  ) }, index)
1322
1394
  );
1323
1395
  }, [menuSlot, menu, isScrolled]);
1324
- const renderMobileMenu = React.useMemo(() => {
1325
- if (menuSlot) return menuSlot;
1326
- if (!menu || menu.length === 0) return null;
1327
- return menu.map(
1328
- (item, index) => item.items ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
1329
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-sm font-medium text-muted-foreground", children: item.title }),
1330
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-col gap-1 pl-2", children: item.items.map((subItem, subIndex) => /* @__PURE__ */ jsxRuntime.jsxs(
1331
- Pressable,
1332
- {
1333
- href: subItem.url,
1334
- className: "flex items-center gap-2 rounded-md py-2 text-sm hover:text-foreground",
1335
- onClick: () => setIsOpen(false),
1336
- children: [
1337
- subItem.icon && /* @__PURE__ */ jsxRuntime.jsx(DynamicIcon, { name: subItem.icon, size: 14 }),
1338
- subItem.title
1339
- ]
1340
- },
1341
- subIndex
1342
- )) })
1343
- ] }, index) : /* @__PURE__ */ jsxRuntime.jsx(
1344
- Pressable,
1345
- {
1346
- href: item.url,
1347
- className: "text-sm font-medium",
1348
- onClick: () => setIsOpen(false),
1349
- children: item.title
1350
- },
1351
- index
1352
- )
1353
- );
1354
- }, [menuSlot, menu]);
1355
1396
  const {
1356
1397
  sectionClasses,
1357
1398
  containerWrapperClasses,
@@ -1361,99 +1402,175 @@ var NavbarStickyCompact = ({
1361
1402
  sectionContainerMaxWidth,
1362
1403
  spacingOverride
1363
1404
  } = getNavbarLayoutClasses(layoutVariant, { className, containerClassName });
1364
- return /* @__PURE__ */ jsxRuntime.jsx(
1365
- Section,
1366
- {
1367
- background,
1368
- spacing: spacingOverride ?? spacing,
1369
- className: cn(
1370
- sectionClasses,
1371
- "fixed top-0 left-0 z-50 w-full bg-background/95 backdrop-blur-sm transition-all duration-300",
1372
- isScrolled ? "shadow-sm" : ""
1373
- ),
1374
- pattern,
1375
- patternOpacity,
1376
- containerClassName: sectionContainerClassName,
1377
- containerMaxWidth: sectionContainerMaxWidth,
1378
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: containerWrapperClasses, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: navWrapperClasses, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: innerContainerClasses, children: /* @__PURE__ */ jsxRuntime.jsxs(
1379
- "nav",
1405
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1406
+ /* @__PURE__ */ jsxRuntime.jsx(
1407
+ Section,
1408
+ {
1409
+ background,
1410
+ spacing: spacingOverride ?? spacing,
1411
+ className: cn(
1412
+ sectionClasses,
1413
+ "fixed top-0 left-0 z-50 w-full bg-background/95 backdrop-blur-sm transition-all duration-300",
1414
+ isScrolled ? "shadow-sm" : ""
1415
+ ),
1416
+ pattern,
1417
+ patternOpacity,
1418
+ containerClassName: sectionContainerClassName,
1419
+ containerMaxWidth: sectionContainerMaxWidth,
1420
+ children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: containerWrapperClasses, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: navWrapperClasses, children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: innerContainerClasses, children: /* @__PURE__ */ jsxRuntime.jsxs(
1421
+ "nav",
1422
+ {
1423
+ className: cn(
1424
+ "flex items-center justify-between transition-all duration-300",
1425
+ isScrolled ? "h-14" : "h-16",
1426
+ navClassName
1427
+ ),
1428
+ children: [
1429
+ /* @__PURE__ */ jsxRuntime.jsx(
1430
+ NavbarLogo,
1431
+ {
1432
+ logo,
1433
+ logoSlot,
1434
+ logoClassName: cn(
1435
+ isScrolled ? "[&_img]:h-6 [&_span]:text-base" : "[&_img]:h-8 [&_span]:text-lg",
1436
+ "[&_img]:transition-all [&_img]:duration-300 [&_span]:transition-all [&_span]:duration-300",
1437
+ logoClassName
1438
+ ),
1439
+ optixFlowConfig
1440
+ }
1441
+ ),
1442
+ /* @__PURE__ */ jsxRuntime.jsx(NavigationMenu, { className: "hidden lg:flex", viewport: false, children: /* @__PURE__ */ jsxRuntime.jsx(NavigationMenuList, { children: renderMenu }) }),
1443
+ /* @__PURE__ */ jsxRuntime.jsx(
1444
+ "div",
1445
+ {
1446
+ className: cn(
1447
+ "hidden items-center gap-2 lg:flex",
1448
+ actionsClassName
1449
+ ),
1450
+ children: renderAuthActions
1451
+ }
1452
+ ),
1453
+ /* @__PURE__ */ jsxRuntime.jsxs(
1454
+ Pressable,
1455
+ {
1456
+ variant: "ghost",
1457
+ size: isScrolled ? "sm" : "icon",
1458
+ asButton: true,
1459
+ className: "lg:hidden transition-all duration-300",
1460
+ onClick: () => setIsOpen(!isOpen),
1461
+ children: [
1462
+ /* @__PURE__ */ jsxRuntime.jsx(
1463
+ DynamicIcon,
1464
+ {
1465
+ name: "lucide/menu",
1466
+ size: isScrolled ? 18 : 20
1467
+ }
1468
+ ),
1469
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Toggle menu" })
1470
+ ]
1471
+ }
1472
+ )
1473
+ ]
1474
+ }
1475
+ ) }) }) })
1476
+ }
1477
+ ),
1478
+ /* @__PURE__ */ jsxRuntime.jsx(
1479
+ MobileNavigationMenu,
1480
+ {
1481
+ open: isOpen,
1482
+ setOpen: setIsOpen,
1483
+ menu: menu ?? [],
1484
+ menuSlot,
1485
+ authActions,
1486
+ authActionsSlot
1487
+ }
1488
+ )
1489
+ ] });
1490
+ };
1491
+ var MobileNavigationMenu = ({
1492
+ open,
1493
+ setOpen,
1494
+ menu,
1495
+ menuSlot,
1496
+ authActions,
1497
+ authActionsSlot
1498
+ }) => {
1499
+ const handleClose = () => setOpen(false);
1500
+ const renderMobileAuthActions = React.useMemo(() => {
1501
+ if (authActionsSlot) return authActionsSlot;
1502
+ if (!authActions || authActions.length === 0) return null;
1503
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-6 flex flex-col gap-4", children: authActions.map((action, index) => {
1504
+ const {
1505
+ label,
1506
+ icon,
1507
+ iconAfter,
1508
+ children,
1509
+ className: actionClassName,
1510
+ ...pressableProps
1511
+ } = action;
1512
+ return /* @__PURE__ */ jsxRuntime.jsx(
1513
+ Pressable,
1380
1514
  {
1381
- className: cn(
1382
- "flex items-center justify-between transition-all duration-300",
1383
- isScrolled ? "h-14" : "h-16",
1384
- navClassName
1385
- ),
1515
+ asButton: true,
1516
+ className: cn("w-full", actionClassName),
1517
+ onClick: handleClose,
1518
+ ...pressableProps,
1519
+ children: children ?? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
1520
+ icon,
1521
+ label,
1522
+ iconAfter
1523
+ ] })
1524
+ },
1525
+ index
1526
+ );
1527
+ }) });
1528
+ }, [authActionsSlot, authActions]);
1529
+ return /* @__PURE__ */ jsxRuntime.jsx(NavbarMobileMenu, { open, onClose: handleClose, title: "Navigation Menu", children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-screen-sm mx-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-6", children: [
1530
+ /* @__PURE__ */ jsxRuntime.jsx(Accordion, { type: "multiple", className: "w-full", children: menuSlot ? menuSlot : menu.map(
1531
+ (item, index) => item.items ? /* @__PURE__ */ jsxRuntime.jsxs(
1532
+ AccordionItem,
1533
+ {
1534
+ value: `nav-${index}`,
1535
+ className: "border-b-0",
1386
1536
  children: [
1387
- /* @__PURE__ */ jsxRuntime.jsx(
1388
- NavbarLogo,
1389
- {
1390
- logo,
1391
- logoSlot,
1392
- logoClassName: cn(
1393
- isScrolled ? "[&_img]:h-6 [&_span]:text-base" : "[&_img]:h-8 [&_span]:text-lg",
1394
- "[&_img]:transition-all [&_img]:duration-300 [&_span]:transition-all [&_span]:duration-300",
1395
- logoClassName
1396
- ),
1397
- optixFlowConfig
1398
- }
1399
- ),
1400
- /* @__PURE__ */ jsxRuntime.jsx(NavigationMenu, { className: "hidden lg:flex", children: /* @__PURE__ */ jsxRuntime.jsx(NavigationMenuList, { children: renderMenu }) }),
1401
- /* @__PURE__ */ jsxRuntime.jsx(
1402
- "div",
1403
- {
1404
- className: cn(
1405
- "hidden items-center gap-2 lg:flex",
1406
- actionsClassName
1407
- ),
1408
- children: renderAuthActions
1409
- }
1410
- ),
1411
- /* @__PURE__ */ jsxRuntime.jsxs(
1537
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionTrigger, { className: "h-15 items-center p-0 px-4! text-base leading-[3.75] font-normal text-muted-foreground hover:bg-muted hover:no-underline", children: item.title }),
1538
+ /* @__PURE__ */ jsxRuntime.jsx(AccordionContent, { className: "overflow-x-none", children: item.items.map((subItem, subIndex) => /* @__PURE__ */ jsxRuntime.jsxs(
1412
1539
  Pressable,
1413
1540
  {
1414
- variant: "ghost",
1415
- size: isScrolled ? "sm" : "icon",
1416
- asButton: true,
1417
- className: "lg:hidden transition-all duration-300",
1418
- onClick: () => setIsOpen(!isOpen),
1541
+ href: subItem.url,
1542
+ className: "flex min-h-12 items-center gap-2 rounded-lg px-4 text-muted-foreground transition-colors duration-300 hover:bg-muted hover:text-foreground",
1543
+ onClick: handleClose,
1419
1544
  children: [
1420
- /* @__PURE__ */ jsxRuntime.jsx(
1545
+ subItem.icon && /* @__PURE__ */ jsxRuntime.jsx(
1421
1546
  DynamicIcon,
1422
1547
  {
1423
- name: "lucide/menu",
1424
- size: isScrolled ? 18 : 20
1548
+ name: subItem.icon,
1549
+ size: 16,
1550
+ className: "stroke-muted-foreground"
1425
1551
  }
1426
1552
  ),
1427
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: "Toggle menu" })
1553
+ subItem.title
1428
1554
  ]
1429
- }
1430
- ),
1431
- /* @__PURE__ */ jsxRuntime.jsx(
1432
- NavbarMobileMenu,
1433
- {
1434
- open: isOpen,
1435
- onClose: () => setIsOpen(false),
1436
- title: "Navigation Menu",
1437
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-screen-sm mx-auto", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-4", children: [
1438
- renderMobileMenu,
1439
- /* @__PURE__ */ jsxRuntime.jsx(
1440
- "div",
1441
- {
1442
- className: cn(
1443
- "mt-4 flex flex-col gap-2 border-t pt-4",
1444
- actionsClassName
1445
- ),
1446
- children: renderAuthActions
1447
- }
1448
- )
1449
- ] }) })
1450
- }
1451
- )
1555
+ },
1556
+ `mobile-link-${index}-${subIndex}`
1557
+ )) })
1452
1558
  ]
1453
- }
1454
- ) }) }) })
1455
- }
1456
- );
1559
+ },
1560
+ `nav-item-${index}`
1561
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
1562
+ Pressable,
1563
+ {
1564
+ href: item.url,
1565
+ className: "flex h-15 items-center rounded-md p-0 px-4 text-left text-base leading-[3.75] font-normal text-muted-foreground ring-ring/10 outline-ring/50 transition-all hover:bg-muted focus-visible:ring-4 focus-visible:outline-1",
1566
+ onClick: handleClose,
1567
+ children: item.title
1568
+ },
1569
+ `nav-link-${index}`
1570
+ )
1571
+ ) }),
1572
+ renderMobileAuthActions
1573
+ ] }) }) });
1457
1574
  };
1458
1575
 
1459
1576
  exports.NavbarStickyCompact = NavbarStickyCompact;