@retinalabsllc/zairusjs 0.9.8 → 1.0.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.
package/dist/index.d.mts CHANGED
@@ -447,6 +447,7 @@ interface GifFeatureCardProps {
447
447
  }
448
448
  declare const GifFeatureCard: React.FC<GifFeatureCardProps>;
449
449
 
450
+ type AppTypeKey = 'docx' | 'sheets' | 'mail' | 'calendar' | 'drive' | 'audditur' | 'desktop' | 'admin' | 'unknown';
450
451
  interface NavItem {
451
452
  name: string;
452
453
  path: string;
@@ -458,18 +459,13 @@ interface WorkspaceItem {
458
459
  role: string;
459
460
  }
460
461
  interface UniversalSidebarProps {
461
- /** Navigation items to render */
462
462
  navItems: NavItem[];
463
- /** The current active path to determine highlight state */
464
463
  currentPath: string;
465
- /** Mobile drawer state */
466
464
  isMobileOpen: boolean;
467
- /** Function to close the mobile drawer */
468
465
  closeMobile: () => void;
469
- /** Function to open the mobile drawer (used by the floating mobile button) */
470
466
  openMobile: () => void;
471
- /** Optional click interceptor (useful for unsaved changes warnings) */
472
467
  onNavClick?: (e: React.MouseEvent<HTMLAnchorElement>, path: string) => void;
468
+ currentAppType?: AppTypeKey;
473
469
  title?: string;
474
470
  subtitle?: string;
475
471
  homeUrl?: string;
@@ -1004,4 +1000,4 @@ interface ContentGridBlockProps {
1004
1000
  }
1005
1001
  declare const ContentGridBlock: React.FC<ContentGridBlockProps>;
1006
1002
 
1007
- export { AITranscriptionFeature, type AITranscriptionFeatureProps, type AgentFilePayload, type AgentStat, AiApproveDecline, type AiApproveDeclineProps, AiStageCheck, type AiStageCheckProps, type AiTask, type AiTaskStatus, AppBento2, type AppBento2Props, Banner, type BannerProps, type BentoFeature, type BoardMember, type CompanyDetails, type CompanyMember, type ConsultantProfile, ConsultantShowcase, type ConsultantShowcaseProps, ContentGridBlock, type ContentGridBlockProps, type DashboardList, type DashboardListItem, type DashboardStat, type DocumentSectionData, type EmailContact, Faq, type FaqItem, type FaqProps, FeatureScroll, type FeatureScrollProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GifFeatureCard, type GifFeatureCardProps, Header, type HeaderLink, type HeaderProps, type AppLogo$1 as HeroAppLogo, HeroSection, type HeroSectionProps, ManagedBoardBlock, type ManagedBoardBlockProps, ManagedContactBlock, type ManagedContactBlockProps, ManagedDocument, type ManagedDocumentProps, ManagedNewsletterSplitBlock, type ManagedNewsletterSplitBlockProps, ManagedNotFoundBlock, type ManagedNotFoundBlockProps, ManagedPricingBlock, type ManagedPricingBlockProps, ManagedProjectsBlock, type ManagedProjectsBlockProps, ManagedToaster, MedicalFeatureStatsBlock, type NavItem, NumberInput, type NumberInputProps, type OverviewAlert, type OverviewStat, PageSpinner, type PageSpinnerProps, type PlatformFeatureItem, PlatformFeatures, type PlatformFeaturesProps, PortfolioHero, type PortfolioHeroProps, type AppLogo as PricingAppLogo, type PricingFeature, type PricingPlan, ProductHero, type ProductHeroProps, type ProjectItem, type ScrollFeature, type SearchTypeOption, type SocialContact, type SocialLink, Stagger, type StaggerProps, type StatItem, TextInput, type TextInputProps, ThreeDActionButton, type ThreeDActionButtonProps, ThreeDButton, type ThreeDButtonProps, UniversalAgentConsole, type UniversalAgentConsoleProps, UniversalBillingPage, type UniversalBillingPageProps, UniversalDashboardPage, type UniversalDashboardPageProps, UniversalDeveloperSettings, type UniversalDeveloperSettingsProps, UniversalDirectoryPage, type UniversalDirectoryPageProps, UniversalErrorView, type UniversalErrorViewProps, UniversalIdentityPage, type UniversalIdentityPageProps, type UniversalInvoice, UniversalLookupPage, type UniversalLookupPageProps, type UniversalMember, UniversalMembersPage, type UniversalMembersPageProps, UniversalOrganizationPage, type UniversalOrganizationPageProps, UniversalOverviewPage, type UniversalOverviewPageProps, UniversalProfileSettings, type UniversalProfileSettingsProps, UniversalRegistrationFlow, type UniversalRegistrationFlowProps, UniversalSidebar, type UniversalSidebarProps, type WorkspaceItem, ZairusAuth, type ZairusAuthProps };
1003
+ export { AITranscriptionFeature, type AITranscriptionFeatureProps, type AgentFilePayload, type AgentStat, AiApproveDecline, type AiApproveDeclineProps, AiStageCheck, type AiStageCheckProps, type AiTask, type AiTaskStatus, AppBento2, type AppBento2Props, type AppTypeKey, Banner, type BannerProps, type BentoFeature, type BoardMember, type CompanyDetails, type CompanyMember, type ConsultantProfile, ConsultantShowcase, type ConsultantShowcaseProps, ContentGridBlock, type ContentGridBlockProps, type DashboardList, type DashboardListItem, type DashboardStat, type DocumentSectionData, type EmailContact, Faq, type FaqItem, type FaqProps, FeatureScroll, type FeatureScrollProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GifFeatureCard, type GifFeatureCardProps, Header, type HeaderLink, type HeaderProps, type AppLogo$1 as HeroAppLogo, HeroSection, type HeroSectionProps, ManagedBoardBlock, type ManagedBoardBlockProps, ManagedContactBlock, type ManagedContactBlockProps, ManagedDocument, type ManagedDocumentProps, ManagedNewsletterSplitBlock, type ManagedNewsletterSplitBlockProps, ManagedNotFoundBlock, type ManagedNotFoundBlockProps, ManagedPricingBlock, type ManagedPricingBlockProps, ManagedProjectsBlock, type ManagedProjectsBlockProps, ManagedToaster, MedicalFeatureStatsBlock, type NavItem, NumberInput, type NumberInputProps, type OverviewAlert, type OverviewStat, PageSpinner, type PageSpinnerProps, type PlatformFeatureItem, PlatformFeatures, type PlatformFeaturesProps, PortfolioHero, type PortfolioHeroProps, type AppLogo as PricingAppLogo, type PricingFeature, type PricingPlan, ProductHero, type ProductHeroProps, type ProjectItem, type ScrollFeature, type SearchTypeOption, type SocialContact, type SocialLink, Stagger, type StaggerProps, type StatItem, TextInput, type TextInputProps, ThreeDActionButton, type ThreeDActionButtonProps, ThreeDButton, type ThreeDButtonProps, UniversalAgentConsole, type UniversalAgentConsoleProps, UniversalBillingPage, type UniversalBillingPageProps, UniversalDashboardPage, type UniversalDashboardPageProps, UniversalDeveloperSettings, type UniversalDeveloperSettingsProps, UniversalDirectoryPage, type UniversalDirectoryPageProps, UniversalErrorView, type UniversalErrorViewProps, UniversalIdentityPage, type UniversalIdentityPageProps, type UniversalInvoice, UniversalLookupPage, type UniversalLookupPageProps, type UniversalMember, UniversalMembersPage, type UniversalMembersPageProps, UniversalOrganizationPage, type UniversalOrganizationPageProps, UniversalOverviewPage, type UniversalOverviewPageProps, UniversalProfileSettings, type UniversalProfileSettingsProps, UniversalRegistrationFlow, type UniversalRegistrationFlowProps, UniversalSidebar, type UniversalSidebarProps, type WorkspaceItem, ZairusAuth, type ZairusAuthProps };
package/dist/index.d.ts CHANGED
@@ -447,6 +447,7 @@ interface GifFeatureCardProps {
447
447
  }
448
448
  declare const GifFeatureCard: React.FC<GifFeatureCardProps>;
449
449
 
450
+ type AppTypeKey = 'docx' | 'sheets' | 'mail' | 'calendar' | 'drive' | 'audditur' | 'desktop' | 'admin' | 'unknown';
450
451
  interface NavItem {
451
452
  name: string;
452
453
  path: string;
@@ -458,18 +459,13 @@ interface WorkspaceItem {
458
459
  role: string;
459
460
  }
460
461
  interface UniversalSidebarProps {
461
- /** Navigation items to render */
462
462
  navItems: NavItem[];
463
- /** The current active path to determine highlight state */
464
463
  currentPath: string;
465
- /** Mobile drawer state */
466
464
  isMobileOpen: boolean;
467
- /** Function to close the mobile drawer */
468
465
  closeMobile: () => void;
469
- /** Function to open the mobile drawer (used by the floating mobile button) */
470
466
  openMobile: () => void;
471
- /** Optional click interceptor (useful for unsaved changes warnings) */
472
467
  onNavClick?: (e: React.MouseEvent<HTMLAnchorElement>, path: string) => void;
468
+ currentAppType?: AppTypeKey;
473
469
  title?: string;
474
470
  subtitle?: string;
475
471
  homeUrl?: string;
@@ -1004,4 +1000,4 @@ interface ContentGridBlockProps {
1004
1000
  }
1005
1001
  declare const ContentGridBlock: React.FC<ContentGridBlockProps>;
1006
1002
 
1007
- export { AITranscriptionFeature, type AITranscriptionFeatureProps, type AgentFilePayload, type AgentStat, AiApproveDecline, type AiApproveDeclineProps, AiStageCheck, type AiStageCheckProps, type AiTask, type AiTaskStatus, AppBento2, type AppBento2Props, Banner, type BannerProps, type BentoFeature, type BoardMember, type CompanyDetails, type CompanyMember, type ConsultantProfile, ConsultantShowcase, type ConsultantShowcaseProps, ContentGridBlock, type ContentGridBlockProps, type DashboardList, type DashboardListItem, type DashboardStat, type DocumentSectionData, type EmailContact, Faq, type FaqItem, type FaqProps, FeatureScroll, type FeatureScrollProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GifFeatureCard, type GifFeatureCardProps, Header, type HeaderLink, type HeaderProps, type AppLogo$1 as HeroAppLogo, HeroSection, type HeroSectionProps, ManagedBoardBlock, type ManagedBoardBlockProps, ManagedContactBlock, type ManagedContactBlockProps, ManagedDocument, type ManagedDocumentProps, ManagedNewsletterSplitBlock, type ManagedNewsletterSplitBlockProps, ManagedNotFoundBlock, type ManagedNotFoundBlockProps, ManagedPricingBlock, type ManagedPricingBlockProps, ManagedProjectsBlock, type ManagedProjectsBlockProps, ManagedToaster, MedicalFeatureStatsBlock, type NavItem, NumberInput, type NumberInputProps, type OverviewAlert, type OverviewStat, PageSpinner, type PageSpinnerProps, type PlatformFeatureItem, PlatformFeatures, type PlatformFeaturesProps, PortfolioHero, type PortfolioHeroProps, type AppLogo as PricingAppLogo, type PricingFeature, type PricingPlan, ProductHero, type ProductHeroProps, type ProjectItem, type ScrollFeature, type SearchTypeOption, type SocialContact, type SocialLink, Stagger, type StaggerProps, type StatItem, TextInput, type TextInputProps, ThreeDActionButton, type ThreeDActionButtonProps, ThreeDButton, type ThreeDButtonProps, UniversalAgentConsole, type UniversalAgentConsoleProps, UniversalBillingPage, type UniversalBillingPageProps, UniversalDashboardPage, type UniversalDashboardPageProps, UniversalDeveloperSettings, type UniversalDeveloperSettingsProps, UniversalDirectoryPage, type UniversalDirectoryPageProps, UniversalErrorView, type UniversalErrorViewProps, UniversalIdentityPage, type UniversalIdentityPageProps, type UniversalInvoice, UniversalLookupPage, type UniversalLookupPageProps, type UniversalMember, UniversalMembersPage, type UniversalMembersPageProps, UniversalOrganizationPage, type UniversalOrganizationPageProps, UniversalOverviewPage, type UniversalOverviewPageProps, UniversalProfileSettings, type UniversalProfileSettingsProps, UniversalRegistrationFlow, type UniversalRegistrationFlowProps, UniversalSidebar, type UniversalSidebarProps, type WorkspaceItem, ZairusAuth, type ZairusAuthProps };
1003
+ export { AITranscriptionFeature, type AITranscriptionFeatureProps, type AgentFilePayload, type AgentStat, AiApproveDecline, type AiApproveDeclineProps, AiStageCheck, type AiStageCheckProps, type AiTask, type AiTaskStatus, AppBento2, type AppBento2Props, type AppTypeKey, Banner, type BannerProps, type BentoFeature, type BoardMember, type CompanyDetails, type CompanyMember, type ConsultantProfile, ConsultantShowcase, type ConsultantShowcaseProps, ContentGridBlock, type ContentGridBlockProps, type DashboardList, type DashboardListItem, type DashboardStat, type DocumentSectionData, type EmailContact, Faq, type FaqItem, type FaqProps, FeatureScroll, type FeatureScrollProps, Footer, type FooterColumn, type FooterLink, type FooterProps, GifFeatureCard, type GifFeatureCardProps, Header, type HeaderLink, type HeaderProps, type AppLogo$1 as HeroAppLogo, HeroSection, type HeroSectionProps, ManagedBoardBlock, type ManagedBoardBlockProps, ManagedContactBlock, type ManagedContactBlockProps, ManagedDocument, type ManagedDocumentProps, ManagedNewsletterSplitBlock, type ManagedNewsletterSplitBlockProps, ManagedNotFoundBlock, type ManagedNotFoundBlockProps, ManagedPricingBlock, type ManagedPricingBlockProps, ManagedProjectsBlock, type ManagedProjectsBlockProps, ManagedToaster, MedicalFeatureStatsBlock, type NavItem, NumberInput, type NumberInputProps, type OverviewAlert, type OverviewStat, PageSpinner, type PageSpinnerProps, type PlatformFeatureItem, PlatformFeatures, type PlatformFeaturesProps, PortfolioHero, type PortfolioHeroProps, type AppLogo as PricingAppLogo, type PricingFeature, type PricingPlan, ProductHero, type ProductHeroProps, type ProjectItem, type ScrollFeature, type SearchTypeOption, type SocialContact, type SocialLink, Stagger, type StaggerProps, type StatItem, TextInput, type TextInputProps, ThreeDActionButton, type ThreeDActionButtonProps, ThreeDButton, type ThreeDButtonProps, UniversalAgentConsole, type UniversalAgentConsoleProps, UniversalBillingPage, type UniversalBillingPageProps, UniversalDashboardPage, type UniversalDashboardPageProps, UniversalDeveloperSettings, type UniversalDeveloperSettingsProps, UniversalDirectoryPage, type UniversalDirectoryPageProps, UniversalErrorView, type UniversalErrorViewProps, UniversalIdentityPage, type UniversalIdentityPageProps, type UniversalInvoice, UniversalLookupPage, type UniversalLookupPageProps, type UniversalMember, UniversalMembersPage, type UniversalMembersPageProps, UniversalOrganizationPage, type UniversalOrganizationPageProps, UniversalOverviewPage, type UniversalOverviewPageProps, UniversalProfileSettings, type UniversalProfileSettingsProps, UniversalRegistrationFlow, type UniversalRegistrationFlowProps, UniversalSidebar, type UniversalSidebarProps, type WorkspaceItem, ZairusAuth, type ZairusAuthProps };
package/dist/index.js CHANGED
@@ -1701,6 +1701,15 @@ var import_link9 = __toESM(require("next/link"));
1701
1701
  var import_react37 = require("@hugeicons/react");
1702
1702
  var import_core_free_icons8 = require("@hugeicons/core-free-icons");
1703
1703
  var ButtonSpinner = () => /* @__PURE__ */ import_react36.default.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ import_react36.default.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ import_react36.default.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
1704
+ var ECOSYSTEM_APPS = [
1705
+ { id: "desktop", name: "Retina Desktop", description: "Unified AI Workspace", iconSrc: "https://retinalabs.company/assets/images/desktop.avif", url: "https://retinadesktop.com/app" },
1706
+ { id: "audditur", name: "Audditur", description: "AI Legal & Compliance", iconSrc: "https://retinalabs.company/assets/images/audditur.avif", url: "https://audditur.retinaapps.com/app" },
1707
+ { id: "docx", name: "Retina Docx", description: "Collaborative Word Processing", iconSrc: "https://retinalabs.company/assets/images/docx.avif", url: "https://docx.retinaapps.com/app" },
1708
+ { id: "sheets", name: "Retina Sheets", description: "Advanced Spreadsheets", iconSrc: "https://retinalabs.company/assets/images/sheets.avif", url: "https://sheets.retinaapps.com/app" },
1709
+ { id: "drive", name: "Retina Drive", description: "Secure Cloud Storage", iconSrc: "https://retinalabs.company/assets/images/drive.avif", url: "https://drive.retinaapps.com/app" },
1710
+ { id: "calendar", name: "Retina Calendar", description: "Smart Scheduling", iconSrc: "https://retinalabs.company/assets/images/calendar.avif", url: "https://calendar.retinaapps.com/app" },
1711
+ { id: "mail", name: "Retina Mail", description: "Encrypted Communications", iconSrc: "https://retinalabs.company/assets/images/mail.avif", url: "https://mail.retinaapps.com/app" }
1712
+ ];
1704
1713
  var UniversalSidebar = ({
1705
1714
  navItems,
1706
1715
  currentPath,
@@ -1708,7 +1717,7 @@ var UniversalSidebar = ({
1708
1717
  closeMobile,
1709
1718
  openMobile,
1710
1719
  onNavClick,
1711
- // Header integrations
1720
+ currentAppType = "unknown",
1712
1721
  title = "App",
1713
1722
  subtitle,
1714
1723
  homeUrl = "/app",
@@ -1720,7 +1729,6 @@ var UniversalSidebar = ({
1720
1729
  onSwitchWorkspace,
1721
1730
  showLogoutAction = false,
1722
1731
  onLogout,
1723
- // Intercept
1724
1732
  showInterceptDialog = false,
1725
1733
  onCancelIntercept,
1726
1734
  onConfirmIntercept,
@@ -1728,6 +1736,7 @@ var UniversalSidebar = ({
1728
1736
  interceptMessage = "Are you sure you want to leave? All unsaved changes will be lost."
1729
1737
  }) => {
1730
1738
  const [isCollapsed, setIsCollapsed] = (0, import_react36.useState)(false);
1739
+ const [showAppSwitcherDialog, setShowAppSwitcherDialog] = (0, import_react36.useState)(false);
1731
1740
  const [showSwitcherDialog, setShowSwitcherDialog] = (0, import_react36.useState)(false);
1732
1741
  const [showLogoutDialog, setShowLogoutDialog] = (0, import_react36.useState)(false);
1733
1742
  const [isLoggingOut, setIsLoggingOut] = (0, import_react36.useState)(false);
@@ -1749,11 +1758,12 @@ var UniversalSidebar = ({
1749
1758
  setShowLogoutDialog(false);
1750
1759
  }
1751
1760
  };
1761
+ const currentAppConfig = ECOSYSTEM_APPS.find((app) => app.id === currentAppType);
1752
1762
  return /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, /* @__PURE__ */ import_react36.default.createElement("div", { className: "md:hidden fixed top-0 left-0 w-full h-16 bg-neutral-100 z-40 flex items-center justify-between px-4" }, /* @__PURE__ */ import_react36.default.createElement(
1753
1763
  "button",
1754
1764
  {
1755
1765
  onClick: openMobile,
1756
- className: `w-10 h-10 bg-white rounded-full flex items-center justify-center text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
1766
+ className: `w-10 h-10 bg-white rounded-full flex items-center justify-center text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
1757
1767
  "aria-label": "Open Menu"
1758
1768
  },
1759
1769
  /* @__PURE__ */ import_react36.default.createElement(import_react37.HugeiconsIcon, { icon: import_core_free_icons8.SidebarLeft01Icon, size: 18 })
@@ -1761,7 +1771,7 @@ var UniversalSidebar = ({
1761
1771
  import_link9.default,
1762
1772
  {
1763
1773
  href: backUrl,
1764
- className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none",
1774
+ className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none",
1765
1775
  "aria-label": "Go Back"
1766
1776
  },
1767
1777
  /* @__PURE__ */ import_react36.default.createElement(import_react37.HugeiconsIcon, { icon: import_core_free_icons8.ArrowLeft01Icon, size: 18 })
@@ -1769,7 +1779,7 @@ var UniversalSidebar = ({
1769
1779
  import_link9.default,
1770
1780
  {
1771
1781
  href: backUrl,
1772
- className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none pointer-events-auto",
1782
+ className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none pointer-events-auto",
1773
1783
  "aria-label": "Go Back"
1774
1784
  },
1775
1785
  /* @__PURE__ */ import_react36.default.createElement(import_react37.HugeiconsIcon, { icon: import_core_free_icons8.ArrowLeft01Icon, size: 18 })
@@ -1789,7 +1799,29 @@ var UniversalSidebar = ({
1789
1799
  ${isCollapsed ? "md:w-16 w-64" : "w-64"}
1790
1800
  `
1791
1801
  },
1792
- /* @__PURE__ */ import_react36.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center min-h-18" : "justify-between"}` }, (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react36.default.createElement(import_link9.default, { href: homeUrl, className: "flex flex-col justify-center outline-none group min-w-0 pr-2" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[13px] text-black leading-none truncate tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none" }, subtitle)), /* @__PURE__ */ import_react36.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(
1802
+ /* @__PURE__ */ import_react36.default.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center min-h-18" : "justify-between"}` }, /* @__PURE__ */ import_react36.default.createElement(
1803
+ "button",
1804
+ {
1805
+ onClick: () => setShowAppSwitcherDialog(true),
1806
+ className: `flex items-center gap-3 outline-none group text-left ${!isCollapsed || isMobileOpen ? "w-full" : ""}`
1807
+ },
1808
+ currentAppConfig ? /* @__PURE__ */ import_react36.default.createElement(
1809
+ "img",
1810
+ {
1811
+ src: currentAppConfig.iconSrc,
1812
+ alt: currentAppConfig.name,
1813
+ className: "w-5 h-5 rounded-md object-contain shrink-0 group-hover:scale-105 transition-transform"
1814
+ }
1815
+ ) : /* @__PURE__ */ import_react36.default.createElement("div", { className: " rounded-md shrink-0 flex items-center justify-center" }),
1816
+ (!isCollapsed || isMobileOpen) && /* @__PURE__ */ import_react36.default.createElement(import_react36.default.Fragment, null, /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex flex-col justify-center min-w-0 pr-2 flex-1" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[13px] text-black leading-none truncate tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none uppercase" }, subtitle)), /* @__PURE__ */ import_react36.default.createElement(
1817
+ import_react37.HugeiconsIcon,
1818
+ {
1819
+ icon: import_core_free_icons8.CircleArrowDown01Icon,
1820
+ size: 14,
1821
+ className: "text-neutral-400 shrink-0 group-hover:text-black transition-colors ml-auto"
1822
+ }
1823
+ ))
1824
+ ), /* @__PURE__ */ import_react36.default.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ import_react36.default.createElement(
1793
1825
  "button",
1794
1826
  {
1795
1827
  onClick: closeMobile,
@@ -1846,7 +1878,39 @@ var UniversalSidebar = ({
1846
1878
  /* @__PURE__ */ import_react36.default.createElement(import_react37.HugeiconsIcon, { icon: import_core_free_icons8.SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
1847
1879
  !isCollapsed && /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-xs" }, "Collapse")
1848
1880
  )))
1849
- ), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react36.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react36.default.createElement(
1881
+ ), showAppSwitcherDialog && /* @__PURE__ */ import_react36.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react36.default.createElement(
1882
+ "div",
1883
+ {
1884
+ className: "absolute inset-0 bg-black/30 transition-opacity",
1885
+ onClick: () => setShowAppSwitcherDialog(false)
1886
+ }
1887
+ ), /* @__PURE__ */ import_react36.default.createElement("div", { className: "relative w-full max-w-85 bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react36.default.createElement("div", { className: "p-5 w-full flex items-center justify-between" }, /* @__PURE__ */ import_react36.default.createElement("div", null, /* @__PURE__ */ import_react36.default.createElement("h3", { className: "text-[15px] text-black tracking-tight font-medium" }, "Retina Apps"), /* @__PURE__ */ import_react36.default.createElement("p", { className: "text-[10px] text-neutral-500 tracking-widest mt-0.5 uppercase" }, "Switch Applications")), /* @__PURE__ */ import_react36.default.createElement(
1888
+ "button",
1889
+ {
1890
+ onClick: () => setShowAppSwitcherDialog(false),
1891
+ className: "w-8 h-8 flex items-center justify-center rounded-full hover:bg-neutral-100 text-neutral-400 transition-colors"
1892
+ },
1893
+ /* @__PURE__ */ import_react36.default.createElement(import_react37.HugeiconsIcon, { icon: import_core_free_icons8.CancelCircleIcon, size: 18 })
1894
+ )), /* @__PURE__ */ import_react36.default.createElement("div", { className: "max-h-[60vh] overflow-y-auto w-full custom-scrollbar p-2" }, ECOSYSTEM_APPS.map((app) => {
1895
+ const isActive = currentAppType === app.id;
1896
+ return /* @__PURE__ */ import_react36.default.createElement(
1897
+ "a",
1898
+ {
1899
+ key: app.id,
1900
+ href: app.url,
1901
+ className: `w-full text-left p-3 flex items-center gap-4 rounded-xl transition-all outline-none ${isActive ? " border border-neutral-200" : "hover:bg-neutral-50 border border-transparent"}`
1902
+ },
1903
+ /* @__PURE__ */ import_react36.default.createElement(
1904
+ "img",
1905
+ {
1906
+ src: app.iconSrc,
1907
+ alt: app.name,
1908
+ className: "w-5 h-5 object-contain shrink-0"
1909
+ }
1910
+ ),
1911
+ /* @__PURE__ */ import_react36.default.createElement("div", { className: "flex flex-col min-w-0 flex-1" }, /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[13px] text-black font-medium tracking-tight truncate" }, app.name), /* @__PURE__ */ import_react36.default.createElement("span", { className: "text-[10px] text-neutral-500 mt-0.5 truncate leading-snug" }, app.description))
1912
+ );
1913
+ })))), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ import_react36.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ import_react36.default.createElement(
1850
1914
  "div",
1851
1915
  {
1852
1916
  className: "absolute inset-0 bg-black/30",
@@ -3125,9 +3189,7 @@ var UniversalDirectoryPage = ({
3125
3189
  headerTitle,
3126
3190
  headerDescription,
3127
3191
  hideSearch = false,
3128
- // Default to false
3129
3192
  headerAction,
3130
- // Capture the action button
3131
3193
  searchPlaceholder = "Search...",
3132
3194
  searchQuery,
3133
3195
  onSearchChange,
@@ -3142,14 +3204,14 @@ var UniversalDirectoryPage = ({
3142
3204
  detailsContent,
3143
3205
  modals
3144
3206
  }) => {
3145
- return /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white" }, /* @__PURE__ */ import_react59.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react59.default.createElement(import_react59.default.Fragment, null, /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-full" }, /* @__PURE__ */ import_react59.default.createElement("h1", { className: " text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react59.default.createElement("p", { className: "text-xs text-neutral-500 mb-6" }, headerDescription), !hideSearch && /* @__PURE__ */ import_react59.default.createElement(
3207
+ return /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white" }, /* @__PURE__ */ import_react59.default.createElement(ManagedToaster, null), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" ? /* @__PURE__ */ import_react59.default.createElement(import_react59.default.Fragment, null, /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-full" }, /* @__PURE__ */ import_react59.default.createElement("h1", { className: " text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ import_react59.default.createElement("p", { className: "text-xs text-neutral-500 mb-6" }, headerDescription), !hideSearch && /* @__PURE__ */ import_react59.default.createElement(
3146
3208
  TextInput,
3147
3209
  {
3148
3210
  placeholder: searchPlaceholder,
3149
3211
  value: searchQuery,
3150
3212
  onChange: onSearchChange
3151
3213
  }
3152
- )), headerAction && /* @__PURE__ */ import_react59.default.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react59.default.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons19.ArrowLeft01Icon, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ import_react59.default.createElement(PageSpinner4, null) : /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ import_react59.default.createElement(import_react59.default.Fragment, null, /* @__PURE__ */ import_react59.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.")) : items.map((item) => /* @__PURE__ */ import_react59.default.createElement(
3214
+ )), headerAction && /* @__PURE__ */ import_react59.default.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ import_react59.default.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons19.ArrowLeft01Icon, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ import_react59.default.createElement(PageSpinner4, null) : /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ import_react59.default.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.") : items.map((item) => /* @__PURE__ */ import_react59.default.createElement(
3153
3215
  "div",
3154
3216
  {
3155
3217
  key: item.id,
@@ -3158,7 +3220,23 @@ var UniversalDirectoryPage = ({
3158
3220
  },
3159
3221
  /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full flex items-center justify-center bg-neutral-100 text-black text-xs" }, item.icon), /* @__PURE__ */ import_react59.default.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ import_react59.default.createElement("div", { className: "text-sm text-black truncate pr-2" }, item.primaryText), /* @__PURE__ */ import_react59.default.createElement("div", { className: "text-xs text-neutral-500 truncate pr-2 mt-0.5" }, item.secondaryText))),
3160
3222
  item.rightBadge && /* @__PURE__ */ import_react59.default.createElement("div", { className: "shrink-0 pl-2" }, /* @__PURE__ */ import_react59.default.createElement("span", { className: `text-[10px] tracking-[0.2em] px-3 py-1 rounded-full whitespace-nowrap uppercase ${item.rightBadgeClass || "text-neutral-500 border border-neutral-200 bg-white"}` }, item.rightBadge))
3161
- ))), totalPages > 1 && /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react59.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react59.default.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons19.ArrowLeft01Icon, size: 14 })), /* @__PURE__ */ import_react59.default.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons19.ArrowRight01Icon, size: 14 })))))), currentView === "details" && detailsContent, modals);
3223
+ ))), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ import_react59.default.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", Math.max(1, totalPages)), /* @__PURE__ */ import_react59.default.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ import_react59.default.createElement(
3224
+ "button",
3225
+ {
3226
+ onClick: () => onPageChange(currentPage - 1),
3227
+ disabled: currentPage <= 1 || isLoading,
3228
+ className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30 transition-all"
3229
+ },
3230
+ /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons19.ArrowLeft01Icon, size: 14 })
3231
+ ), /* @__PURE__ */ import_react59.default.createElement(
3232
+ "button",
3233
+ {
3234
+ onClick: () => onPageChange(currentPage + 1),
3235
+ disabled: currentPage >= totalPages || isLoading,
3236
+ className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30 transition-all"
3237
+ },
3238
+ /* @__PURE__ */ import_react59.default.createElement(import_react60.HugeiconsIcon, { icon: import_core_free_icons19.ArrowRight01Icon, size: 14 })
3239
+ ))))), currentView === "details" && detailsContent, modals);
3162
3240
  };
