@flamingo-stack/openframe-frontend-core 0.0.584 → 0.0.585-1985.5484.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. package/dist/{chunk-3ELW4VML.js → chunk-276BXVOB.js} +3 -3
  2. package/dist/{chunk-Q66AMADB.cjs → chunk-27DK5GCC.cjs} +6 -6
  3. package/dist/{chunk-Q66AMADB.cjs.map → chunk-27DK5GCC.cjs.map} +1 -1
  4. package/dist/{chunk-TOUD3AGK.js → chunk-36GXR7BR.js} +5 -5
  5. package/dist/{chunk-QJR32JM2.cjs → chunk-3F7V7GFU.cjs} +212 -194
  6. package/dist/chunk-3F7V7GFU.cjs.map +1 -0
  7. package/dist/{chunk-33DHEEMP.cjs → chunk-4TN6C7ZG.cjs} +33 -33
  8. package/dist/{chunk-33DHEEMP.cjs.map → chunk-4TN6C7ZG.cjs.map} +1 -1
  9. package/dist/{chunk-VEHZNQ77.cjs → chunk-5LUPIYPH.cjs} +30 -30
  10. package/dist/{chunk-VEHZNQ77.cjs.map → chunk-5LUPIYPH.cjs.map} +1 -1
  11. package/dist/{chunk-JAJQ5P2Q.cjs → chunk-5YVCIBUH.cjs} +28 -28
  12. package/dist/{chunk-JAJQ5P2Q.cjs.map → chunk-5YVCIBUH.cjs.map} +1 -1
  13. package/dist/{chunk-ZHUBNWEX.cjs → chunk-6VFO4JUH.cjs} +6 -6
  14. package/dist/{chunk-ZHUBNWEX.cjs.map → chunk-6VFO4JUH.cjs.map} +1 -1
  15. package/dist/{chunk-5CJKZHWO.js → chunk-7554QJ6R.js} +5 -5
  16. package/dist/{chunk-EJKEDCTH.js → chunk-BNZFLIEG.js} +7 -7
  17. package/dist/{chunk-UCNEQKIT.cjs → chunk-BU2KLFRB.cjs} +5 -5
  18. package/dist/{chunk-UCNEQKIT.cjs.map → chunk-BU2KLFRB.cjs.map} +1 -1
  19. package/dist/{chunk-YFZDIEVC.js → chunk-CTZP2NJQ.js} +6 -6
  20. package/dist/{chunk-XWBND4G5.js → chunk-D7YISHXC.js} +17 -2
  21. package/dist/{chunk-XWBND4G5.js.map → chunk-D7YISHXC.js.map} +1 -1
  22. package/dist/{chunk-JFKK3ZOA.cjs → chunk-DZM7KTHE.cjs} +57 -57
  23. package/dist/{chunk-JFKK3ZOA.cjs.map → chunk-DZM7KTHE.cjs.map} +1 -1
  24. package/dist/{chunk-NNFQLTJ3.cjs → chunk-EMF64FWA.cjs} +31 -5
  25. package/dist/chunk-EMF64FWA.cjs.map +1 -0
  26. package/dist/{chunk-7X5TCK4R.cjs → chunk-F5SV627B.cjs} +10 -10
  27. package/dist/{chunk-7X5TCK4R.cjs.map → chunk-F5SV627B.cjs.map} +1 -1
  28. package/dist/{chunk-KP6VJP36.js → chunk-FCKOWGTE.js} +4 -4
  29. package/dist/{chunk-IIT5HWLY.cjs → chunk-FQJBV5ON.cjs} +11 -11
  30. package/dist/{chunk-IIT5HWLY.cjs.map → chunk-FQJBV5ON.cjs.map} +1 -1
  31. package/dist/{chunk-IKUSKKFZ.cjs → chunk-G45RGWHF.cjs} +159 -144
  32. package/dist/chunk-G45RGWHF.cjs.map +1 -0
  33. package/dist/{chunk-LNKULR4V.js → chunk-GG76BPXJ.js} +2 -2
  34. package/dist/{chunk-3ZA2OYRE.cjs → chunk-HAIRDHWL.cjs} +3 -3
  35. package/dist/{chunk-3ZA2OYRE.cjs.map → chunk-HAIRDHWL.cjs.map} +1 -1
  36. package/dist/{chunk-JWKAJTNA.cjs → chunk-HBI7AWUE.cjs} +28 -28
  37. package/dist/{chunk-JWKAJTNA.cjs.map → chunk-HBI7AWUE.cjs.map} +1 -1
  38. package/dist/{chunk-RURZ6QLN.js → chunk-HQRKC6P7.js} +3 -3
  39. package/dist/{chunk-VZSTL5VG.js → chunk-J4MVZ53H.js} +3 -3
  40. package/dist/{chunk-MYEG5ZDT.js → chunk-JKWWACNI.js} +3 -3
  41. package/dist/{chunk-6BJYPG2V.js → chunk-LNKBNY3A.js} +4 -4
  42. package/dist/{chunk-MCWAZ5XI.js → chunk-NFWAL6UV.js} +2 -2
  43. package/dist/{chunk-P2VRLSAP.cjs → chunk-QIVZG4XK.cjs} +21 -21
  44. package/dist/{chunk-P2VRLSAP.cjs.map → chunk-QIVZG4XK.cjs.map} +1 -1
  45. package/dist/{chunk-4T5KOD3G.js → chunk-SCMESLXP.js} +6 -6
  46. package/dist/{chunk-XPJKQ63S.js → chunk-UG6SHUGE.js} +3 -3
  47. package/dist/{chunk-MEJFHD5N.cjs → chunk-ULGI56BW.cjs} +19 -19
  48. package/dist/{chunk-MEJFHD5N.cjs.map → chunk-ULGI56BW.cjs.map} +1 -1
  49. package/dist/{chunk-VOAZU46B.cjs → chunk-VQ5FMCZA.cjs} +80 -80
  50. package/dist/{chunk-VOAZU46B.cjs.map → chunk-VQ5FMCZA.cjs.map} +1 -1
  51. package/dist/{chunk-TLKHLGAB.js → chunk-VSXFBO4D.js} +3 -3
  52. package/dist/{chunk-JVWRMLQZ.js → chunk-WXL2AR5I.js} +1330 -1312
  53. package/dist/chunk-WXL2AR5I.js.map +1 -0
  54. package/dist/{chunk-3LMYQGAJ.js → chunk-X7YSF6A3.js} +28 -2
  55. package/dist/chunk-X7YSF6A3.js.map +1 -0
  56. package/dist/{chunk-HCKEDTKJ.cjs → chunk-XK4S47LG.cjs} +15 -15
  57. package/dist/{chunk-HCKEDTKJ.cjs.map → chunk-XK4S47LG.cjs.map} +1 -1
  58. package/dist/components/case-studies/index.cjs +10 -10
  59. package/dist/components/case-studies/index.js +4 -4
  60. package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -1
  61. package/dist/components/chat/index.cjs +3 -3
  62. package/dist/components/chat/index.js +2 -2
  63. package/dist/components/contact/index.cjs +5 -5
  64. package/dist/components/contact/index.js +4 -4
  65. package/dist/components/docs/index.cjs +8 -8
  66. package/dist/components/docs/index.js +7 -7
  67. package/dist/components/embeds/index.cjs +5 -5
  68. package/dist/components/embeds/index.js +4 -4
  69. package/dist/components/faq/index.cjs +5 -5
  70. package/dist/components/faq/index.js +4 -4
  71. package/dist/components/features/index.cjs +4 -4
  72. package/dist/components/features/index.js +3 -3
  73. package/dist/components/features/media-gallery-manager.d.ts.map +1 -1
  74. package/dist/components/features/push-button-selector.d.ts +9 -7
  75. package/dist/components/features/push-button-selector.d.ts.map +1 -1
  76. package/dist/components/features/release-media-manager.d.ts.map +1 -1
  77. package/dist/components/features/video.d.ts +8 -0
  78. package/dist/components/features/video.d.ts.map +1 -1
  79. package/dist/components/help-center-pages/index.cjs +24 -24
  80. package/dist/components/help-center-pages/index.js +15 -15
  81. package/dist/components/index.cjs +53 -51
  82. package/dist/components/index.cjs.map +1 -1
  83. package/dist/components/index.js +17 -15
  84. package/dist/components/index.js.map +1 -1
  85. package/dist/components/loading/unified-skeleton.d.ts.map +1 -1
  86. package/dist/components/meeting-scheduler/index.cjs +31 -31
  87. package/dist/components/meeting-scheduler/index.js +3 -3
  88. package/dist/components/navigation/index.cjs +7 -7
  89. package/dist/components/navigation/index.js +6 -6
  90. package/dist/components/onboarding-guides/index.cjs +7 -7
  91. package/dist/components/onboarding-guides/index.js +6 -6
  92. package/dist/components/related-content/index.cjs +3 -3
  93. package/dist/components/related-content/index.js +2 -2
  94. package/dist/components/tickets/index.cjs +8 -8
  95. package/dist/components/tickets/index.js +7 -7
  96. package/dist/components/ui/index.cjs +6 -4
  97. package/dist/components/ui/index.cjs.map +1 -1
  98. package/dist/components/ui/index.d.ts +1 -0
  99. package/dist/components/ui/index.d.ts.map +1 -1
  100. package/dist/components/ui/index.js +5 -3
  101. package/dist/components/ui/lazy-mount.d.ts +21 -0
  102. package/dist/components/ui/lazy-mount.d.ts.map +1 -0
  103. package/dist/index.cjs +20 -8
  104. package/dist/index.cjs.map +1 -1
  105. package/dist/index.js +19 -7
  106. package/dist/index.js.map +1 -1
  107. package/dist/types/marketing.d.ts +1 -1
  108. package/dist/types/marketing.d.ts.map +1 -1
  109. package/dist/utils/index.cjs +26 -0
  110. package/dist/utils/index.cjs.map +1 -1
  111. package/dist/utils/index.d.ts +1 -0
  112. package/dist/utils/index.d.ts.map +1 -1
  113. package/dist/utils/index.js +22 -1
  114. package/dist/utils/index.js.map +1 -1
  115. package/dist/utils/media-type.d.ts +26 -0
  116. package/dist/utils/media-type.d.ts.map +1 -0
  117. package/package.json +1 -1
  118. package/src/components/chat/entity-cards/program-card.tsx +2 -2
  119. package/src/components/features/media-gallery-manager.tsx +4 -3
  120. package/src/components/features/push-button-selector.tsx +15 -12
  121. package/src/components/features/release-media-manager.tsx +3 -2
  122. package/src/components/features/video.tsx +28 -0
  123. package/src/components/loading/__tests__/unified-skeleton.test.tsx +16 -0
  124. package/src/components/loading/unified-skeleton.tsx +5 -1
  125. package/src/components/ui/__tests__/lazy-mount.test.tsx +46 -0
  126. package/src/components/ui/index.ts +3 -0
  127. package/src/components/ui/lazy-mount.tsx +38 -0
  128. package/src/types/.marketing.md +0 -1
  129. package/src/types/marketing.ts +4 -2
  130. package/src/utils/__tests__/media-type.test.ts +30 -0
  131. package/src/utils/index.ts +3 -0
  132. package/src/utils/media-type.ts +39 -0
  133. package/src/utils/vendor-media-stub.ts +7 -7
  134. package/dist/chunk-3LMYQGAJ.js.map +0 -1
  135. package/dist/chunk-IKUSKKFZ.cjs.map +0 -1
  136. package/dist/chunk-JVWRMLQZ.js.map +0 -1
  137. package/dist/chunk-NNFQLTJ3.cjs.map +0 -1
  138. package/dist/chunk-QJR32JM2.cjs.map +0 -1
  139. /package/dist/{chunk-3ELW4VML.js.map → chunk-276BXVOB.js.map} +0 -0
  140. /package/dist/{chunk-TOUD3AGK.js.map → chunk-36GXR7BR.js.map} +0 -0
  141. /package/dist/{chunk-5CJKZHWO.js.map → chunk-7554QJ6R.js.map} +0 -0
  142. /package/dist/{chunk-EJKEDCTH.js.map → chunk-BNZFLIEG.js.map} +0 -0
  143. /package/dist/{chunk-YFZDIEVC.js.map → chunk-CTZP2NJQ.js.map} +0 -0
  144. /package/dist/{chunk-KP6VJP36.js.map → chunk-FCKOWGTE.js.map} +0 -0
  145. /package/dist/{chunk-LNKULR4V.js.map → chunk-GG76BPXJ.js.map} +0 -0
  146. /package/dist/{chunk-RURZ6QLN.js.map → chunk-HQRKC6P7.js.map} +0 -0
  147. /package/dist/{chunk-VZSTL5VG.js.map → chunk-J4MVZ53H.js.map} +0 -0
  148. /package/dist/{chunk-MYEG5ZDT.js.map → chunk-JKWWACNI.js.map} +0 -0
  149. /package/dist/{chunk-6BJYPG2V.js.map → chunk-LNKBNY3A.js.map} +0 -0
  150. /package/dist/{chunk-MCWAZ5XI.js.map → chunk-NFWAL6UV.js.map} +0 -0
  151. /package/dist/{chunk-4T5KOD3G.js.map → chunk-SCMESLXP.js.map} +0 -0
  152. /package/dist/{chunk-XPJKQ63S.js.map → chunk-UG6SHUGE.js.map} +0 -0
  153. /package/dist/{chunk-TLKHLGAB.js.map → chunk-VSXFBO4D.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  DEFAULT_FOLDER_INDEX_FILE
4
- } from "./chunk-JVWRMLQZ.js";
4
+ } from "./chunk-WXL2AR5I.js";
5
5
  import {
6
6
  scrollElementIntoView
7
7
  } from "./chunk-JRYS4VMV.js";
