@flamingo-stack/openframe-frontend-core 0.0.661 → 0.0.662-snapshot.20260923194332
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/{chunk-M23ZPKOK.js → chunk-3PSNWOAP.js} +4 -4
- package/dist/{chunk-D7QWYQBQ.cjs → chunk-4ZEHQXQ5.cjs} +75 -75
- package/dist/{chunk-D7QWYQBQ.cjs.map → chunk-4ZEHQXQ5.cjs.map} +1 -1
- package/dist/{chunk-YNW3DQFY.cjs → chunk-67FVIC5H.cjs} +81 -53
- package/dist/chunk-67FVIC5H.cjs.map +1 -0
- package/dist/{chunk-J5TAB64U.js → chunk-7I4DGWF5.js} +2 -2
- package/dist/{chunk-24T5HZPB.cjs → chunk-BASKR3Z4.cjs} +1 -1
- package/dist/chunk-BASKR3Z4.cjs.map +1 -0
- package/dist/{chunk-GXHZCGVJ.cjs → chunk-BSETJKSW.cjs} +25 -25
- package/dist/{chunk-GXHZCGVJ.cjs.map → chunk-BSETJKSW.cjs.map} +1 -1
- package/dist/{chunk-N4ORXOZK.cjs → chunk-DF6UYONR.cjs} +10 -10
- package/dist/{chunk-N4ORXOZK.cjs.map → chunk-DF6UYONR.cjs.map} +1 -1
- package/dist/{chunk-Z572FXXM.js → chunk-EX3YF5UR.js} +2 -2
- package/dist/{chunk-U4N65JUW.js → chunk-FXEOBJKX.js} +4 -4
- package/dist/{chunk-WDJT7NJ5.js → chunk-HZ3KIFUW.js} +5 -5
- package/dist/{chunk-PC5WWTDM.js → chunk-I5ZKHDT6.js} +3 -3
- package/dist/{chunk-5LS7KNAU.js → chunk-IHTDANFB.js} +7 -7
- package/dist/{chunk-F5LMTKQD.js → chunk-J3T2WNWC.js} +5 -5
- package/dist/{chunk-Q4XWYP5U.js → chunk-JVAG5CHS.js} +140 -112
- package/dist/chunk-JVAG5CHS.js.map +1 -0
- package/dist/{chunk-UA3V3KXX.js → chunk-KU7HL52F.js} +1 -1
- package/dist/chunk-KU7HL52F.js.map +1 -0
- package/dist/{chunk-7KNVRRI4.cjs → chunk-LPZHG75D.cjs} +25 -25
- package/dist/{chunk-7KNVRRI4.cjs.map → chunk-LPZHG75D.cjs.map} +1 -1
- package/dist/{chunk-ZASHVL45.cjs → chunk-MB5RK5WQ.cjs} +3 -3
- package/dist/{chunk-ZASHVL45.cjs.map → chunk-MB5RK5WQ.cjs.map} +1 -1
- package/dist/{chunk-4EY5JSMK.cjs → chunk-MEVV7FIR.cjs} +5 -5
- package/dist/{chunk-4EY5JSMK.cjs.map → chunk-MEVV7FIR.cjs.map} +1 -1
- package/dist/{chunk-IMDYBINC.js → chunk-N55XI4LH.js} +4 -4
- package/dist/{chunk-RFGXKRRL.js → chunk-NAML3TDW.js} +7 -7
- package/dist/{chunk-TRR6XUEP.js → chunk-OJR7KKCI.js} +3 -3
- package/dist/{chunk-LXBHYUIN.js → chunk-OZTH6T4W.js} +2 -2
- package/dist/{chunk-6VY6PXAN.cjs → chunk-P3IDYJE5.cjs} +33 -33
- package/dist/{chunk-6VY6PXAN.cjs.map → chunk-P3IDYJE5.cjs.map} +1 -1
- package/dist/{chunk-WGTKYVBK.cjs → chunk-PBEXPLFI.cjs} +12 -12
- package/dist/{chunk-WGTKYVBK.cjs.map → chunk-PBEXPLFI.cjs.map} +1 -1
- package/dist/{chunk-EUT6SQW7.js → chunk-Q3G5WOER.js} +3 -3
- package/dist/{chunk-4JITKV2S.cjs → chunk-REQ2AIEE.cjs} +51 -51
- package/dist/{chunk-4JITKV2S.cjs.map → chunk-REQ2AIEE.cjs.map} +1 -1
- package/dist/{chunk-4NKKPGDN.js → chunk-RP4TSHMY.js} +2 -2
- package/dist/{chunk-GLDXZK76.cjs → chunk-RYEMWKYE.cjs} +7 -7
- package/dist/{chunk-GLDXZK76.cjs.map → chunk-RYEMWKYE.cjs.map} +1 -1
- package/dist/{chunk-RPHRBZG6.cjs → chunk-TKASQOSM.cjs} +3 -3
- package/dist/{chunk-RPHRBZG6.cjs.map → chunk-TKASQOSM.cjs.map} +1 -1
- package/dist/{chunk-KCYGLC7Q.js → chunk-V54WTP2E.js} +5 -5
- package/dist/{chunk-H3DF7COI.cjs → chunk-VKKVWGFW.cjs} +44 -44
- package/dist/{chunk-H3DF7COI.cjs.map → chunk-VKKVWGFW.cjs.map} +1 -1
- package/dist/{chunk-XNJZ6A2S.cjs → chunk-WDE7ETA5.cjs} +5 -5
- package/dist/{chunk-XNJZ6A2S.cjs.map → chunk-WDE7ETA5.cjs.map} +1 -1
- package/dist/{chunk-XOA32PN3.cjs → chunk-WZ6OV7VU.cjs} +22 -22
- package/dist/{chunk-XOA32PN3.cjs.map → chunk-WZ6OV7VU.cjs.map} +1 -1
- package/dist/{chunk-QARWK4LN.cjs → chunk-XKQJDXDO.cjs} +10 -10
- package/dist/{chunk-QARWK4LN.cjs.map → chunk-XKQJDXDO.cjs.map} +1 -1
- package/dist/{chunk-FC6I2NWF.js → chunk-XSQSTJ5D.js} +2 -2
- package/dist/{chunk-ZIT4TC5R.cjs → chunk-XVSA4565.cjs} +248 -248
- package/dist/{chunk-ZIT4TC5R.cjs.map → chunk-XVSA4565.cjs.map} +1 -1
- package/dist/components/case-studies/index.cjs +20 -20
- package/dist/components/case-studies/index.js +5 -5
- package/dist/components/chat/index.cjs +3 -3
- package/dist/components/chat/index.js +2 -2
- package/dist/components/contact/index.cjs +6 -6
- package/dist/components/contact/index.js +5 -5
- package/dist/components/docs/index.cjs +9 -9
- package/dist/components/docs/index.js +8 -8
- package/dist/components/embeds/index.cjs +6 -6
- package/dist/components/embeds/index.js +5 -5
- package/dist/components/faq/index.cjs +6 -6
- package/dist/components/faq/index.js +5 -5
- package/dist/components/features/index.cjs +5 -5
- package/dist/components/features/index.js +4 -4
- package/dist/components/help-center-pages/index.cjs +25 -25
- package/dist/components/help-center-pages/index.js +16 -16
- package/dist/components/icons/elestio-logo.d.ts +4 -1
- package/dist/components/icons/elestio-logo.d.ts.map +1 -1
- package/dist/components/icons/index.cjs +2 -2
- package/dist/components/icons/index.js +1 -1
- package/dist/components/index.cjs +44 -42
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +17 -15
- package/dist/components/index.js.map +1 -1
- package/dist/components/meeting-scheduler/index.cjs +28 -28
- package/dist/components/meeting-scheduler/index.js +4 -4
- package/dist/components/navigation/index.cjs +10 -8
- package/dist/components/navigation/index.cjs.map +1 -1
- package/dist/components/navigation/index.d.ts +2 -0
- package/dist/components/navigation/index.d.ts.map +1 -1
- package/dist/components/navigation/index.js +9 -7
- package/dist/components/navigation/mobile-burger-menu.d.ts.map +1 -1
- package/dist/components/navigation/navigation-item-badge.d.ts +22 -0
- package/dist/components/navigation/navigation-item-badge.d.ts.map +1 -0
- package/dist/components/navigation/navigation-sidebar-item.d.ts.map +1 -1
- package/dist/components/onboarding-guides/index.cjs +8 -8
- package/dist/components/onboarding-guides/index.js +7 -7
- package/dist/components/tickets/index.cjs +9 -9
- package/dist/components/tickets/index.js +8 -8
- package/dist/components/ui/index.cjs +5 -5
- package/dist/components/ui/index.js +4 -4
- package/dist/hooks/index.cjs +3 -3
- package/dist/hooks/index.js +2 -2
- package/dist/index.cjs +11 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/dist/types/navigation.d.ts +8 -0
- package/dist/types/navigation.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/icons/elestio-logo.tsx +4 -1
- package/src/components/navigation/index.ts +2 -0
- package/src/components/navigation/mobile-burger-menu.tsx +16 -8
- package/src/components/navigation/navigation-item-badge.tsx +40 -0
- package/src/components/navigation/navigation-sidebar-item.tsx +15 -4
- package/src/stories/AppLayout.stories.tsx +1 -0
- package/src/types/navigation.ts +8 -0
- package/dist/chunk-24T5HZPB.cjs.map +0 -1
- package/dist/chunk-Q4XWYP5U.js.map +0 -1
- package/dist/chunk-UA3V3KXX.js.map +0 -1
- package/dist/chunk-YNW3DQFY.cjs.map +0 -1
- /package/dist/{chunk-M23ZPKOK.js.map → chunk-3PSNWOAP.js.map} +0 -0
- /package/dist/{chunk-J5TAB64U.js.map → chunk-7I4DGWF5.js.map} +0 -0
- /package/dist/{chunk-Z572FXXM.js.map → chunk-EX3YF5UR.js.map} +0 -0
- /package/dist/{chunk-U4N65JUW.js.map → chunk-FXEOBJKX.js.map} +0 -0
- /package/dist/{chunk-WDJT7NJ5.js.map → chunk-HZ3KIFUW.js.map} +0 -0
- /package/dist/{chunk-PC5WWTDM.js.map → chunk-I5ZKHDT6.js.map} +0 -0
- /package/dist/{chunk-5LS7KNAU.js.map → chunk-IHTDANFB.js.map} +0 -0
- /package/dist/{chunk-F5LMTKQD.js.map → chunk-J3T2WNWC.js.map} +0 -0
- /package/dist/{chunk-IMDYBINC.js.map → chunk-N55XI4LH.js.map} +0 -0
- /package/dist/{chunk-RFGXKRRL.js.map → chunk-NAML3TDW.js.map} +0 -0
- /package/dist/{chunk-TRR6XUEP.js.map → chunk-OJR7KKCI.js.map} +0 -0
- /package/dist/{chunk-LXBHYUIN.js.map → chunk-OZTH6T4W.js.map} +0 -0
- /package/dist/{chunk-EUT6SQW7.js.map → chunk-Q3G5WOER.js.map} +0 -0
- /package/dist/{chunk-4NKKPGDN.js.map → chunk-RP4TSHMY.js.map} +0 -0
- /package/dist/{chunk-KCYGLC7Q.js.map → chunk-V54WTP2E.js.map} +0 -0
- /package/dist/{chunk-FC6I2NWF.js.map → chunk-XSQSTJ5D.js.map} +0 -0
|
@@ -42,7 +42,7 @@ import {
|
|
|
42
42
|
WhatsAppIcon,
|
|
43
43
|
XLogo,
|
|
44
44
|
YouTubeIcon
|
|
45
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-KU7HL52F.js";
|
|
46
46
|
import {
|
|
47
47
|
AlertCircleIcon,
|
|
48
48
|
AlertTriangleIcon,
|
|
@@ -26470,4 +26470,4 @@ export {
|
|
|
26470
26470
|
buildStreamFrames,
|
|
26471
26471
|
EmbeddableChat
|
|
26472
26472
|
};
|
|
26473
|
-
//# sourceMappingURL=chunk-
|
|
26473
|
+
//# sourceMappingURL=chunk-RP4TSHMY.js.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkXVSA4565cjs = require('./chunk-XVSA4565.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _chunkWDE7ETA5cjs = require('./chunk-WDE7ETA5.cjs');
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
@@ -46,7 +46,7 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
|
|
|
46
46
|
] });
|
|
47
47
|
}
|
|
48
48
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
49
|
-
|
|
49
|
+
_chunkXVSA4565cjs.EmbedViewerFrame,
|
|
50
50
|
{
|
|
51
51
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYRTMAXLEcjs.GoogleSheetsIcon, { className: "h-5 w-5 shrink-0" }),
|
|
52
52
|
title: displayName,
|
|
@@ -55,7 +55,7 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
|
|
|
55
55
|
{
|
|
56
56
|
variant: "outline",
|
|
57
57
|
size: "small-legacy",
|
|
58
|
-
href:
|
|
58
|
+
href: _chunkWDE7ETA5cjs.toGoogleSheetsOriginalUrl.call(void 0, externalUrl),
|
|
59
59
|
openInNewTab: true,
|
|
60
60
|
leftIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYRTMAXLEcjs.GoogleSheetsIcon, { className: "h-4 w-4" }),
|
|
61
61
|
rightIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ExternalLink, { className: "h-4 w-4" }),
|
|
@@ -63,7 +63,7 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
|
|
|
63
63
|
children: "Open in Google Sheets"
|
|
64
64
|
}
|
|
65
65
|
),
|
|
66
|
-
src:
|
|
66
|
+
src: _chunkWDE7ETA5cjs.toGoogleSheetsEmbedUrl.call(void 0, externalUrl),
|
|
67
67
|
height
|
|
68
68
|
}
|
|
69
69
|
);
|
|
@@ -81,7 +81,7 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
|
|
|
81
81
|
] });
|
|
82
82
|
}
|
|
83
83
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
84
|
-
|
|
84
|
+
_chunkXVSA4565cjs.EmbedViewerFrame,
|
|
85
85
|
{
|
|
86
86
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYRTMAXLEcjs.AdobePdfIcon, { className: "h-5 w-5 shrink-0" }),
|
|
87
87
|
title: displayName,
|
|
@@ -124,4 +124,4 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
|
|
|
124
124
|
|
|
125
125
|
|
|
126
126
|
exports.FileDownloadCard = FileDownloadCard; exports.GoogleSheetsViewer = GoogleSheetsViewer; exports.PdfViewer = PdfViewer;
|
|
127
|
-
//# sourceMappingURL=chunk-
|
|
127
|
+
//# sourceMappingURL=chunk-RYEMWKYE.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RYEMWKYE.cjs","../src/components/embeds/file-download-card.tsx","../src/components/embeds/google-sheets-viewer.tsx","../src/components/embeds/pdf-viewer.tsx"],"names":["jsxs","jsx","Download"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RYEMWKYE.cjs","sourcesContent":[null,"import { FileText, Download } from 'lucide-react';\nimport { formatFileSize } from '../../utils';\nimport { Button } from '../ui';\n\nexport interface FileDownloadCardProps {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n fileUrl?: string;\n}\n\n/**\n * Generic downloadable-file card for the `file` document type. Used by\n * `<DocsHubPage>`'s default `documentTypeRenderers.file`. Embedders can\n * override the default by passing their own `file` renderer.\n *\n * When `fileUrl` is missing, the Download button is omitted (the card still\n * renders the filename + type + size so the user knows what they were\n * about to download).\n */\nexport function FileDownloadCard({ fileName, mimeType, fileSize, fileUrl }: FileDownloadCardProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <div className=\"w-full max-w-md space-y-4 rounded-xl border border-ods-border bg-ods-card p-8 text-center\">\n <FileText className=\"mx-auto h-16 w-16 text-ods-text-secondary\" />\n <div>\n <h3 className=\"text-ods-text-primary text-h3\">{fileName || 'File'}</h3>\n <div className=\"mt-2 flex items-center justify-center gap-3 text-ods-text-secondary text-h6\">\n {mimeType && <span>{mimeType}</span>}\n {typeof fileSize === 'number' && <span>{formatFileSize(fileSize)}</span>}\n </div>\n </div>\n {fileUrl && (\n <Button variant=\"accent\" href={fileUrl} openInNewTab leftIcon={<Download className=\"h-4 w-4\" />}>\n Download File\n </Button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { ExternalLink } from 'lucide-react';\nimport { toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl } from '../../utils/embed-url-converters';\nimport { GoogleSheetsIcon } from '../icons-v2-generated';\nimport { Button } from '../ui';\nimport { EmbedViewerFrame } from './embed-viewer-frame';\n\nexport interface GoogleSheetsViewerProps {\n externalUrl: string;\n fileName?: string;\n height?: string;\n}\n\nexport function GoogleSheetsViewer({ externalUrl, fileName, height }: GoogleSheetsViewerProps) {\n const displayName = fileName || 'Google Sheet';\n\n // Historical shape: no URL at all → standalone empty state with NO header\n // (the frame's empty body keeps the header — that's the figma behavior).\n if (!externalUrl) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <GoogleSheetsIcon className=\"mb-4 h-16 w-16 text-ods-text-secondary\" />\n <p className=\"text-ods-text-secondary\">Google Sheet URL not configured</p>\n </div>\n );\n }\n\n return (\n <EmbedViewerFrame\n icon={<GoogleSheetsIcon className=\"h-5 w-5 shrink-0\" />}\n title={displayName}\n actions={\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={toGoogleSheetsOriginalUrl(externalUrl)}\n openInNewTab\n leftIcon={<GoogleSheetsIcon className=\"h-4 w-4\" />}\n rightIcon={<ExternalLink className=\"h-4 w-4\" />}\n className=\"w-full sm:w-auto\"\n >\n Open in Google Sheets\n </Button>\n }\n src={toGoogleSheetsEmbedUrl(externalUrl)}\n height={height}\n />\n );\n}\n","'use client';\n\nimport { Download, Eye } from 'lucide-react';\nimport { AdobePdfIcon } from '../icons-v2-generated';\nimport { Button } from '../ui';\nimport { EmbedViewerFrame } from './embed-viewer-frame';\n\nexport interface PdfViewerProps {\n src: string;\n fileName?: string;\n onPreview?: () => void;\n onDownload?: () => void;\n height?: string;\n}\n\nexport function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfViewerProps) {\n const displayName = fileName || 'PDF Document';\n\n // Historical shape: no src at all → standalone empty state with NO header.\n if (!src) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AdobePdfIcon className=\"mb-4 h-16 w-16 text-ods-text-secondary\" />\n <p className=\"text-ods-text-secondary\">PDF file not available</p>\n </div>\n );\n }\n\n return (\n <EmbedViewerFrame\n icon={<AdobePdfIcon className=\"h-5 w-5 shrink-0\" />}\n title={displayName}\n actions={\n <div className=\"flex w-full items-center gap-2 sm:w-auto\">\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={onPreview ? undefined : src}\n openInNewTab={!onPreview}\n onClick={onPreview}\n leftIcon={<Eye className=\"h-4 w-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Preview\n </Button>\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={onDownload ? undefined : src}\n openInNewTab={!onDownload}\n onClick={onDownload}\n leftIcon={<Download className=\"h-4 w-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Download\n </Button>\n </div>\n }\n src={src}\n height={height}\n />\n );\n}\n"]}
|
|
@@ -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
|
|
4
|
+
var _chunkXVSA4565cjs = require('./chunk-XVSA4565.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
var _chunkTLLJIGTPcjs = require('./chunk-TLLJIGTP.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 =
|
|
132
|
+
var DEFAULT_FOLDER_INDEX_FILE2 = _chunkXVSA4565cjs.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-
|
|
360
|
+
//# sourceMappingURL=chunk-TKASQOSM.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RPHRBZG6.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-RPHRBZG6.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-TKASQOSM.cjs","../src/components/navigation/sticky-section-nav.tsx","../src/components/navigation/multi-level-navigation.tsx"],"names":["jsx","DEFAULT_FOLDER_INDEX_FILE"],"mappings":"AAAA,6rBAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACRA,8BAAyD;AAmCnD,+CAAA;AAbC,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,aAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,eAAA,EAAiB,MAAA;AAAA,EACjB,YAAA,EAAc;AAChB,CAAA,EAA0B;AACxB,EAAA,MAAM,UAAA,EAAY,QAAA,CAAS,OAAA,EAAS,EAAA;AAEpC,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,kCAAA,oBAAG,EAAsB,SAAS,CAAA,EAEhD,QAAA,EAAA;AAAA,oBAAA,6BAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,wBAAA;AAAA,QACV,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,KAAA;AAAA,UACP,MAAA,EAAQ,CAAA,EAAA;AACP,UAAA;AACI,UAAA;AACP,QAAA;AAAA,MAAA;AACF,IAAA;AAEc,IAAA;AAGT,MAAA;AACE,QAAA;AAAA,QAAA;AACC,UAAA;AACO,UAAA;AACL,YAAA;AACO,YAAA;AACP,YAAA;AACC,YAAA;AACI,YAAA;AACL,YAAA;AACF,UAAA;AAAA,QAAA;AACF,MAAA;AAIF,sBAAA;AAAC,QAAA;AAAA,QAAA;AACU,UAAA;AACT,UAAA;AAEA,UAAA;AAAC,YAAA;AAAA,YAAA;AACC,cAAA;AACE,gBAAA;AACA,gBAAA;AAGF,cAAA;AAEC,cAAA;AAAQ,YAAA;AACX,UAAA;AAAA,QAAA;AACF,MAAA;AACF,IAAA;AAEJ,EAAA;AAEJ;AAKgB;AAMP,EAAA;AACD,EAAA;AACW,EAAA;AAMX,EAAA;AACmB,IAAA;AACf,MAAA;AACD,MAAA;AAGL,MAAA;AACA,MAAA;AAEA,MAAA;AAGW,MAAA;AACT,QAAA;AACI,MAAA;AACR,IAAA;AACO,IAAA;AACT,EAAA;AAGgB,EAAA;AACL,IAAA;AACI,MAAA;AACA,MAAA;AACD,QAAA;AACV,MAAA;AACD,IAAA;AACU,EAAA;AAGG,EAAA;AACR,IAAA;AACA,MAAA;AAEE,MAAA;AAGF,MAAA;AAES,MAAA;AACL,QAAA;AACF,QAAA;AACF,UAAA;AACA,UAAA;AACF,QAAA;AACF,MAAA;AAEA,MAAA;AACF,IAAA;AAGI,IAAA;AACE,IAAA;AACS,MAAA;AACb,MAAA;AACF,IAAA;AAEO,IAAA;AACM,IAAA;AAEA,IAAA;AACJ,MAAA;AACM,MAAA;AACf,IAAA;AACY,EAAA;AAEP,EAAA;AACL,IAAA;AACA,IAAA;AACF,EAAA;AACF;AD/CmB;AACA;AE9HV;AA6FCA;AAxDJC;AAaG;AAKD,EAAA;AAKF,EAAA;AAEY,IAAA;AAChB,EAAA;AACS,EAAA;AACH,EAAA;AAEF,EAAA;AACK,IAAA;AACT,EAAA;AAII,EAAA;AACK,IAAA;AACT,EAAA;AACO,EAAA;AACT;AAEgB;AACd,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAC4B;AACb,EAAA;AAEX,IAAA;AAMJ,EAAA;AAGE,EAAA;AAEK,IAAA;AAAA,IAAA;AAEC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACO,MAAA;AACP,MAAA;AAAA,IAAA;AAPU,IAAA;AAUhB,EAAA;AAEJ;AAYS;AACP,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACsB;AAChB,EAAA;AACA,EAAA;AAGW,EAAA;AACX,EAAA;AAGJ,EAAA;AACE,oBAAA;AACG,MAAA;AAAA,MAAA;AACY,QAAA;AACT,UAAA;AACA,UAAA;AACF,QAAA;AAEA,QAAA;AAAA,0BAAA;AACE,4BAAA;AAAC,cAAA;AAAA,cAAA;AACC,gBAAA;AACE,kBAAA;AACC,kBAAA;AACD,kBAAA;AACF,gBAAA;AACA,gBAAA;AACA,gBAAA;AAEA,gBAAA;AAAA,kCAAA;AAWA,kCAAA;AAGC,kBAAA;AAGC,gBAAA;AAAA,cAAA;AAEJ,YAAA;AAEC,YAAA;AACE,cAAA;AAAA,cAAA;AACC,gBAAA;AACA,gBAAA;AACE,kBAAA;AACA,kBAAA;AACE,oBAAA;AACF,kBAAA;AACE,oBAAA;AACF,kBAAA;AACF,gBAAA;AACA,gBAAA;AAEC,gBAAA;AAAkF,cAAA;AACrF,YAAA;AAEJ,UAAA;AAEC,UAAA;AAC2G,QAAA;AAAA,MAAA;AAGhH,IAAA;AAEgB,IAAA;AAGT,MAAA;AAAA,MAAA;AAEO,QAAA;AACN,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACO,QAAA;AACP,QAAA;AAAA,MAAA;AAPW,MAAA;AAUjB,IAAA;AAEJ,EAAA;AAEJ;AAEgB;AACd,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AAC4B;AACb,EAAA;AAEX,IAAA;AAMJ,EAAA;AAGE,EAAA;AAEK,IAAA;AAAA,IAAA;AAEC,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACA,MAAA;AACO,MAAA;AACP,MAAA;AAAA,IAAA;AAPU,IAAA;AAUhB,EAAA;AAEJ;AAES;AACP,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACsB;AAChB,EAAA;AACA,EAAA;AAEW,EAAA;AACX,EAAA;AAGJ,EAAA;AACE,oBAAA;AACG,MAAA;AAAA,MAAA;AACY,QAAA;AACT,UAAA;AACA,UAAA;AACF,QAAA;AAEA,QAAA;AAAA,0BAAA;AACE,4BAAA;AAAC,cAAA;AAAA,cAAA;AACC,gBAAA;AACE,kBAAA;AACC,kBAAA;AACD,kBAAA;AACF,gBAAA;AACA,gBAAA;AAEA,gBAAA;AAAA,kCAAA;AAWA,kCAAA;AAGC,kBAAA;AAGC,gBAAA;AAAA,cAAA;AAEJ,YAAA;AAEC,YAAA;AACE,cAAA;AAAA,cAAA;AACC,gBAAA;AACA,gBAAA;AACE,kBAAA;AACA,kBAAA;AACE,oBAAA;AACF,kBAAA;AACE,oBAAA;AACF,kBAAA;AACF,gBAAA;AACA,gBAAA;AAEC,gBAAA;AAA0F,cAAA;AAC7F,YAAA;AAEJ,UAAA;AAEC,UAAA;AAC2G,QAAA;AAAA,MAAA;AAGhH,IAAA;AAEgB,IAAA;AAGT,MAAA;AAAA,MAAA;AAEO,QAAA;AACN,QAAA;AACA,QAAA;AACA,QAAA;AACA,QAAA;AACO,QAAA;AACP,QAAA;AAAA,MAAA;AAPW,MAAA;AAUjB,IAAA;AAEJ,EAAA;AAEJ;AFXmB;AACA;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-TKASQOSM.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"]}
|
|
@@ -3,16 +3,16 @@ import {
|
|
|
3
3
|
FileDownloadCard,
|
|
4
4
|
GoogleSheetsViewer,
|
|
5
5
|
PdfViewer
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-OJR7KKCI.js";
|
|
7
7
|
import {
|
|
8
8
|
MobileNavigationDropdown,
|
|
9
9
|
MultiLevelNavigation,
|
|
10
10
|
StickySectionNav
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-7I4DGWF5.js";
|
|
12
12
|
import {
|
|
13
13
|
DocSearchBar,
|
|
14
14
|
useDocSearch
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-I5ZKHDT6.js";
|
|
16
16
|
import {
|
|
17
17
|
CategorySidebarSkeleton,
|
|
18
18
|
DEFAULT_FOLDER_INDEX_FILE,
|
|
@@ -22,7 +22,7 @@ import {
|
|
|
22
22
|
findDocNodeByPath,
|
|
23
23
|
getDocAncestorNodeIds,
|
|
24
24
|
stripFolderIndexFromPath
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-3PSNWOAP.js";
|
|
26
26
|
import {
|
|
27
27
|
contentFetch
|
|
28
28
|
} from "./chunk-MT5A25AX.js";
|
|
@@ -1050,4 +1050,4 @@ export {
|
|
|
1050
1050
|
EmbedSkeleton,
|
|
1051
1051
|
DocsHubPage
|
|
1052
1052
|
};
|
|
1053
|
-
//# sourceMappingURL=chunk-
|
|
1053
|
+
//# sourceMappingURL=chunk-V54WTP2E.js.map
|
|
@@ -4,16 +4,16 @@
|
|
|
4
4
|
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
var
|
|
7
|
+
var _chunkXVSA4565cjs = require('./chunk-XVSA4565.cjs');
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkWDE7ETA5cjs = require('./chunk-WDE7ETA5.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
var _chunkQVSVRG7Icjs = require('./chunk-QVSVRG7I.cjs');
|
|
14
14
|
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _chunkBSETJKSWcjs = require('./chunk-BSETJKSW.cjs');
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
|
|
@@ -29,7 +29,7 @@ var _chunkTLLJIGTPcjs = require('./chunk-TLLJIGTP.cjs');
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
|
|
32
|
-
var
|
|
32
|
+
var _chunkBASKR3Z4cjs = require('./chunk-BASKR3Z4.cjs');
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
|
|
@@ -70,27 +70,27 @@ SoftwareInfo.displayName = "SoftwareInfo";
|
|
|
70
70
|
// src/components/platform/SoftwareSourceBadge.tsx
|
|
71
71
|
|
|
72
72
|
var sourceConfig = {
|
|
73
|
-
apps: { label: "App", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
74
|
-
chrome_extensions: { label: "Chrome", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
75
|
-
firefox_addons: { label: "Firefox", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
76
|
-
safari_extensions: { label: "Safari", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
77
|
-
ie_extensions: { label: "IE", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
78
|
-
vscode_extensions: { label: "VS Code", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
79
|
-
atom_packages: { label: "Atom", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
80
|
-
homebrew_packages: { label: "Homebrew", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
81
|
-
npm_packages: { label: "NPM", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
82
|
-
python_packages: { label: "Python", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
83
|
-
apt_sources: { label: "APT", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
84
|
-
deb_packages: { label: "DEB", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
85
|
-
rpm_packages: { label: "RPM", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
86
|
-
yum_sources: { label: "YUM", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
87
|
-
portage_packages: { label: "Portage", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
88
|
-
chocolatey_packages: { label: "Chocolatey", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
89
|
-
programs: { label: "Windows", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
90
|
-
pkg_packages: { label: "PKG", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
73
|
+
apps: { label: "App", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.MacOSIcon, { className: "h-4 w-4" }) },
|
|
74
|
+
chrome_extensions: { label: "Chrome", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
75
|
+
firefox_addons: { label: "Firefox", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
76
|
+
safari_extensions: { label: "Safari", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
77
|
+
ie_extensions: { label: "IE", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
78
|
+
vscode_extensions: { label: "VS Code", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
79
|
+
atom_packages: { label: "Atom", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
80
|
+
homebrew_packages: { label: "Homebrew", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.MacOSIcon, { className: "h-4 w-4" }) },
|
|
81
|
+
npm_packages: { label: "NPM", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
82
|
+
python_packages: { label: "Python", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) },
|
|
83
|
+
apt_sources: { label: "APT", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.LinuxIcon, { className: "h-4 w-4" }) },
|
|
84
|
+
deb_packages: { label: "DEB", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.LinuxIcon, { className: "h-4 w-4" }) },
|
|
85
|
+
rpm_packages: { label: "RPM", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.LinuxIcon, { className: "h-4 w-4" }) },
|
|
86
|
+
yum_sources: { label: "YUM", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.LinuxIcon, { className: "h-4 w-4" }) },
|
|
87
|
+
portage_packages: { label: "Portage", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.LinuxIcon, { className: "h-4 w-4" }) },
|
|
88
|
+
chocolatey_packages: { label: "Chocolatey", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.WindowsIcon, { className: "h-4 w-4" }) },
|
|
89
|
+
programs: { label: "Windows", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.WindowsIcon, { className: "h-4 w-4" }) },
|
|
90
|
+
pkg_packages: { label: "PKG", icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) }
|
|
91
91
|
};
|
|
92
92
|
var SoftwareSourceBadge = ({ source, className }) => {
|
|
93
|
-
const config = sourceConfig[source] || { label: source, icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
93
|
+
const config = sourceConfig[source] || { label: source, icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.PackageIcon, { className: "h-4 w-4" }) };
|
|
94
94
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "span", { className: _chunkTLLJIGTPcjs.cn.call(void 0, "inline-flex items-center gap-2 text-ods-text-primary", className), children: [
|
|
95
95
|
config.icon,
|
|
96
96
|
config.label
|
|
@@ -114,7 +114,7 @@ var CveLink = ({ cveId, className }) => {
|
|
|
114
114
|
),
|
|
115
115
|
children: [
|
|
116
116
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: cveId }),
|
|
117
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
117
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBASKR3Z4cjs.CustomExternalLinkIcon, { className: "h-4 w-4 text-ods-text-secondary transition-colors group-hover:text-ods-accent" })
|
|
118
118
|
]
|
|
119
119
|
}
|
|
120
120
|
);
|
|
@@ -124,7 +124,7 @@ CveLink.displayName = "CveLink";
|
|
|
124
124
|
// src/components/platform/ToolBadge.tsx
|
|
125
125
|
|
|
126
126
|
var ToolBadge = ({ toolType, className, iconClassName }) => {
|
|
127
|
-
const label =
|
|
127
|
+
const label = _chunkXVSA4565cjs.getToolLabel.call(void 0, toolType);
|
|
128
128
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex items-center gap-1 text-ods-text-secondary", className), children: [
|
|
129
129
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkTLLJIGTPcjs.ToolIcon, { toolType, className: iconClassName, size: 16 }),
|
|
130
130
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-primary text-h4", children: label })
|
|
@@ -135,42 +135,42 @@ ToolBadge.displayName = "ToolBadge";
|
|
|
135
135
|
// src/components/platform/ShellTypeBadge.tsx
|
|
136
136
|
|
|
137
137
|
var shellIconMap = {
|
|
138
|
-
[
|
|
138
|
+
[_chunkXVSA4565cjs.ShellTypeValues.POWERSHELL]: {
|
|
139
139
|
icon: _chunkYRTMAXLEcjs.PowershellLogoGreyIcon,
|
|
140
140
|
props: { size: 16, className: "text-ods-text-secondary" }
|
|
141
141
|
},
|
|
142
|
-
[
|
|
143
|
-
icon:
|
|
142
|
+
[_chunkXVSA4565cjs.ShellTypeValues.CMD]: {
|
|
143
|
+
icon: _chunkBASKR3Z4cjs.CmdIcon,
|
|
144
144
|
props: { size: 16, color: "var(--color-text-secondary)" }
|
|
145
145
|
},
|
|
146
|
-
[
|
|
147
|
-
icon:
|
|
146
|
+
[_chunkXVSA4565cjs.ShellTypeValues.BASH]: {
|
|
147
|
+
icon: _chunkBASKR3Z4cjs.BashIcon,
|
|
148
148
|
props: { size: 16, color: "var(--color-text-secondary)" }
|
|
149
149
|
},
|
|
150
|
-
[
|
|
150
|
+
[_chunkXVSA4565cjs.ShellTypeValues.PYTHON]: {
|
|
151
151
|
icon: _chunkYRTMAXLEcjs.PythonLogoIcon,
|
|
152
152
|
props: { size: 16, className: "text-ods-text-secondary" }
|
|
153
153
|
},
|
|
154
|
-
[
|
|
155
|
-
icon:
|
|
154
|
+
[_chunkXVSA4565cjs.ShellTypeValues.NUSHELL]: {
|
|
155
|
+
icon: _chunkBASKR3Z4cjs.NushellIcon,
|
|
156
156
|
props: { size: 16, color: "var(--color-text-secondary)" }
|
|
157
157
|
},
|
|
158
|
-
[
|
|
159
|
-
icon:
|
|
158
|
+
[_chunkXVSA4565cjs.ShellTypeValues.DENO]: {
|
|
159
|
+
icon: _chunkBASKR3Z4cjs.DenoIcon,
|
|
160
160
|
props: { size: 16, color: "var(--color-text-secondary)" }
|
|
161
161
|
},
|
|
162
|
-
[
|
|
163
|
-
icon:
|
|
162
|
+
[_chunkXVSA4565cjs.ShellTypeValues.SHELL]: {
|
|
163
|
+
icon: _chunkBASKR3Z4cjs.ShellIcon,
|
|
164
164
|
props: { size: 16, color: "var(--color-text-secondary)" }
|
|
165
165
|
}
|
|
166
166
|
};
|
|
167
167
|
var defaultIconConfig = {
|
|
168
|
-
icon:
|
|
168
|
+
icon: _chunkBASKR3Z4cjs.ShellIcon,
|
|
169
169
|
props: { size: 16, color: "var(--color-text-secondary)" }
|
|
170
170
|
};
|
|
171
171
|
var ShellTypeBadge = ({ shellType, className, iconClassName }) => {
|
|
172
172
|
const normalizedType = _optionalChain([shellType, 'optionalAccess', _ => _.toUpperCase, 'call', _2 => _2()]);
|
|
173
|
-
const label =
|
|
173
|
+
const label = _chunkXVSA4565cjs.getShellLabel.call(void 0, normalizedType);
|
|
174
174
|
const { icon: IconComponent, props: iconProps } = _nullishCoalesce(shellIconMap[normalizedType], () => ( defaultIconConfig));
|
|
175
175
|
const defaultIconClassName = "className" in iconProps ? iconProps.className : void 0;
|
|
176
176
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex items-center gap-1", className), children: [
|
|
@@ -186,7 +186,7 @@ function formatSupportedPlatforms(platforms) {
|
|
|
186
186
|
if (!platforms || platforms.length === 0) {
|
|
187
187
|
return "All Platforms";
|
|
188
188
|
}
|
|
189
|
-
return platforms.map((platform) =>
|
|
189
|
+
return platforms.map((platform) => _chunkXVSA4565cjs.getOSLabel.call(void 0, platform)).join(", ");
|
|
190
190
|
}
|
|
191
191
|
function InfoCell({ label, value, avatar, className }) {
|
|
192
192
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex min-w-0 items-center gap-2", className), children: [
|
|
@@ -206,7 +206,7 @@ var ScriptInfoSection = ({
|
|
|
206
206
|
author,
|
|
207
207
|
className
|
|
208
208
|
}) => {
|
|
209
|
-
const shellLabel =
|
|
209
|
+
const shellLabel = _chunkXVSA4565cjs.getShellLabel.call(void 0, shellType);
|
|
210
210
|
const platformsLabel = formatSupportedPlatforms(supportedPlatforms);
|
|
211
211
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "overflow-hidden rounded-[6px] border border-ods-border bg-ods-card", className), children: [
|
|
212
212
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "border-b border-ods-border p-4", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-1", children: [
|
|
@@ -450,7 +450,7 @@ function OnboardingWalkthrough({
|
|
|
450
450
|
isStepSkipped,
|
|
451
451
|
allStepsComplete,
|
|
452
452
|
markMultipleComplete
|
|
453
|
-
} =
|
|
453
|
+
} = _chunkWDE7ETA5cjs.useOnboardingState.call(void 0, storageKey);
|
|
454
454
|
const hasAutoMarkedRef = _react.useRef.call(void 0, false);
|
|
455
455
|
const autoMarkingInProgressRef = _react.useRef.call(void 0, false);
|
|
456
456
|
const lastCompletionStatusRef = _react.useRef.call(void 0, null);
|
|
@@ -529,7 +529,7 @@ function OnboardingWalkthrough({
|
|
|
529
529
|
const isAllComplete = allStepsComplete(steps);
|
|
530
530
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "w-full space-y-4", className), children: [
|
|
531
531
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-0", children: [
|
|
532
|
-
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className:
|
|
532
|
+
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: _chunkBSETJKSWcjs.SECTION_HEADING_CLASS, children: "Get Started" }),
|
|
533
533
|
isLoadingCompletion ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-[48px] w-full animate-pulse rounded-[6px] bg-ods-border md:w-[160px]" }) : isAllComplete ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "accent", onClick: handleDismiss, className: "w-full md:w-auto", children: "Close Onboarding" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "outline", onClick: handleDismiss, className: "w-full md:w-auto", children: "Skip Onboarding" })
|
|
534
534
|
] }),
|
|
535
535
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, spacing), children: steps.map((step) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
@@ -558,4 +558,4 @@ function OnboardingWalkthrough({
|
|
|
558
558
|
|
|
559
559
|
|
|
560
560
|
exports.SoftwareInfo = SoftwareInfo; exports.SoftwareSourceBadge = SoftwareSourceBadge; exports.CveLink = CveLink; exports.ToolBadge = ToolBadge; exports.ShellTypeBadge = ShellTypeBadge; exports.ScriptInfoSection = ScriptInfoSection; exports.ScriptArguments = ScriptArguments; exports.OnboardingStepCard = OnboardingStepCard; exports.OnboardingWalkthrough = OnboardingWalkthrough;
|
|
561
|
-
//# sourceMappingURL=chunk-
|
|
561
|
+
//# sourceMappingURL=chunk-VKKVWGFW.cjs.map
|