3163
3241
 
3164
3242
  // src/components/AiApproveDecline.tsx
@@ -3951,12 +4029,12 @@ AUDDITUR_SECRET_KEY="${secKey}"
3951
4029
  className: "min-w-32 w-full sm:w-auto"
3952
4030
  },
3953
4031
  "Save Webhook"
3954
- ))))), isRollModalOpen && !isReadOnly && /* @__PURE__ */ import_react69.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react69.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isGenerating && setIsRollModalOpen(false) }), /* @__PURE__ */ import_react69.default.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react69.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react69.default.createElement("h3", { className: " text-[17px] text-black tracking-tight mb-1" }, "Roll API Keys"), /* @__PURE__ */ import_react69.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to roll your keys? This will permanently invalidate your current secret key and active MCP tokens.")), /* @__PURE__ */ import_react69.default.createElement("div", { className: "w-full flex border-t border-neutral-100" }, /* @__PURE__ */ import_react69.default.createElement(
4032
+ ))))), isRollModalOpen && !isReadOnly && /* @__PURE__ */ import_react69.default.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ import_react69.default.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isGenerating && setIsRollModalOpen(false) }), /* @__PURE__ */ import_react69.default.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ import_react69.default.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ import_react69.default.createElement("h3", { className: " text-[17px] text-black tracking-tight mb-1" }, "Roll API Keys"), /* @__PURE__ */ import_react69.default.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to roll your keys? This will permanently invalidate your current secret key and active MCP tokens.")), /* @__PURE__ */ import_react69.default.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ import_react69.default.createElement(
3955
4033
  "button",