@@ -357,4 +357,4 @@ export {
357
357
  MultiLevelNavigation,
358
358
  MobileNavigationDropdown
359
359
  };
360
- //# sourceMappingURL=chunk-LNKULR4V.js.map
360
+ //# sourceMappingURL=chunk-GG76BPXJ.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunkQJR32JM2cjs = require('./chunk-QJR32JM2.cjs');
4
+ var _chunk3F7V7GFUcjs = require('./chunk-3F7V7GFU.cjs');
5
5
 
6
6
 
7
7
  var _chunkZI27ALYXcjs = require('./chunk-ZI27ALYX.cjs');
@@ -129,7 +129,7 @@ function useSectionNavigation(sections, options) {
129
129
  // src/components/navigation/multi-level-navigation.tsx
130
130
  var _lucidereact = require('lucide-react');
131
131
 
132
- var DEFAULT_FOLDER_INDEX_FILE2 = _chunkQJR32JM2cjs.DEFAULT_FOLDER_INDEX_FILE;
132
+ var DEFAULT_FOLDER_INDEX_FILE2 = _chunk3F7V7GFUcjs.DEFAULT_FOLDER_INDEX_FILE;
133
133
  function isNodeVisuallySelected(node, selectedPath, folderIndexFile = DEFAULT_FOLDER_INDEX_FILE2) {
134
134
  const FOLDER_INDEX_FILE = folderIndexFile.toLowerCase();
135
135
  if (selectedPath === node.path) {
@@ -357,4 +357,4 @@ function MobileNavigationItem({
357
357
 
358
358
 
359
359
  exports.StickySectionNav = StickySectionNav; exports.useSectionNavigation = useSectionNavigation; exports.MultiLevelNavigation = MultiLevelNavigation; exports.MobileNavigationDropdown = MobileNavigationDropdown;
360
- //# sourceMappingURL=chunk-3ZA2OYRE.cjs.map
360
+ //# sourceMappingURL=chunk-HAIRDHWL.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-3ZA2OYRE.cjs","../src/components/navigation/sticky-section-nav.tsx","../src/components/navigation/multi-level-navigation.tsx"],"names":["jsx","DEFAULT_FOLDER_INDEX_FILE"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-3ZA2OYRE.cjs","sourcesContent":[null,"'use client';\n\nimport type React from 'react';\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { cn } from '../../utils';\nimport { scrollElementIntoView } from '../../utils/scroll-into-view';\n\nexport interface StickyNavSection {\n id: string;\n label: string;\n}\n\ninterface StickySectionNavProps {\n sections: StickyNavSection[];\n activeSection: string;\n onSectionClick: (sectionId: string) => void;\n className?: string;\n ribbonPosition?: 'left' | 'right';\n ribbonColor?: string;\n}\n\n/**\n * Reusable sticky navigation component for section-based navigation\n * Used in vendor detail pages, knowledge base, documentation, etc.\n */\nexport function StickySectionNav({\n sections,\n activeSection,\n onSectionClick,\n className,\n ribbonPosition = 'left',\n ribbonColor = 'var(--color-accent-primary)',\n}: StickySectionNavProps) {\n const navHeight = sections.length * 40; // 40px per item (h-10)\n\n return (\n <nav className={cn('relative bg-ods-bg', className)}>\n {/* Background gray vertical line for all nav items */}\n <div\n className=\"absolute bg-ods-border\"\n style={{\n width: '1px',\n height: `${navHeight}px`,\n [ribbonPosition === 'left' ? 'left' : 'right']: '-2px',\n top: '0px',\n }}\n />\n\n {sections.map(section => (\n <div key={section.id} className=\"relative flex h-10 w-full items-stretch transition-all duration-200\">\n {/* Yellow ribbon for active state */}\n {activeSection === section.id && (\n <div\n className=\"absolute z-10 transition-all duration-200\"\n style={{\n backgroundColor: ribbonColor,\n width: '4px',\n height: '24px',\n [ribbonPosition === 'left' ? 'left' : 'right']: '-2px',\n top: '8px',\n borderRadius: '2px',\n }}\n />\n )}\n\n {/* Navigation button */}\n <button\n onClick={() => onSectionClick(section.id)}\n className=\"relative flex flex-1 cursor-pointer items-center gap-2 px-3 py-2\"\n >\n <span\n className={cn(\n 'text-left transition-all duration-200 text-h6',\n activeSection === section.id\n ? 'text-ods-text-primary'\n : 'text-ods-text-secondary hover:text-ods-text-primary',\n )}\n >\n {section.label}\n </span>\n </button>\n </div>\n ))}\n </nav>\n );\n}\n\n/**\n * SIMPLEST POSSIBLE IMPLEMENTATION - Just make it work\n */\nexport function useSectionNavigation(\n sections: { id: string; ref: React.RefObject<HTMLElement> }[],\n options?: {\n offset?: number;\n },\n) {\n const [activeSection, setActiveSection] = useState(sections[0]?.id || '');\n const isScrollingFromClick = useRef(false);\n const { offset = 100 } = options || {};\n\n // Handle click - scroll to the element via the canonical helper.\n // The `offset` prop maps to `headerOffset` (sticky chrome above the\n // section nav); same smooth-scroll mechanics every other anchor\n // surface in the app uses.\n const handleSectionClick = useCallback(\n (sectionId: string) => {\n const targetElement = document.getElementById(sectionId);\n if (!targetElement) return;\n\n // Prevent scroll spy while we're scrolling\n isScrollingFromClick.current = true;\n setActiveSection(sectionId);\n\n scrollElementIntoView(targetElement, { headerOffset: offset });\n\n // Allow scroll spy again after scroll completes\n setTimeout(() => {\n isScrollingFromClick.current = false;\n }, 500);\n },\n [offset],\n );\n\n // Make sure elements have IDs\n useEffect(() => {\n sections.forEach(section => {\n const el = section.ref.current;\n if (el && !el.id) {\n el.id = section.id;\n }\n });\n }, [sections]);\n\n // Simple scroll spy\n useEffect(() => {\n const handleScroll = () => {\n if (isScrollingFromClick.current) return;\n\n const scrollPosition = window.scrollY + offset + 50;\n\n // Find which section we're in\n let currentSection = sections[0]?.id || '';\n\n for (let i = sections.length - 1; i >= 0; i--) {\n const element = document.getElementById(sections[i].id);\n if (element && scrollPosition >= element.offsetTop) {\n currentSection = sections[i].id;\n break;\n }\n }\n\n setActiveSection(currentSection);\n };\n\n // Throttle the scroll handler\n let scrollTimer: NodeJS.Timeout;\n const throttledScroll = () => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(handleScroll, 100);\n };\n\n window.addEventListener('scroll', throttledScroll);\n handleScroll(); // Check initial position\n\n return () => {\n window.removeEventListener('scroll', throttledScroll);\n clearTimeout(scrollTimer);\n };\n }, [sections, offset]);\n\n return {\n activeSection,\n handleSectionClick,\n };\n}\n","'use client';\n\nimport { ChevronDown, ChevronUp, FileText, Folder, FolderOpen } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { DEFAULT_FOLDER_INDEX_FILE as CANONICAL_FOLDER_INDEX_FILE } from '../../utils/doc-tree-nav';\n\nexport interface NavigationNode {\n id: string;\n name: string;\n path: string;\n type: 'file' | 'folder';\n hasReadme?: boolean;\n children?: NavigationNode[];\n slug?: string;\n // Mirror DocNode's extra optional fields so a DocNode tree is structurally\n // assignable to NavigationNode[] without an `as` cast. NavigationNode\n // intentionally never reads these — they're carried for type-compat only.\n documentType?: 'markdown' | 'pdf' | 'google_sheet' | 'figma' | 'file';\n sortOrder?: number;\n}\n\ninterface MultiLevelNavigationProps {\n nodes: NavigationNode[];\n selectedPath: string;\n expandedNodes: Set<string>;\n onNodeClick: (node: NavigationNode) => void;\n onToggleExpand?: (nodeId: string) => void;\n isLoading?: boolean;\n className?: string;\n /** Folder-index filename (default `'README.md'`, case-insensitive). When the\n * selectedPath is a folder with this file, the visual ribbon moves to the\n * child file. */\n folderIndexFile?: string;\n}\n\n// SSOT lives in `doc-tree-nav` (canonical case `'README.md'`). The visual\n// comparator below lowercases both sides, so re-exporting the canonical\n// constant under the same local name preserves call-site syntax without\n// drifting from the SSOT.\nconst DEFAULT_FOLDER_INDEX_FILE = CANONICAL_FOLDER_INDEX_FILE;\n\n/**\n * Compute the visual \"selected\" state for a navigation node.\n *\n * Folder-with-README convention: when `selectedPath` is a folder that has a\n * README, the FOLDER doesn't get the ribbon — its README child does. The folder\n * is just a container; the README is the actual document being viewed.\n *\n * Mirror case: a README file whose parent folder is the `selectedPath` gets the\n * visual selection ribbon (implicit). This handles both the auto-select-first-\n * folder landing path AND the user-clicks-folder case.\n */\nfunction isNodeVisuallySelected(\n node: NavigationNode,\n selectedPath: string,\n folderIndexFile: string = DEFAULT_FOLDER_INDEX_FILE,\n): boolean {\n const FOLDER_INDEX_FILE = folderIndexFile.toLowerCase();\n // Path comparisons keyed on `node.path` (raw, includes `.md`). Do NOT use\n // `node.name` — the tree-builder runs it through `formatDocName` which strips\n // the `.md` extension, so `node.name.toLowerCase() === 'readme.md'` is always\n // false.\n if (selectedPath === node.path) {\n // Explicit match — but folder-with-README defers to its README child.\n return !(node.type === 'folder' && node.hasReadme);\n }\n if (node.type !== 'file') return false;\n const pathLower = node.path.toLowerCase();\n // Implicit: README child whose parent folder is the selectedPath.\n if (selectedPath !== '' && pathLower === `${selectedPath.toLowerCase()}/${FOLDER_INDEX_FILE}`) {\n return true;\n }\n // Implicit: ROOT README on the landing page (selectedPath === '' means\n // \"no explicit doc selected\" — the viewer falls back to the root folder-\n // index file, so that file IS the active document).\n if (selectedPath === '' && pathLower === FOLDER_INDEX_FILE) {\n return true;\n }\n return false;\n}\n\nexport function MultiLevelNavigation({\n nodes,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n isLoading,\n className,\n folderIndexFile = DEFAULT_FOLDER_INDEX_FILE,\n}: MultiLevelNavigationProps) {\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3, 4].map(i => (\n <div key={i} className=\"h-12 animate-pulse rounded-lg bg-ods-skeleton p-3\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)} role=\"list\" aria-label=\"Navigation list\">\n {nodes.map(node => (\n <NavigationItem\n key={node.id}\n node={node}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={0}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n );\n}\n\ninterface NavigationItemProps {\n node: NavigationNode;\n selectedPath: string;\n expandedNodes: Set<string>;\n onNodeClick: (node: NavigationNode) => void;\n onToggleExpand?: (nodeId: string) => void;\n level: number;\n folderIndexFile: string;\n}\n\nfunction NavigationItem({\n node,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n level,\n folderIndexFile,\n}: NavigationItemProps) {\n const isExpanded = expandedNodes.has(node.id);\n const isSelected = isNodeVisuallySelected(node, selectedPath, folderIndexFile);\n // Bind the (optional) child list once so the render below maps a real array\n // rather than re-deriving `hasChildren` and asserting it away.\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n\n return (\n <div className=\"space-y-1\" role=\"listitem\">\n <div className={cn('px-2', level > 0 && 'ml-4')}>\n <div\n className={cn(\n 'relative w-full rounded-lg border transition-all duration-150',\n isSelected ? 'border-ods-border bg-ods-border' : 'border-ods-border bg-ods-card',\n )}\n >\n <div className=\"relative flex items-center\">\n <button\n className={cn(\n 'flex h-12 w-full items-center rounded-lg px-2 text-ods-text-primary transition-all duration-150 text-h6',\n !isSelected && 'hover:bg-ods-bg-hover',\n hasChildren && 'pr-12',\n )}\n onClick={() => onNodeClick(node)}\n aria-label={`${isSelected ? 'Selected' : 'Select'} ${node.name}`}\n >\n <span className=\"mr-2 flex-shrink-0\">\n {node.type === 'folder' ? (\n isExpanded ? (\n <FolderOpen className=\"h-4 w-4\" />\n ) : (\n <Folder className=\"h-4 w-4\" />\n )\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {node.name.endsWith('.md') ? node.name.replace('.md', '') : node.name}\n </span>\n {node.type === 'folder' && node.hasReadme && (\n <span className=\"mr-2 rounded bg-ods-bg-surface px-1.5 py-0.5 text-ods-text-secondary text-h6\">\n README\n </span>\n )}\n </button>\n\n {hasChildren && (\n <button\n className=\"absolute right-0 top-0 flex h-12 w-12 items-center justify-center text-ods-text-secondary transition-colors duration-150 hover:text-ods-text-primary\"\n onClick={e => {\n e.stopPropagation();\n if (onToggleExpand) {\n onToggleExpand(node.id);\n } else {\n onNodeClick(node);\n }\n }}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${node.name}`}\n >\n {isExpanded ? <ChevronUp className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n </button>\n )}\n </div>\n\n {isSelected && (\n <div className=\"absolute right-0 top-1/2 h-[calc(100%-8px)] w-1 -translate-y-1/2 rounded-l bg-ods-accent\" />\n )}\n </div>\n </div>\n\n {hasChildren && isExpanded && (\n <div className=\"space-y-1\">\n {children.map(child => (\n <NavigationItem\n key={child.id}\n node={child}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={level + 1}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport function MobileNavigationDropdown({\n nodes,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n isLoading,\n className,\n folderIndexFile = DEFAULT_FOLDER_INDEX_FILE,\n}: MultiLevelNavigationProps) {\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3].map(i => (\n <div key={i} className=\"h-10 animate-pulse rounded-lg bg-ods-skeleton p-3\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {nodes.map(node => (\n <MobileNavigationItem\n key={node.id}\n node={node}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={0}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n );\n}\n\nfunction MobileNavigationItem({\n node,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n level,\n folderIndexFile,\n}: NavigationItemProps) {\n const isExpanded = expandedNodes.has(node.id);\n const isSelected = isNodeVisuallySelected(node, selectedPath, folderIndexFile);\n // Same binding as the desktop item above — a real array to map, no assertion.\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n\n return (\n <div className=\"space-y-1\">\n <div className={cn('px-2', level > 0 && 'ml-3')}>\n <div\n className={cn(\n 'relative w-full rounded-lg border transition-all duration-150',\n isSelected ? 'border-ods-border bg-ods-border' : 'border-ods-border bg-ods-card',\n )}\n >\n <div className=\"relative flex items-center\">\n <button\n className={cn(\n 'flex h-11 w-full items-center rounded-lg px-2 text-ods-text-primary transition-all duration-150 text-h6',\n !isSelected && 'hover:bg-ods-bg-hover',\n hasChildren && 'pr-11',\n )}\n onClick={() => onNodeClick(node)}\n >\n <span className=\"mr-2 flex-shrink-0\">\n {node.type === 'folder' ? (\n isExpanded ? (\n <FolderOpen className=\"h-4 w-4\" />\n ) : (\n <Folder className=\"h-4 w-4\" />\n )\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {node.name.endsWith('.md') ? node.name.replace('.md', '') : node.name}\n </span>\n {node.type === 'folder' && node.hasReadme && (\n <span className=\"mr-2 rounded bg-ods-bg-surface px-1.5 py-0.5 text-ods-text-secondary text-h6\">\n README\n </span>\n )}\n </button>\n\n {hasChildren && (\n <button\n className=\"absolute right-0 top-0 flex h-11 w-11 items-center justify-center text-ods-text-secondary transition-colors duration-150 hover:text-ods-text-primary\"\n onClick={e => {\n e.stopPropagation();\n if (onToggleExpand) {\n onToggleExpand(node.id);\n } else {\n onNodeClick(node);\n }\n }}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${node.name}`}\n >\n {isExpanded ? <ChevronUp className=\"h-3.5 w-3.5\" /> : <ChevronDown className=\"h-3.5 w-3.5\" />}\n </button>\n )}\n </div>\n\n {isSelected && (\n <div className=\"absolute right-0 top-1/2 h-[calc(100%-8px)] w-1 -translate-y-1/2 rounded-l bg-ods-accent\" />\n )}\n </div>\n </div>\n\n {hasChildren && isExpanded && (\n <div className=\"space-y-1\">\n {children.map(child => (\n <MobileNavigationItem\n key={child.id}\n node={child}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={level + 1}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-HAIRDHWL.cjs","../src/components/navigation/sticky-section-nav.tsx","../src/components/navigation/multi-level-navigation.tsx"],"names":["jsx","DEFAULT_FOLDER_INDEX_FILE"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-HAIRDHWL.cjs","sourcesContent":[null,"'use client';\n\nimport type React from 'react';\nimport { useEffect, useState, useCallback, useRef } from 'react';\nimport { cn } from '../../utils';\nimport { scrollElementIntoView } from '../../utils/scroll-into-view';\n\nexport interface StickyNavSection {\n id: string;\n label: string;\n}\n\ninterface StickySectionNavProps {\n sections: StickyNavSection[];\n activeSection: string;\n onSectionClick: (sectionId: string) => void;\n className?: string;\n ribbonPosition?: 'left' | 'right';\n ribbonColor?: string;\n}\n\n/**\n * Reusable sticky navigation component for section-based navigation\n * Used in vendor detail pages, knowledge base, documentation, etc.\n */\nexport function StickySectionNav({\n sections,\n activeSection,\n onSectionClick,\n className,\n ribbonPosition = 'left',\n ribbonColor = 'var(--color-accent-primary)',\n}: StickySectionNavProps) {\n const navHeight = sections.length * 40; // 40px per item (h-10)\n\n return (\n <nav className={cn('relative bg-ods-bg', className)}>\n {/* Background gray vertical line for all nav items */}\n <div\n className=\"absolute bg-ods-border\"\n style={{\n width: '1px',\n height: `${navHeight}px`,\n [ribbonPosition === 'left' ? 'left' : 'right']: '-2px',\n top: '0px',\n }}\n />\n\n {sections.map(section => (\n <div key={section.id} className=\"relative flex h-10 w-full items-stretch transition-all duration-200\">\n {/* Yellow ribbon for active state */}\n {activeSection === section.id && (\n <div\n className=\"absolute z-10 transition-all duration-200\"\n style={{\n backgroundColor: ribbonColor,\n width: '4px',\n height: '24px',\n [ribbonPosition === 'left' ? 'left' : 'right']: '-2px',\n top: '8px',\n borderRadius: '2px',\n }}\n />\n )}\n\n {/* Navigation button */}\n <button\n onClick={() => onSectionClick(section.id)}\n className=\"relative flex flex-1 cursor-pointer items-center gap-2 px-3 py-2\"\n >\n <span\n className={cn(\n 'text-left transition-all duration-200 text-h6',\n activeSection === section.id\n ? 'text-ods-text-primary'\n : 'text-ods-text-secondary hover:text-ods-text-primary',\n )}\n >\n {section.label}\n </span>\n </button>\n </div>\n ))}\n </nav>\n );\n}\n\n/**\n * SIMPLEST POSSIBLE IMPLEMENTATION - Just make it work\n */\nexport function useSectionNavigation(\n sections: { id: string; ref: React.RefObject<HTMLElement> }[],\n options?: {\n offset?: number;\n },\n) {\n const [activeSection, setActiveSection] = useState(sections[0]?.id || '');\n const isScrollingFromClick = useRef(false);\n const { offset = 100 } = options || {};\n\n // Handle click - scroll to the element via the canonical helper.\n // The `offset` prop maps to `headerOffset` (sticky chrome above the\n // section nav); same smooth-scroll mechanics every other anchor\n // surface in the app uses.\n const handleSectionClick = useCallback(\n (sectionId: string) => {\n const targetElement = document.getElementById(sectionId);\n if (!targetElement) return;\n\n // Prevent scroll spy while we're scrolling\n isScrollingFromClick.current = true;\n setActiveSection(sectionId);\n\n scrollElementIntoView(targetElement, { headerOffset: offset });\n\n // Allow scroll spy again after scroll completes\n setTimeout(() => {\n isScrollingFromClick.current = false;\n }, 500);\n },\n [offset],\n );\n\n // Make sure elements have IDs\n useEffect(() => {\n sections.forEach(section => {\n const el = section.ref.current;\n if (el && !el.id) {\n el.id = section.id;\n }\n });\n }, [sections]);\n\n // Simple scroll spy\n useEffect(() => {\n const handleScroll = () => {\n if (isScrollingFromClick.current) return;\n\n const scrollPosition = window.scrollY + offset + 50;\n\n // Find which section we're in\n let currentSection = sections[0]?.id || '';\n\n for (let i = sections.length - 1; i >= 0; i--) {\n const element = document.getElementById(sections[i].id);\n if (element && scrollPosition >= element.offsetTop) {\n currentSection = sections[i].id;\n break;\n }\n }\n\n setActiveSection(currentSection);\n };\n\n // Throttle the scroll handler\n let scrollTimer: NodeJS.Timeout;\n const throttledScroll = () => {\n clearTimeout(scrollTimer);\n scrollTimer = setTimeout(handleScroll, 100);\n };\n\n window.addEventListener('scroll', throttledScroll);\n handleScroll(); // Check initial position\n\n return () => {\n window.removeEventListener('scroll', throttledScroll);\n clearTimeout(scrollTimer);\n };\n }, [sections, offset]);\n\n return {\n activeSection,\n handleSectionClick,\n };\n}\n","'use client';\n\nimport { ChevronDown, ChevronUp, FileText, Folder, FolderOpen } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport { DEFAULT_FOLDER_INDEX_FILE as CANONICAL_FOLDER_INDEX_FILE } from '../../utils/doc-tree-nav';\n\nexport interface NavigationNode {\n id: string;\n name: string;\n path: string;\n type: 'file' | 'folder';\n hasReadme?: boolean;\n children?: NavigationNode[];\n slug?: string;\n // Mirror DocNode's extra optional fields so a DocNode tree is structurally\n // assignable to NavigationNode[] without an `as` cast. NavigationNode\n // intentionally never reads these — they're carried for type-compat only.\n documentType?: 'markdown' | 'pdf' | 'google_sheet' | 'figma' | 'file';\n sortOrder?: number;\n}\n\ninterface MultiLevelNavigationProps {\n nodes: NavigationNode[];\n selectedPath: string;\n expandedNodes: Set<string>;\n onNodeClick: (node: NavigationNode) => void;\n onToggleExpand?: (nodeId: string) => void;\n isLoading?: boolean;\n className?: string;\n /** Folder-index filename (default `'README.md'`, case-insensitive). When the\n * selectedPath is a folder with this file, the visual ribbon moves to the\n * child file. */\n folderIndexFile?: string;\n}\n\n// SSOT lives in `doc-tree-nav` (canonical case `'README.md'`). The visual\n// comparator below lowercases both sides, so re-exporting the canonical\n// constant under the same local name preserves call-site syntax without\n// drifting from the SSOT.\nconst DEFAULT_FOLDER_INDEX_FILE = CANONICAL_FOLDER_INDEX_FILE;\n\n/**\n * Compute the visual \"selected\" state for a navigation node.\n *\n * Folder-with-README convention: when `selectedPath` is a folder that has a\n * README, the FOLDER doesn't get the ribbon — its README child does. The folder\n * is just a container; the README is the actual document being viewed.\n *\n * Mirror case: a README file whose parent folder is the `selectedPath` gets the\n * visual selection ribbon (implicit). This handles both the auto-select-first-\n * folder landing path AND the user-clicks-folder case.\n */\nfunction isNodeVisuallySelected(\n node: NavigationNode,\n selectedPath: string,\n folderIndexFile: string = DEFAULT_FOLDER_INDEX_FILE,\n): boolean {\n const FOLDER_INDEX_FILE = folderIndexFile.toLowerCase();\n // Path comparisons keyed on `node.path` (raw, includes `.md`). Do NOT use\n // `node.name` — the tree-builder runs it through `formatDocName` which strips\n // the `.md` extension, so `node.name.toLowerCase() === 'readme.md'` is always\n // false.\n if (selectedPath === node.path) {\n // Explicit match — but folder-with-README defers to its README child.\n return !(node.type === 'folder' && node.hasReadme);\n }\n if (node.type !== 'file') return false;\n const pathLower = node.path.toLowerCase();\n // Implicit: README child whose parent folder is the selectedPath.\n if (selectedPath !== '' && pathLower === `${selectedPath.toLowerCase()}/${FOLDER_INDEX_FILE}`) {\n return true;\n }\n // Implicit: ROOT README on the landing page (selectedPath === '' means\n // \"no explicit doc selected\" — the viewer falls back to the root folder-\n // index file, so that file IS the active document).\n if (selectedPath === '' && pathLower === FOLDER_INDEX_FILE) {\n return true;\n }\n return false;\n}\n\nexport function MultiLevelNavigation({\n nodes,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n isLoading,\n className,\n folderIndexFile = DEFAULT_FOLDER_INDEX_FILE,\n}: MultiLevelNavigationProps) {\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3, 4].map(i => (\n <div key={i} className=\"h-12 animate-pulse rounded-lg bg-ods-skeleton p-3\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)} role=\"list\" aria-label=\"Navigation list\">\n {nodes.map(node => (\n <NavigationItem\n key={node.id}\n node={node}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={0}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n );\n}\n\ninterface NavigationItemProps {\n node: NavigationNode;\n selectedPath: string;\n expandedNodes: Set<string>;\n onNodeClick: (node: NavigationNode) => void;\n onToggleExpand?: (nodeId: string) => void;\n level: number;\n folderIndexFile: string;\n}\n\nfunction NavigationItem({\n node,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n level,\n folderIndexFile,\n}: NavigationItemProps) {\n const isExpanded = expandedNodes.has(node.id);\n const isSelected = isNodeVisuallySelected(node, selectedPath, folderIndexFile);\n // Bind the (optional) child list once so the render below maps a real array\n // rather than re-deriving `hasChildren` and asserting it away.\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n\n return (\n <div className=\"space-y-1\" role=\"listitem\">\n <div className={cn('px-2', level > 0 && 'ml-4')}>\n <div\n className={cn(\n 'relative w-full rounded-lg border transition-all duration-150',\n isSelected ? 'border-ods-border bg-ods-border' : 'border-ods-border bg-ods-card',\n )}\n >\n <div className=\"relative flex items-center\">\n <button\n className={cn(\n 'flex h-12 w-full items-center rounded-lg px-2 text-ods-text-primary transition-all duration-150 text-h6',\n !isSelected && 'hover:bg-ods-bg-hover',\n hasChildren && 'pr-12',\n )}\n onClick={() => onNodeClick(node)}\n aria-label={`${isSelected ? 'Selected' : 'Select'} ${node.name}`}\n >\n <span className=\"mr-2 flex-shrink-0\">\n {node.type === 'folder' ? (\n isExpanded ? (\n <FolderOpen className=\"h-4 w-4\" />\n ) : (\n <Folder className=\"h-4 w-4\" />\n )\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {node.name.endsWith('.md') ? node.name.replace('.md', '') : node.name}\n </span>\n {node.type === 'folder' && node.hasReadme && (\n <span className=\"mr-2 rounded bg-ods-bg-surface px-1.5 py-0.5 text-ods-text-secondary text-h6\">\n README\n </span>\n )}\n </button>\n\n {hasChildren && (\n <button\n className=\"absolute right-0 top-0 flex h-12 w-12 items-center justify-center text-ods-text-secondary transition-colors duration-150 hover:text-ods-text-primary\"\n onClick={e => {\n e.stopPropagation();\n if (onToggleExpand) {\n onToggleExpand(node.id);\n } else {\n onNodeClick(node);\n }\n }}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${node.name}`}\n >\n {isExpanded ? <ChevronUp className=\"h-4 w-4\" /> : <ChevronDown className=\"h-4 w-4\" />}\n </button>\n )}\n </div>\n\n {isSelected && (\n <div className=\"absolute right-0 top-1/2 h-[calc(100%-8px)] w-1 -translate-y-1/2 rounded-l bg-ods-accent\" />\n )}\n </div>\n </div>\n\n {hasChildren && isExpanded && (\n <div className=\"space-y-1\">\n {children.map(child => (\n <NavigationItem\n key={child.id}\n node={child}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={level + 1}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nexport function MobileNavigationDropdown({\n nodes,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n isLoading,\n className,\n folderIndexFile = DEFAULT_FOLDER_INDEX_FILE,\n}: MultiLevelNavigationProps) {\n if (isLoading) {\n return (\n <div className={cn('space-y-2', className)}>\n {[1, 2, 3].map(i => (\n <div key={i} className=\"h-10 animate-pulse rounded-lg bg-ods-skeleton p-3\" />\n ))}\n </div>\n );\n }\n\n return (\n <div className={cn('space-y-2', className)}>\n {nodes.map(node => (\n <MobileNavigationItem\n key={node.id}\n node={node}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={0}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n );\n}\n\nfunction MobileNavigationItem({\n node,\n selectedPath,\n expandedNodes,\n onNodeClick,\n onToggleExpand,\n level,\n folderIndexFile,\n}: NavigationItemProps) {\n const isExpanded = expandedNodes.has(node.id);\n const isSelected = isNodeVisuallySelected(node, selectedPath, folderIndexFile);\n // Same binding as the desktop item above — a real array to map, no assertion.\n const children = node.children ?? [];\n const hasChildren = children.length > 0;\n\n return (\n <div className=\"space-y-1\">\n <div className={cn('px-2', level > 0 && 'ml-3')}>\n <div\n className={cn(\n 'relative w-full rounded-lg border transition-all duration-150',\n isSelected ? 'border-ods-border bg-ods-border' : 'border-ods-border bg-ods-card',\n )}\n >\n <div className=\"relative flex items-center\">\n <button\n className={cn(\n 'flex h-11 w-full items-center rounded-lg px-2 text-ods-text-primary transition-all duration-150 text-h6',\n !isSelected && 'hover:bg-ods-bg-hover',\n hasChildren && 'pr-11',\n )}\n onClick={() => onNodeClick(node)}\n >\n <span className=\"mr-2 flex-shrink-0\">\n {node.type === 'folder' ? (\n isExpanded ? (\n <FolderOpen className=\"h-4 w-4\" />\n ) : (\n <Folder className=\"h-4 w-4\" />\n )\n ) : (\n <FileText className=\"h-4 w-4\" />\n )}\n </span>\n <span className=\"min-w-0 flex-1 truncate text-left\">\n {node.name.endsWith('.md') ? node.name.replace('.md', '') : node.name}\n </span>\n {node.type === 'folder' && node.hasReadme && (\n <span className=\"mr-2 rounded bg-ods-bg-surface px-1.5 py-0.5 text-ods-text-secondary text-h6\">\n README\n </span>\n )}\n </button>\n\n {hasChildren && (\n <button\n className=\"absolute right-0 top-0 flex h-11 w-11 items-center justify-center text-ods-text-secondary transition-colors duration-150 hover:text-ods-text-primary\"\n onClick={e => {\n e.stopPropagation();\n if (onToggleExpand) {\n onToggleExpand(node.id);\n } else {\n onNodeClick(node);\n }\n }}\n aria-label={`${isExpanded ? 'Collapse' : 'Expand'} ${node.name}`}\n >\n {isExpanded ? <ChevronUp className=\"h-3.5 w-3.5\" /> : <ChevronDown className=\"h-3.5 w-3.5\" />}\n </button>\n )}\n </div>\n\n {isSelected && (\n <div className=\"absolute right-0 top-1/2 h-[calc(100%-8px)] w-1 -translate-y-1/2 rounded-l bg-ods-accent\" />\n )}\n </div>\n </div>\n\n {hasChildren && isExpanded && (\n <div className=\"space-y-1\">\n {children.map(child => (\n <MobileNavigationItem\n key={child.id}\n node={child}\n selectedPath={selectedPath}\n expandedNodes={expandedNodes}\n onNodeClick={onNodeClick}\n onToggleExpand={onToggleExpand}\n level={level + 1}\n folderIndexFile={folderIndexFile}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunkUCNEQKITcjs = require('./chunk-UCNEQKIT.cjs');
4
+ var _chunkBU2KLFRBcjs = require('./chunk-BU2KLFRB.cjs');
5
5
 
6
6
 
7
7
 
@@ -12,7 +12,7 @@ var _chunkUCNEQKITcjs = require('./chunk-UCNEQKIT.cjs');
12
12
 
13
13
 
14
14
 
15
- var _chunkQJR32JM2cjs = require('./chunk-QJR32JM2.cjs');
15
+ var _chunk3F7V7GFUcjs = require('./chunk-3F7V7GFU.cjs');
16
16
 
17
17
 
18
18
 
@@ -20,7 +20,7 @@ var _chunkLEISUAHFcjs = require('./chunk-LEISUAHF.cjs');
20
20
 
21
21
 
22
22
 
23
- var _chunkIKUSKKFZcjs = require('./chunk-IKUSKKFZ.cjs');
23
+ var _chunkG45RGWHFcjs = require('./chunk-G45RGWHF.cjs');
24
24
 
25
25
 
26
26
 
@@ -46,7 +46,7 @@ var _chunkKZAAIUP5cjs = require('./chunk-KZAAIUP5.cjs');
46
46
  var _chunkGSQM4PDRcjs = require('./chunk-GSQM4PDR.cjs');
47
47
 
48
48
 
49
- var _chunkNNFQLTJ3cjs = require('./chunk-NNFQLTJ3.cjs');
49
+ var _chunkEMF64FWAcjs = require('./chunk-EMF64FWA.cjs');
50
50
 
51
51
 
52
52
  var _chunk63QUMV72cjs = require('./chunk-63QUMV72.cjs');
@@ -183,7 +183,7 @@ function MobileNavPanel({ isOpen, config }) {
183
183
  );
184
184
  };
185
185
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
186
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkPRPZBXWZcjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunkIKUSKKFZcjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
186
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkPRPZBXWZcjs.cn.call(void 0, "fixed inset-0 z-[9998]", _chunkG45RGWHFcjs.OVERLAY_BACKDROP_CLASS), onClick: config.onClose }),
187
187
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
188
188
  "div",
189
189
  {
@@ -238,16 +238,16 @@ function MobileNavPanel({ isOpen, config }) {
238
238
  // src/components/navigation/ticket-alerts-button.tsx
239
239
 
240
240
  function TicketAlertsButton({ href, onNavigate, disabled, className }) {
241
- const live = _chunkUCNEQKITcjs.useOptionalTicketLive.call(void 0, );
241
+ const live = _chunkBU2KLFRBcjs.useOptionalTicketLive.call(void 0, );
242
242
  if (!live || !live.authed || live.unreadTotal === 0) return null;
243
243
  const targetId = live.nextUnreadTicketId;
244
- const target = targetId ? _chunkQJR32JM2cjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
244
+ const target = targetId ? _chunk3F7V7GFUcjs.buildTicketOpenHref.call(void 0, href, targetId) : href;
245
245
  const handleClick = () => {
246
246
  if (onNavigate) onNavigate(target);
247
247
  else window.location.assign(target);
248
248
  };
249
249
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
250
- _chunkQJR32JM2cjs.HeaderButton,
250
+ _chunk3F7V7GFUcjs.HeaderButton,
251
251
  {
252
252
  icon: (
253
253
  // Glyph inherits HeaderButton's standard cell coloring (secondary at
@@ -257,7 +257,7 @@ function TicketAlertsButton({ href, onNavigate, disabled, className }) {
257
257
  // existing while updates are unread — never by tinting the glyph.
258
258
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: "relative inline-flex", children: [
259
259
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGSQM4PDRcjs.LifeBuoyIcon, { className: "h-6 w-6" }),
260
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQJR32JM2cjs.UnreadCountBadge, { count: live.unreadTotal })
260
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3F7V7GFUcjs.UnreadCountBadge, { count: live.unreadTotal })
261
261
  ] })
262
262
  ),
263
263
  "aria-label": `Support tickets \u2014 ${live.unreadTotal} unread ${live.unreadTotal === 1 ? "update" : "updates"}`,
@@ -575,7 +575,7 @@ function Header({ config }) {
575
575
  leading: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
576
576
  !!_optionalChain([config, 'access', _12 => _12.actions, 'optionalAccess', _13 => _13.left, 'optionalAccess', _14 => _14.length]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex h-full items-center border-r border-ods-border", children: config.actions.left }),
577
577
  _optionalChain([config, 'access', _15 => _15.mobile, 'optionalAccess', _16 => _16.enabled]) && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
578
- _chunkQJR32JM2cjs.HeaderButton,
578
+ _chunk3F7V7GFUcjs.HeaderButton,
579
579
  {
580
580
  className: "border-r border-ods-border lg:hidden",
581
581
  onClick: () => {
@@ -676,7 +676,7 @@ function HeaderSkeleton({ config }) {
676
676
  // src/components/navigation/client-only-header.tsx
677
677
 
678
678
  function ClientOnlyHeader({ config, skeleton }) {
679
- const isClient = _chunkIKUSKKFZcjs.useIsHydrated.call(void 0, );
679
+ const isClient = _chunkG45RGWHFcjs.useIsHydrated.call(void 0, );
680
680
  if (!isClient) {
681
681
  return skeleton || /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderSkeleton, { config });
682
682
  }
@@ -690,7 +690,7 @@ var _framermotion = require('framer-motion');
690
690
 
691
691
  function SlidingSidebar({ config }) {
692
692
  const [expandedItems, setExpandedItems] = _react.useState.call(void 0, /* @__PURE__ */ new Set());
693
- const mounted = _chunkIKUSKKFZcjs.useIsHydrated.call(void 0, );
693
+ const mounted = _chunkG45RGWHFcjs.useIsHydrated.call(void 0, );
694
694
  const headerHeight = _chunkZI27ALYXcjs.useHeaderHeight.call(void 0, );
695
695
  const asideRef = _react.useRef.call(void 0, null);
696
696
  const prefersReducedMotion = _framermotion.useReducedMotion.call(void 0, );
@@ -822,7 +822,7 @@ function SlidingSidebar({ config }) {
822
822
  duration: 0.3,
823
823
  ease: [0.4, 0, 0.2, 1]
824
824
  },
825
- className: _chunkPRPZBXWZcjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkIKUSKKFZcjs.OVERLAY_BACKDROP_CLASS),
825
+ className: _chunkPRPZBXWZcjs.cn.call(void 0, "fixed inset-0 z-[45]", _chunkG45RGWHFcjs.OVERLAY_BACKDROP_CLASS),
826
826
  onClick: () => config.onClose()
827
827
  }
828
828
  ) }),
@@ -943,7 +943,7 @@ var NavigationSidebarItemButton = _react.memo.call(void 0, function NavigationSi
943
943
  _react.cloneElement.call(void 0, item.icon, {
944
944
  color: isActive && !disabled ? "text-ods-accent" : "text-ods-text-secondary"
945
945
  }),
946
- hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQJR32JM2cjs.UnreadDot, { size: "fixed" })
946
+ hasUnread && !showLabel && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3F7V7GFUcjs.UnreadDot, { size: "fixed" })
947
947
  ] }),