3956
4034
  {
3957
4035
  onClick: () => setIsRollModalOpen(false),
3958
4036
  disabled: isGenerating,
3959
- className: "flex-1 py-3 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none border-r border-neutral-100"
4037
+ className: "flex-1 py-3 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
3960
4038
  },
3961
4039
  "Cancel"
3962
4040
  ), /* @__PURE__ */ import_react69.default.createElement(
package/dist/index.mjs CHANGED
@@ -1625,9 +1625,19 @@ import {
1625
1625
  UserIcon,
1626
1626
  CheckmarkCircle01Icon,
1627
1627
  LogoutCircle02Icon,
1628
- ArrowLeft01Icon as ArrowLeft01Icon2
1628
+ ArrowLeft01Icon as ArrowLeft01Icon2,
1629
+ CircleArrowDown01Icon
1629
1630
  } from "@hugeicons/core-free-icons";
1630
1631
  var ButtonSpinner = () => /* @__PURE__ */ React25.createElement("svg", { className: "animate-spin h-4 w-4 text-neutral-400", xmlns: "http://www.w3.org/2000/svg", fill: "none", viewBox: "0 0 24 24" }, /* @__PURE__ */ React25.createElement("circle", { className: "opacity-25", cx: "12", cy: "12", r: "10", stroke: "currentColor", strokeWidth: "4" }), /* @__PURE__ */ React25.createElement("path", { className: "opacity-75", fill: "currentColor", d: "M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z" }));
1632
+ var ECOSYSTEM_APPS = [
1633
+ { id: "desktop", name: "Retina Desktop", description: "Unified AI Workspace", iconSrc: "https://retinalabs.company/assets/images/desktop.avif", url: "https://retinadesktop.com/app" },
1634
+ { id: "audditur", name: "Audditur", description: "AI Legal & Compliance", iconSrc: "https://retinalabs.company/assets/images/audditur.avif", url: "https://audditur.retinaapps.com/app" },
1635
+ { id: "docx", name: "Retina Docx", description: "Collaborative Word Processing", iconSrc: "https://retinalabs.company/assets/images/docx.avif", url: "https://docx.retinaapps.com/app" },
1636
+ { id: "sheets", name: "Retina Sheets", description: "Advanced Spreadsheets", iconSrc: "https://retinalabs.company/assets/images/sheets.avif", url: "https://sheets.retinaapps.com/app" },
1637
+ { id: "drive", name: "Retina Drive", description: "Secure Cloud Storage", iconSrc: "https://retinalabs.company/assets/images/drive.avif", url: "https://drive.retinaapps.com/app" },
1638
+ { id: "calendar", name: "Retina Calendar", description: "Smart Scheduling", iconSrc: "https://retinalabs.company/assets/images/calendar.avif", url: "https://calendar.retinaapps.com/app" },
1639
+ { id: "mail", name: "Retina Mail", description: "Encrypted Communications", iconSrc: "https://retinalabs.company/assets/images/mail.avif", url: "https://mail.retinaapps.com/app" }
1640
+ ];
1631
1641
  var UniversalSidebar = ({
1632
1642
  navItems,
1633
1643
  currentPath,
@@ -1635,7 +1645,7 @@ var UniversalSidebar = ({
1635
1645
  closeMobile,
1636
1646
  openMobile,
1637
1647
  onNavClick,
1638
- // Header integrations
1648
+ currentAppType = "unknown",
1639
1649
  title = "App",
1640
1650
  subtitle,
1641
1651
  homeUrl = "/app",
@@ -1647,7 +1657,6 @@ var UniversalSidebar = ({
1647
1657
  onSwitchWorkspace,
1648
1658
  showLogoutAction = false,
1649
1659
  onLogout,
1650
- // Intercept
1651
1660
  showInterceptDialog = false,
1652
1661
  onCancelIntercept,
1653
1662
  onConfirmIntercept,
@@ -1655,6 +1664,7 @@ var UniversalSidebar = ({
1655
1664
  interceptMessage = "Are you sure you want to leave? All unsaved changes will be lost."
1656
1665
  }) => {
1657
1666
  const [isCollapsed, setIsCollapsed] = useState13(false);
1667
+ const [showAppSwitcherDialog, setShowAppSwitcherDialog] = useState13(false);
1658
1668
  const [showSwitcherDialog, setShowSwitcherDialog] = useState13(false);
1659
1669
  const [showLogoutDialog, setShowLogoutDialog] = useState13(false);
1660
1670
  const [isLoggingOut, setIsLoggingOut] = useState13(false);
@@ -1676,11 +1686,12 @@ var UniversalSidebar = ({
1676
1686
  setShowLogoutDialog(false);
1677
1687
  }
1678
1688
  };
1689
+ const currentAppConfig = ECOSYSTEM_APPS.find((app) => app.id === currentAppType);
1679
1690
  return /* @__PURE__ */ React25.createElement(React25.Fragment, null, /* @__PURE__ */ React25.createElement("div", { className: "md:hidden fixed top-0 left-0 w-full h-16 bg-neutral-100 z-40 flex items-center justify-between px-4" }, /* @__PURE__ */ React25.createElement(
1680
1691
  "button",
1681
1692
  {
1682
1693
  onClick: openMobile,
1683
- className: `w-10 h-10 bg-white rounded-full flex items-center justify-center text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
1694
+ className: `w-10 h-10 bg-white rounded-full flex items-center justify-center text-black transition-all duration-300 outline-none ${isMobileOpen ? "opacity-0 pointer-events-none scale-90" : "opacity-100 scale-100"}`,
1684
1695
  "aria-label": "Open Menu"
1685
1696
  },
1686
1697
  /* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: SidebarLeft01Icon, size: 18 })
@@ -1688,7 +1699,7 @@ var UniversalSidebar = ({
1688
1699
  Link9,
1689
1700
  {
1690
1701
  href: backUrl,
1691
- className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none",
1702
+ className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none",
1692
1703
  "aria-label": "Go Back"
1693
1704
  },
1694
1705
  /* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: ArrowLeft01Icon2, size: 18 })
@@ -1696,7 +1707,7 @@ var UniversalSidebar = ({
1696
1707
  Link9,
1697
1708
  {
1698
1709
  href: backUrl,
1699
- className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none pointer-events-auto",
1710
+ className: "w-10 h-10 bg-white rounded-full flex items-center justify-center text-black hover:bg-neutral-50 transition-all duration-300 outline-none pointer-events-auto",
1700
1711
  "aria-label": "Go Back"
1701
1712
  },
1702
1713
  /* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: ArrowLeft01Icon2, size: 18 })
@@ -1716,7 +1727,29 @@ var UniversalSidebar = ({
1716
1727
  ${isCollapsed ? "md:w-16 w-64" : "w-64"}
1717
1728
  `
1718
1729
  },
1719
- /* @__PURE__ */ React25.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center min-h-18" : "justify-between"}` }, (!isCollapsed || isMobileOpen) && /* @__PURE__ */ React25.createElement(Link9, { href: homeUrl, className: "flex flex-col justify-center outline-none group min-w-0 pr-2" }, /* @__PURE__ */ React25.createElement("span", { className: "text-[13px] text-black leading-none truncate tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ React25.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none" }, subtitle)), /* @__PURE__ */ React25.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ React25.createElement(
1730
+ /* @__PURE__ */ React25.createElement("div", { className: `flex items-center shrink-0 p-5 ${isCollapsed && !isMobileOpen ? "justify-center min-h-18" : "justify-between"}` }, /* @__PURE__ */ React25.createElement(
1731
+ "button",
1732
+ {
1733
+ onClick: () => setShowAppSwitcherDialog(true),
1734
+ className: `flex items-center gap-3 outline-none group text-left ${!isCollapsed || isMobileOpen ? "w-full" : ""}`
1735
+ },
1736
+ currentAppConfig ? /* @__PURE__ */ React25.createElement(
1737
+ "img",
1738
+ {
1739
+ src: currentAppConfig.iconSrc,
1740
+ alt: currentAppConfig.name,
1741
+ className: "w-5 h-5 rounded-md object-contain shrink-0 group-hover:scale-105 transition-transform"
1742
+ }
1743
+ ) : /* @__PURE__ */ React25.createElement("div", { className: " rounded-md shrink-0 flex items-center justify-center" }),
1744
+ (!isCollapsed || isMobileOpen) && /* @__PURE__ */ React25.createElement(React25.Fragment, null, /* @__PURE__ */ React25.createElement("div", { className: "flex flex-col justify-center min-w-0 pr-2 flex-1" }, /* @__PURE__ */ React25.createElement("span", { className: "text-[13px] text-black leading-none truncate tracking-wide mb-1 group-hover:opacity-70 transition-opacity" }, title), subtitle && /* @__PURE__ */ React25.createElement("span", { className: "text-[9px] text-neutral-500 truncate tracking-[0.2em] leading-none uppercase" }, subtitle)), /* @__PURE__ */ React25.createElement(
1745
+ HugeiconsIcon12,
1746
+ {
1747
+ icon: CircleArrowDown01Icon,
1748
+ size: 14,
1749
+ className: "text-neutral-400 shrink-0 group-hover:text-black transition-colors ml-auto"
1750
+ }
1751
+ ))
1752
+ ), /* @__PURE__ */ React25.createElement("div", { className: "md:hidden flex shrink-0" }, /* @__PURE__ */ React25.createElement(
1720
1753
  "button",
1721
1754
  {
1722
1755
  onClick: closeMobile,
@@ -1773,7 +1806,39 @@ var UniversalSidebar = ({
1773
1806
  /* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: SidebarLeft01Icon, size: 18, className: "shrink-0 text-neutral-400" }),
1774
1807
  !isCollapsed && /* @__PURE__ */ React25.createElement("span", { className: "text-xs" }, "Collapse")
1775
1808
  )))
1776
- ), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ React25.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React25.createElement(
1809
+ ), showAppSwitcherDialog && /* @__PURE__ */ React25.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React25.createElement(
1810
+ "div",
1811
+ {
1812
+ className: "absolute inset-0 bg-black/30 transition-opacity",
1813
+ onClick: () => setShowAppSwitcherDialog(false)
1814
+ }
1815
+ ), /* @__PURE__ */ React25.createElement("div", { className: "relative w-full max-w-85 bg-white rounded-2xl flex flex-col overflow-hidden shadow-2xl animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ React25.createElement("div", { className: "p-5 w-full flex items-center justify-between" }, /* @__PURE__ */ React25.createElement("div", null, /* @__PURE__ */ React25.createElement("h3", { className: "text-[15px] text-black tracking-tight font-medium" }, "Retina Apps"), /* @__PURE__ */ React25.createElement("p", { className: "text-[10px] text-neutral-500 tracking-widest mt-0.5 uppercase" }, "Switch Applications")), /* @__PURE__ */ React25.createElement(
1816
+ "button",
1817
+ {
1818
+ onClick: () => setShowAppSwitcherDialog(false),
1819
+ className: "w-8 h-8 flex items-center justify-center rounded-full hover:bg-neutral-100 text-neutral-400 transition-colors"
1820
+ },
1821
+ /* @__PURE__ */ React25.createElement(HugeiconsIcon12, { icon: CancelCircleIcon, size: 18 })
1822
+ )), /* @__PURE__ */ React25.createElement("div", { className: "max-h-[60vh] overflow-y-auto w-full custom-scrollbar p-2" }, ECOSYSTEM_APPS.map((app) => {
1823
+ const isActive = currentAppType === app.id;
1824
+ return /* @__PURE__ */ React25.createElement(
1825
+ "a",
1826
+ {
1827
+ key: app.id,
1828
+ href: app.url,
1829
+ className: `w-full text-left p-3 flex items-center gap-4 rounded-xl transition-all outline-none ${isActive ? " border border-neutral-200" : "hover:bg-neutral-50 border border-transparent"}`
1830
+ },
1831
+ /* @__PURE__ */ React25.createElement(
1832
+ "img",
1833
+ {
1834
+ src: app.iconSrc,
1835
+ alt: app.name,
1836
+ className: "w-5 h-5 object-contain shrink-0"
1837
+ }
1838
+ ),
1839
+ /* @__PURE__ */ React25.createElement("div", { className: "flex flex-col min-w-0 flex-1" }, /* @__PURE__ */ React25.createElement("span", { className: "text-[13px] text-black font-medium tracking-tight truncate" }, app.name), /* @__PURE__ */ React25.createElement("span", { className: "text-[10px] text-neutral-500 mt-0.5 truncate leading-snug" }, app.description))
1840
+ );
1841
+ })))), showSwitcherDialog && showWorkspaceSwitcher && workspaces && workspaces.length > 0 && /* @__PURE__ */ React25.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4 pointer-events-auto" }, /* @__PURE__ */ React25.createElement(
1777
1842
  "div",
1778
1843
  {
1779
1844
  className: "absolute inset-0 bg-black/30",
@@ -3087,9 +3152,7 @@ var UniversalDirectoryPage = ({
3087
3152
  headerTitle,
3088
3153
  headerDescription,
3089
3154
  hideSearch = false,
3090
- // Default to false
3091
3155
  headerAction,
3092
- // Capture the action button
3093
3156
  searchPlaceholder = "Search...",
3094
3157
  searchQuery,
3095
3158
  onSearchChange,
@@ -3104,14 +3167,14 @@ var UniversalDirectoryPage = ({
3104
3167
  detailsContent,
3105
3168
  modals
3106
3169
  }) => {
3107
- return /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white" }, /* @__PURE__ */ React37.createElement(ManagedToaster, null), /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" ? /* @__PURE__ */ React37.createElement(React37.Fragment, null, /* @__PURE__ */ React37.createElement("div", { className: "w-full" }, /* @__PURE__ */ React37.createElement("h1", { className: " text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ React37.createElement("p", { className: "text-xs text-neutral-500 mb-6" }, headerDescription), !hideSearch && /* @__PURE__ */ React37.createElement(
3170
+ return /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col gap-8 animate-in max-w-3xl fade-in duration-300 p-6 rounded-2xl bg-white" }, /* @__PURE__ */ React37.createElement(ManagedToaster, null), /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col sm:flex-row sm:items-start justify-between gap-4" }, currentView === "list" ? /* @__PURE__ */ React37.createElement(React37.Fragment, null, /* @__PURE__ */ React37.createElement("div", { className: "w-full" }, /* @__PURE__ */ React37.createElement("h1", { className: " text-xl text-black mb-1 tracking-tight" }, headerTitle), /* @__PURE__ */ React37.createElement("p", { className: "text-xs text-neutral-500 mb-6" }, headerDescription), !hideSearch && /* @__PURE__ */ React37.createElement(
3108
3171
  TextInput,
3109
3172
  {
3110
3173
  placeholder: searchPlaceholder,
3111
3174
  value: searchQuery,
3112
3175
  onChange: onSearchChange
3113
3176
  }
3114
- )), headerAction && /* @__PURE__ */ React37.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React37.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowLeft01Icon6, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ React37.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ React37.createElement(PageSpinner4, null) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React37.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ React37.createElement(React37.Fragment, null, /* @__PURE__ */ React37.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.")) : items.map((item) => /* @__PURE__ */ React37.createElement(
3177
+ )), headerAction && /* @__PURE__ */ React37.createElement("div", { className: "shrink-0 w-full sm:w-auto mt-4 sm:mt-0" }, headerAction)) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col items-start gap-3" }, /* @__PURE__ */ React37.createElement("button", { onClick: onBackToList, className: "text-[10px] text-neutral-400 hover:text-black tracking-[0.2em] flex items-center gap-1.5 transition-colors outline-none uppercase" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowLeft01Icon6, size: 12 }), " Back"))), currentView === "list" && /* @__PURE__ */ React37.createElement("div", { className: "w-full overflow-hidden pt-2" }, isLoading ? /* @__PURE__ */ React37.createElement(PageSpinner4, null) : /* @__PURE__ */ React37.createElement("div", { className: "flex flex-col min-w-0" }, /* @__PURE__ */ React37.createElement("div", { className: "divide-y divide-neutral-100" }, items.length === 0 ? /* @__PURE__ */ React37.createElement("p", { className: "text-xs text-neutral-500 py-6 text-center" }, "No records found.") : items.map((item) => /* @__PURE__ */ React37.createElement(
3115
3178
  "div",
3116
3179
  {
3117
3180
  key: item.id,
@@ -3120,7 +3183,23 @@ var UniversalDirectoryPage = ({
3120
3183
  },
3121
3184
  /* @__PURE__ */ React37.createElement("div", { className: "flex items-center gap-3 sm:gap-4 min-w-0 flex-1" }, /* @__PURE__ */ React37.createElement("div", { className: "w-10 h-10 shrink-0 rounded-full flex items-center justify-center bg-neutral-100 text-black text-xs" }, item.icon), /* @__PURE__ */ React37.createElement("div", { className: "min-w-0 flex-1" }, /* @__PURE__ */ React37.createElement("div", { className: "text-sm text-black truncate pr-2" }, item.primaryText), /* @__PURE__ */ React37.createElement("div", { className: "text-xs text-neutral-500 truncate pr-2 mt-0.5" }, item.secondaryText))),
3122
3185
  item.rightBadge && /* @__PURE__ */ React37.createElement("div", { className: "shrink-0 pl-2" }, /* @__PURE__ */ React37.createElement("span", { className: `text-[10px] tracking-[0.2em] px-3 py-1 rounded-full whitespace-nowrap uppercase ${item.rightBadgeClass || "text-neutral-500 border border-neutral-200 bg-white"}` }, item.rightBadge))
3123
- ))), totalPages > 1 && /* @__PURE__ */ React37.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ React37.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", totalPages), /* @__PURE__ */ React37.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React37.createElement("button", { onClick: () => onPageChange(currentPage - 1), disabled: currentPage === 1 || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowLeft01Icon6, size: 14 })), /* @__PURE__ */ React37.createElement("button", { onClick: () => onPageChange(currentPage + 1), disabled: currentPage >= totalPages || isLoading, className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30" }, /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowRight01Icon6, size: 14 })))))), currentView === "details" && detailsContent, modals);
3186
+ ))), /* @__PURE__ */ React37.createElement("div", { className: "flex items-center justify-between p-4 sm:p-5" }, /* @__PURE__ */ React37.createElement("span", { className: "text-[10px] text-neutral-400 tracking-[0.2em] uppercase" }, "Page ", currentPage, " of ", Math.max(1, totalPages)), /* @__PURE__ */ React37.createElement("div", { className: "flex items-center gap-2" }, /* @__PURE__ */ React37.createElement(
3187
+ "button",
3188
+ {
3189
+ onClick: () => onPageChange(currentPage - 1),
3190
+ disabled: currentPage <= 1 || isLoading,
3191
+ className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30 transition-all"
3192
+ },
3193
+ /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowLeft01Icon6, size: 14 })
3194
+ ), /* @__PURE__ */ React37.createElement(
3195
+ "button",
3196
+ {
3197
+ onClick: () => onPageChange(currentPage + 1),
3198
+ disabled: currentPage >= totalPages || isLoading,
3199
+ className: "p-2 border border-neutral-200 rounded-full bg-white text-neutral-500 hover:text-black outline-none disabled:opacity-30 transition-all"
3200
+ },
3201
+ /* @__PURE__ */ React37.createElement(HugeiconsIcon23, { icon: ArrowRight01Icon6, size: 14 })
3202
+ ))))), currentView === "details" && detailsContent, modals);
3124
3203
  };