948
948
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
949
949
  "span",
@@ -1041,7 +1041,7 @@ function NavigationSidebar({ config, disabled = false }) {
1041
1041
  setTabletFor(isTablet);
1042
1042
  if (isTablet) setTabletMinimized(true);
1043
1043
  }
1044
- const hydrated = _chunkIKUSKKFZcjs.useIsHydrated.call(void 0, );
1044
+ const hydrated = _chunkG45RGWHFcjs.useIsHydrated.call(void 0, );
1045
1045
  const minimized = hydrated ? isTablet ? tabletMinimized : desktopMinimized : _nullishCoalesce(config.minimized, () => ( false));
1046
1046
  const [transitionsEnabled, setTransitionsEnabled] = _react.useState.call(void 0, false);
1047
1047
  const isOverlayOpen = isTablet && !minimized;
@@ -1409,7 +1409,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1409
1409
  leading: (
1410
1410
  // Mobile: Burger Menu Button
1411
1411
  !isMdUp && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1412
- _chunkQJR32JM2cjs.HeaderButton,
1412
+ _chunk3F7V7GFUcjs.HeaderButton,
1413
1413
  {
1414
1414
  onClick: onToggleMobileMenu,
1415
1415
  isActive: isMobileMenuOpen,
@@ -1435,7 +1435,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1435
1435
  center: showSearch ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HeaderGlobalSearch, { onSubmit: onSearch, className: _chunkPRPZBXWZcjs.cn.call(void 0, "w-full", dimmedClass) }) : void 0,
1436
1436
  sideActions: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
1437
1437
  showSearch && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1438
- _chunkQJR32JM2cjs.HeaderButton,
1438
+ _chunk3F7V7GFUcjs.HeaderButton,
1439
1439
  {
1440
1440
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWZW7C7TFcjs.SearchIcon, { className: "h-6 w-6" }),
1441
1441
  "aria-label": "Search",
@@ -1452,7 +1452,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1452
1452
  className: _chunkPRPZBXWZcjs.cn.call(void 0, "hidden lg:flex", dimmedClass)
1453
1453
  }
1454
1454
  ),
1455
- showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQJR32JM2cjs.TimeTrackerHeaderButton, { disabled, className: _chunkPRPZBXWZcjs.cn.call(void 0, cellDivider, dimmedClass) }),
1455
+ showTimeTracker && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3F7V7GFUcjs.TimeTrackerHeaderButton, { disabled, className: _chunkPRPZBXWZcjs.cn.call(void 0, cellDivider, dimmedClass) }),
1456
1456
  showNotifications && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1457
1457
  NotificationsHeaderButton,
1458
1458
  {
@@ -1472,10 +1472,10 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1472
1472
  ),
1473
1473
  isMdUp && showUser && /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunk3QDJLLD2cjs.DropdownMenu, { children: [
1474
1474
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3QDJLLD2cjs.DropdownMenuTrigger, { asChild: true, disabled, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1475
- _chunkQJR32JM2cjs.HeaderButton,
1475
+ _chunk3F7V7GFUcjs.HeaderButton,
1476
1476
  {
1477
1477
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1478
- _chunkNNFQLTJ3cjs.SquareAvatar,
1478
+ _chunkEMF64FWAcjs.SquareAvatar,
1479
1479
  {
1480
1480
  src: userAvatarUrl || void 0,
1481
1481
  alt: userName || "User",
@@ -1501,7 +1501,7 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1501
1501
  children: [
1502
1502
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center gap-2 border-b border-ods-border bg-ods-card p-3", children: [
1503
1503
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1504
- _chunkNNFQLTJ3cjs.SquareAvatar,
1504
+ _chunkEMF64FWAcjs.SquareAvatar,
1505
1505
  {
1506
1506
  src: userAvatarUrl || void 0,
1507
1507
  alt: userName || "User",
@@ -1556,12 +1556,12 @@ var AppHeader = _react2.default.memo(function AppHeaderImpl({
1556
1556
  );
1557
1557
  });
1558
1558
  function NotificationsHeaderButton({ fallbackUnreadCount, disabled, dimmedClass }) {
1559
- const ctx = _chunkQJR32JM2cjs.useOptionalNotifications.call(void 0, );
1559
+ const ctx = _chunk3F7V7GFUcjs.useOptionalNotifications.call(void 0, );
1560
1560
  const hasUnread = (_nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _94 => _94.unreadCount]), () => ( fallbackUnreadCount))) > 0;
1561
1561
  const isActive = _nullishCoalesce(_optionalChain([ctx, 'optionalAccess', _95 => _95.isOpen]), () => ( false));
1562
1562
  const onClick = _optionalChain([ctx, 'optionalAccess', _96 => _96.toggle]);
1563
1563
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1564
- _chunkQJR32JM2cjs.HeaderButton,
1564
+ _chunk3F7V7GFUcjs.HeaderButton,
1565
1565
  {
1566
1566
  icon: isActive ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGSQM4PDRcjs.XmarkIcon, { className: "h-6 w-6" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGSQM4PDRcjs.BellIcon, { className: "h-6 w-6" }),
1567
1567
  showUnreadDot: !isActive && hasUnread,
@@ -1700,7 +1700,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1700
1700
  {
1701
1701
  className: _chunkPRPZBXWZcjs.cn.call(void 0,
1702
1702
  "absolute inset-0 z-[100] md:hidden",
1703
- _chunkIKUSKKFZcjs.OVERLAY_BACKDROP_CLASS,
1703
+ _chunkG45RGWHFcjs.OVERLAY_BACKDROP_CLASS,
1704
1704
  "transition-all duration-300 motion-reduce:transition-none",
1705
1705
  isOpen ? "opacity-100" : "pointer-events-none opacity-0"
1706
1706
  ),
@@ -1741,7 +1741,7 @@ var MobileBurgerMenu = _react2.default.memo(function MobileBurgerMenuImpl({
1741
1741
  "aria-disabled": disabled || void 0,
1742
1742
  children: [
1743
1743
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1744
- _chunkNNFQLTJ3cjs.SquareAvatar,
1744
+ _chunkEMF64FWAcjs.SquareAvatar,
1745
1745
  {
1746
1746
  src: user.userAvatarUrl || void 0,
1747
1747
  alt: user.userName || "User",
@@ -1835,7 +1835,7 @@ function AppLayout({
1835
1835
  }),
1836
1836
  []
1837
1837
  );
1838
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQJR32JM2cjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQJR32JM2cjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkPRPZBXWZcjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
1838
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3F7V7GFUcjs.AppLayoutDrawerContainerContext.Provider, { value: drawerContainer, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3F7V7GFUcjs.AppLayoutDrawerCoordinationContext.Provider, { value: drawerCoordination, children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkPRPZBXWZcjs.cn.call(void 0, "flex h-screen flex-col bg-ods-bg", className), children: [
1839
1839
  topBar,
1840
1840
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "relative flex min-h-0 flex-1", children: [
1841
1841
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, NavigationSidebar, { config: sidebarConfig, disabled }),
@@ -1859,7 +1859,7 @@ function AppLayout({
1859
1859
  disabled
1860
1860
  }
1861
1861
  ),
1862
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQJR32JM2cjs.NotificationDrawer, {}),
1862
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk3F7V7GFUcjs.NotificationDrawer, {}),
1863
1863
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { ref: setDrawerContainer, className: "relative flex flex-1 flex-col overflow-hidden", children: [
1864
1864
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "main", { className: _chunkPRPZBXWZcjs.cn.call(void 0, "flex-1 overflow-y-auto", mainClassName), children }),
1865
1865
  drawer
@@ -1888,4 +1888,4 @@ function AppLayout({
1888
1888
 
1889
1889
 
1890
1890
  exports.MingoAiButton = MingoAiButton; exports.MOBILE_NAV_PANEL_ID = MOBILE_NAV_PANEL_ID; exports.MobileNavPanel = MobileNavPanel; exports.TicketAlertsButton = TicketAlertsButton; exports.TopNavigation = TopNavigation; exports.Header = Header; exports.HeaderSkeleton = HeaderSkeleton; exports.ClientOnlyHeader = ClientOnlyHeader; exports.SlidingSidebar = SlidingSidebar; exports.NAVIGATION_SIDEBAR_WIDTH_VAR = NAVIGATION_SIDEBAR_WIDTH_VAR; exports.NavigationSidebar = NavigationSidebar; exports.HeaderGlobalSearch = HeaderGlobalSearch; exports.HeaderMingoButton = HeaderMingoButton; exports.HeaderOrganizationFilter = HeaderOrganizationFilter; exports.AppHeader = AppHeader; exports.MobileBurgerMenu = MobileBurgerMenu; exports.AppLayout = AppLayout;
1891
- //# sourceMappingURL=chunk-JWKAJTNA.cjs.map
1891
+ //# sourceMappingURL=chunk-HBI7AWUE.cjs.map