3125
3204
 
3126
3205
  // src/components/AiApproveDecline.tsx
@@ -3913,12 +3992,12 @@ AUDDITUR_SECRET_KEY="${secKey}"
3913
3992
  className: "min-w-32 w-full sm:w-auto"
3914
3993
  },
3915
3994
  "Save Webhook"
3916
- ))))), isRollModalOpen && !isReadOnly && /* @__PURE__ */ React42.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React42.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isGenerating && setIsRollModalOpen(false) }), /* @__PURE__ */ React42.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ React42.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ React42.createElement("h3", { className: " text-[17px] text-black tracking-tight mb-1" }, "Roll API Keys"), /* @__PURE__ */ React42.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to roll your keys? This will permanently invalidate your current secret key and active MCP tokens.")), /* @__PURE__ */ React42.createElement("div", { className: "w-full flex border-t border-neutral-100" }, /* @__PURE__ */ React42.createElement(
3995
+ ))))), isRollModalOpen && !isReadOnly && /* @__PURE__ */ React42.createElement("div", { className: "fixed inset-0 z-110 flex items-center justify-center p-4" }, /* @__PURE__ */ React42.createElement("div", { className: "absolute inset-0 bg-black/30", onClick: () => !isGenerating && setIsRollModalOpen(false) }), /* @__PURE__ */ React42.createElement("div", { className: "relative w-72 bg-white shadow-2xl rounded-2xl flex flex-col items-center overflow-hidden animate-in zoom-in-95 duration-200" }, /* @__PURE__ */ React42.createElement("div", { className: "p-6 text-center w-full" }, /* @__PURE__ */ React42.createElement("h3", { className: " text-[17px] text-black tracking-tight mb-1" }, "Roll API Keys"), /* @__PURE__ */ React42.createElement("p", { className: "text-[12px] text-neutral-500 leading-snug mt-2" }, "Are you sure you want to roll your keys? This will permanently invalidate your current secret key and active MCP tokens.")), /* @__PURE__ */ React42.createElement("div", { className: "w-full flex" }, /* @__PURE__ */ React42.createElement(
3917
3996
  "button",
3918
3997
  {
3919
3998
  onClick: () => setIsRollModalOpen(false),
3920
3999
  disabled: isGenerating,
3921
- className: "flex-1 py-3 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none border-r border-neutral-100"
4000
+ className: "flex-1 py-3 text-[13px] text-neutral-600 hover:bg-neutral-50 transition-colors disabled:opacity-50 outline-none"
3922
4001
  },
3923
4002
  "Cancel"
3924
4003
  ), /* @__PURE__ */ React42.createElement(
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@retinalabsllc/zairusjs",
3
- "version": "0.9.8",
3
+ "version": "1.0.0",
4
4
  "description": "A perceptive, Ai data driven Next.js UI component library.",
5
5
  "author": "Retina Labs Company",
6
6
  "license": "MIT",