@flamingo-stack/openframe-frontend-core 0.0.575 → 0.0.576-snapshot.20260828115701
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-BGE7CKXC.js → chunk-2YCUEUIZ.js} +8 -8
- package/dist/{chunk-42PQFBUS.js → chunk-4D2BR756.js} +3 -3
- package/dist/{chunk-BTZF3JRS.js → chunk-4KR7JWKB.js} +4 -4
- package/dist/{chunk-7G23ANVM.cjs → chunk-5DPCIIJ7.cjs} +95 -95
- package/dist/{chunk-7G23ANVM.cjs.map → chunk-5DPCIIJ7.cjs.map} +1 -1
- package/dist/{chunk-K3XONUML.cjs → chunk-6FJABKPX.cjs} +11 -11
- package/dist/{chunk-K3XONUML.cjs.map → chunk-6FJABKPX.cjs.map} +1 -1
- package/dist/{chunk-K574Y2QR.cjs → chunk-6GJBSIRU.cjs} +3 -3
- package/dist/{chunk-K574Y2QR.cjs.map → chunk-6GJBSIRU.cjs.map} +1 -1
- package/dist/{chunk-7Z64COGD.cjs → chunk-72OIVRPG.cjs} +7 -7
- package/dist/{chunk-7Z64COGD.cjs.map → chunk-72OIVRPG.cjs.map} +1 -1
- package/dist/{chunk-XC7WPYPJ.cjs → chunk-75X6BRID.cjs} +171 -171
- package/dist/{chunk-XC7WPYPJ.cjs.map → chunk-75X6BRID.cjs.map} +1 -1
- package/dist/{chunk-QF5B6V4L.cjs → chunk-APFGR2KK.cjs} +41 -41
- package/dist/{chunk-QF5B6V4L.cjs.map → chunk-APFGR2KK.cjs.map} +1 -1
- package/dist/{chunk-2EPUD2VR.js → chunk-AQ5MZVYN.js} +3 -3
- package/dist/{chunk-T5DAFFK7.js → chunk-BBZ6NQL2.js} +2 -2
- package/dist/{chunk-IRJQH7RJ.cjs → chunk-CFTZAZ7R.cjs} +28 -28
- package/dist/{chunk-IRJQH7RJ.cjs.map → chunk-CFTZAZ7R.cjs.map} +1 -1
- package/dist/{chunk-UILNZL6J.cjs → chunk-CIUYHBAY.cjs} +5 -5
- package/dist/{chunk-UILNZL6J.cjs.map → chunk-CIUYHBAY.cjs.map} +1 -1
- package/dist/{chunk-QTVW5XBL.cjs → chunk-ET3Q4FIZ.cjs} +12 -12
- package/dist/{chunk-QTVW5XBL.cjs.map → chunk-ET3Q4FIZ.cjs.map} +1 -1
- package/dist/{chunk-IWISKP3F.js → chunk-FCVAVOXS.js} +3 -3
- package/dist/{chunk-PUL6X6HY.cjs → chunk-GDWBJFMG.cjs} +32 -32
- package/dist/{chunk-PUL6X6HY.cjs.map → chunk-GDWBJFMG.cjs.map} +1 -1
- package/dist/{chunk-ZQE7HN4Q.cjs → chunk-GPWU3PPR.cjs} +37 -37
- package/dist/{chunk-ZQE7HN4Q.cjs.map → chunk-GPWU3PPR.cjs.map} +1 -1
- package/dist/{chunk-BGZCZ2JS.cjs → chunk-HSOMYCUG.cjs} +11 -11
- package/dist/{chunk-BGZCZ2JS.cjs.map → chunk-HSOMYCUG.cjs.map} +1 -1
- package/dist/{chunk-DTSRMQIY.js → chunk-IQFXDS5O.js} +9 -9
- package/dist/{chunk-6D4RVZZJ.js → chunk-JCH6HGQD.js} +3 -3
- package/dist/{chunk-SIRFPFBQ.js → chunk-JQI726T3.js} +2 -2
- package/dist/{chunk-QDOBY3TP.cjs → chunk-KE2TCUOH.cjs} +327 -324
- package/dist/chunk-KE2TCUOH.cjs.map +1 -0
- package/dist/{chunk-7GLY26JF.js → chunk-LHR6AA65.js} +33 -6
- package/dist/chunk-LHR6AA65.js.map +1 -0
- package/dist/{chunk-OE7NV7H3.js → chunk-LYOGSVFO.js} +4 -4
- package/dist/{chunk-SPAAKHQA.cjs → chunk-MIY5FYX3.cjs} +8 -8
- package/dist/{chunk-SPAAKHQA.cjs.map → chunk-MIY5FYX3.cjs.map} +1 -1
- package/dist/{chunk-UPEIX7VG.js → chunk-NEKT67O5.js} +6 -6
- package/dist/{chunk-PBS4F534.js → chunk-NP3XN6ZX.js} +8 -5
- package/dist/chunk-NP3XN6ZX.js.map +1 -0
- package/dist/{chunk-3IUQLB47.cjs → chunk-NQCGDZJ3.cjs} +3 -3
- package/dist/{chunk-3IUQLB47.cjs.map → chunk-NQCGDZJ3.cjs.map} +1 -1
- package/dist/{chunk-BKXL7OYT.cjs → chunk-RCLJSENK.cjs} +6 -6
- package/dist/{chunk-BKXL7OYT.cjs.map → chunk-RCLJSENK.cjs.map} +1 -1
- package/dist/{chunk-WVKRSC65.js → chunk-RNUH5IHZ.js} +3 -3
- package/dist/{chunk-2IK6SB6F.js → chunk-RSMUAAPW.js} +4 -4
- package/dist/{chunk-KSKCQ3ZN.js → chunk-RUJKOU5F.js} +2 -2
- package/dist/{chunk-VIAZWBZ2.cjs → chunk-S4CLML75.cjs} +7 -7
- package/dist/{chunk-VIAZWBZ2.cjs.map → chunk-S4CLML75.cjs.map} +1 -1
- package/dist/{chunk-WAWMZSCP.js → chunk-THDGDYJ3.js} +6 -6
- package/dist/{chunk-KG7D35RU.js → chunk-TU32TSAK.js} +5 -5
- package/dist/{chunk-5QDGP3RI.js → chunk-U3SDSA5K.js} +5 -5
- package/dist/{chunk-SVUZUFT4.cjs → chunk-WOHHZZJK.cjs} +65 -65
- package/dist/{chunk-SVUZUFT4.cjs.map → chunk-WOHHZZJK.cjs.map} +1 -1
- package/dist/{chunk-3U2P63NQ.cjs → chunk-XBBCUC32.cjs} +15 -15
- package/dist/{chunk-3U2P63NQ.cjs.map → chunk-XBBCUC32.cjs.map} +1 -1
- package/dist/{chunk-GFSJXRX7.cjs → chunk-XBSW7IF6.cjs} +23 -23
- package/dist/{chunk-GFSJXRX7.cjs.map → chunk-XBSW7IF6.cjs.map} +1 -1
- package/dist/{chunk-RXJZXMDZ.cjs → chunk-XG2WNF4L.cjs} +26 -26
- package/dist/{chunk-RXJZXMDZ.cjs.map → chunk-XG2WNF4L.cjs.map} +1 -1
- package/dist/{chunk-S6LZN66D.cjs → chunk-YHNIPSG6.cjs} +33 -6
- package/dist/chunk-YHNIPSG6.cjs.map +1 -0
- package/dist/{chunk-5DRCLGOX.js → chunk-YLNZPFDW.js} +2 -2
- package/dist/{chunk-QQ5ZVCD4.js → chunk-Z2FZ5HP2.js} +3 -3
- package/dist/{chunk-ISULYCGY.js → chunk-ZBJ6XSDO.js} +4 -4
- package/dist/components/calendar.cjs +4 -4
- package/dist/components/calendar.js +1 -1
- package/dist/components/case-studies/index.cjs +12 -12
- package/dist/components/case-studies/index.js +6 -6
- package/dist/components/chat/index.cjs +4 -4
- package/dist/components/chat/index.js +3 -3
- package/dist/components/contact/index.cjs +7 -7
- package/dist/components/contact/index.js +6 -6
- package/dist/components/docs/index.cjs +10 -10
- package/dist/components/docs/index.js +9 -9
- package/dist/components/embeds/index.cjs +7 -7
- package/dist/components/embeds/index.js +6 -6
- package/dist/components/faq/index.cjs +7 -7
- package/dist/components/faq/index.js +6 -6
- package/dist/components/features/index.cjs +6 -6
- package/dist/components/features/index.js +5 -5
- package/dist/components/help-center-pages/index.cjs +28 -28
- package/dist/components/help-center-pages/index.js +19 -19
- package/dist/components/index.cjs +153 -153
- package/dist/components/index.js +19 -19
- package/dist/components/meeting-scheduler/index.cjs +52 -48
- package/dist/components/meeting-scheduler/index.cjs.map +1 -1
- package/dist/components/meeting-scheduler/index.d.ts.map +1 -1
- package/dist/components/meeting-scheduler/index.js +17 -13
- package/dist/components/meeting-scheduler/index.js.map +1 -1
- package/dist/components/navigation/index.cjs +9 -9
- package/dist/components/navigation/index.js +8 -8
- package/dist/components/onboarding-guides/index.cjs +9 -9
- package/dist/components/onboarding-guides/index.js +8 -8
- package/dist/components/related-content/index.cjs +5 -5
- package/dist/components/related-content/index.js +4 -4
- package/dist/components/tickets/index.cjs +11 -11
- package/dist/components/tickets/index.js +10 -10
- package/dist/components/ui/button/button-styles.d.ts +4 -0
- package/dist/components/ui/button/button-styles.d.ts.map +1 -1
- package/dist/components/ui/button/button.d.ts.map +1 -1
- package/dist/components/ui/dropdown-button.d.ts +9 -1
- package/dist/components/ui/dropdown-button.d.ts.map +1 -1
- package/dist/components/ui/file-manager/index.cjs +11 -11
- package/dist/components/ui/file-manager/index.js +1 -1
- package/dist/components/ui/index.cjs +6 -6
- package/dist/components/ui/index.js +5 -5
- package/dist/index.cjs +10 -10
- package/dist/index.js +9 -9
- package/package.json +2 -2
- package/src/components/meeting-scheduler/index.tsx +16 -14
- package/src/components/ui/button/button-styles.ts +14 -0
- package/src/components/ui/button/button.tsx +24 -5
- package/src/components/ui/dropdown-button.tsx +11 -0
- package/dist/chunk-7GLY26JF.js.map +0 -1
- package/dist/chunk-PBS4F534.js.map +0 -1
- package/dist/chunk-QDOBY3TP.cjs.map +0 -1
- package/dist/chunk-S6LZN66D.cjs.map +0 -1
- /package/dist/{chunk-BGE7CKXC.js.map → chunk-2YCUEUIZ.js.map} +0 -0
- /package/dist/{chunk-42PQFBUS.js.map → chunk-4D2BR756.js.map} +0 -0
- /package/dist/{chunk-BTZF3JRS.js.map → chunk-4KR7JWKB.js.map} +0 -0
- /package/dist/{chunk-2EPUD2VR.js.map → chunk-AQ5MZVYN.js.map} +0 -0
- /package/dist/{chunk-T5DAFFK7.js.map → chunk-BBZ6NQL2.js.map} +0 -0
- /package/dist/{chunk-IWISKP3F.js.map → chunk-FCVAVOXS.js.map} +0 -0
- /package/dist/{chunk-DTSRMQIY.js.map → chunk-IQFXDS5O.js.map} +0 -0
- /package/dist/{chunk-6D4RVZZJ.js.map → chunk-JCH6HGQD.js.map} +0 -0
- /package/dist/{chunk-SIRFPFBQ.js.map → chunk-JQI726T3.js.map} +0 -0
- /package/dist/{chunk-OE7NV7H3.js.map → chunk-LYOGSVFO.js.map} +0 -0
- /package/dist/{chunk-UPEIX7VG.js.map → chunk-NEKT67O5.js.map} +0 -0
- /package/dist/{chunk-WVKRSC65.js.map → chunk-RNUH5IHZ.js.map} +0 -0
- /package/dist/{chunk-2IK6SB6F.js.map → chunk-RSMUAAPW.js.map} +0 -0
- /package/dist/{chunk-KSKCQ3ZN.js.map → chunk-RUJKOU5F.js.map} +0 -0
- /package/dist/{chunk-WAWMZSCP.js.map → chunk-THDGDYJ3.js.map} +0 -0
- /package/dist/{chunk-KG7D35RU.js.map → chunk-TU32TSAK.js.map} +0 -0
- /package/dist/{chunk-5QDGP3RI.js.map → chunk-U3SDSA5K.js.map} +0 -0
- /package/dist/{chunk-5DRCLGOX.js.map → chunk-YLNZPFDW.js.map} +0 -0
- /package/dist/{chunk-QQ5ZVCD4.js.map → chunk-Z2FZ5HP2.js.map} +0 -0
- /package/dist/{chunk-ISULYCGY.js.map → chunk-ZBJ6XSDO.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkKE2TCUOHcjs = require('./chunk-KE2TCUOH.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
|
|
@@ -12,10 +12,10 @@ var _chunk2BFZHTSDcjs = require('./chunk-2BFZHTSD.cjs');
|
|
|
12
12
|
var _chunkGSQM4PDRcjs = require('./chunk-GSQM4PDR.cjs');
|
|
13
13
|
|
|
14
14
|
|
|
15
|
-
var
|
|
15
|
+
var _chunkMIY5FYX3cjs = require('./chunk-MIY5FYX3.cjs');
|
|
16
16
|
|
|
17
17
|
|
|
18
|
-
var
|
|
18
|
+
var _chunkYHNIPSG6cjs = require('./chunk-YHNIPSG6.cjs');
|
|
19
19
|
|
|
20
20
|
// src/components/embeds/file-download-card.tsx
|
|
21
21
|
var _lucidereact = require('lucide-react');
|
|
@@ -27,10 +27,10 @@ function FileDownloadCard({ fileName, mimeType, fileSize, fileUrl }) {
|
|
|
27
27
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-ods-text-primary text-h3", children: fileName || "File" }),
|
|
28
28
|
/* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-2 flex items-center justify-center gap-3 text-ods-text-secondary text-h6", children: [
|
|
29
29
|
mimeType && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: mimeType }),
|
|
30
|
-
typeof fileSize === "number" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children:
|
|
30
|
+
typeof fileSize === "number" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkMIY5FYX3cjs.formatFileSize.call(void 0, fileSize) })
|
|
31
31
|
] })
|
|
32
32
|
] }),
|
|
33
|
-
fileUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
33
|
+
fileUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYHNIPSG6cjs.Button, { variant: "accent", href: fileUrl, openInNewTab: true, leftIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Download, { className: "h-4 w-4" }), children: "Download File" })
|
|
34
34
|
] }) });
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -46,12 +46,12 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
|
|
|
46
46
|
] });
|
|
47
47
|
}
|
|
48
48
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
49
|
-
|
|
49
|
+
_chunkKE2TCUOHcjs.EmbedViewerFrame,
|
|
50
50
|
{
|
|
51
51
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGSQM4PDRcjs.GoogleSheetsIcon, { className: "h-5 w-5 shrink-0" }),
|
|
52
52
|
title: displayName,
|
|
53
53
|
actions: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
54
|
-
|
|
54
|
+
_chunkYHNIPSG6cjs.Button,
|
|
55
55
|
{
|
|
56
56
|
variant: "outline",
|
|
57
57
|
size: "small-legacy",
|
|
@@ -81,13 +81,13 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
|
|
|
81
81
|
] });
|
|
82
82
|
}
|
|
83
83
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
84
|
-
|
|
84
|
+
_chunkKE2TCUOHcjs.EmbedViewerFrame,
|
|
85
85
|
{
|
|
86
86
|
icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkGSQM4PDRcjs.AdobePdfIcon, { className: "h-5 w-5 shrink-0" }),
|
|
87
87
|
title: displayName,
|
|
88
88
|
actions: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex w-full items-center gap-2 sm:w-auto", children: [
|
|
89
89
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
90
|
-
|
|
90
|
+
_chunkYHNIPSG6cjs.Button,
|
|
91
91
|
{
|
|
92
92
|
variant: "outline",
|
|
93
93
|
size: "small-legacy",
|
|
@@ -100,7 +100,7 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
|
|
|
100
100
|
}
|
|
101
101
|
),
|
|
102
102
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
103
|
-
|
|
103
|
+
_chunkYHNIPSG6cjs.Button,
|
|
104
104
|
{
|
|
105
105
|
variant: "outline",
|
|
106
106
|
size: "small-legacy",
|
|
@@ -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-6FJABKPX.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-6FJABKPX.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-6FJABKPX.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});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkS4CLML75cjs = require('./chunk-S4CLML75.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
var _chunkPRPZBXWZcjs = require('./chunk-PRPZBXWZ.cjs');
|
|
@@ -116,7 +116,7 @@ function PersistentPaginationWrapper({
|
|
|
116
116
|
},
|
|
117
117
|
"aria-hidden": isPaginationDisabled,
|
|
118
118
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
119
|
-
|
|
119
|
+
_chunkS4CLML75cjs.UnifiedPagination,
|
|
120
120
|
{
|
|
121
121
|
currentPage: displayCurrentPage,
|
|
122
122
|
totalPages: displayTotalPages,
|
|
@@ -136,4 +136,4 @@ function PersistentPaginationWrapper({
|
|
|
136
136
|
|
|
137
137
|
|
|
138
138
|
exports.PersistentPagination = PersistentPagination; exports.usePaginationLoading = usePaginationLoading; exports.PersistentPaginationWrapper = PersistentPaginationWrapper;
|
|
139
|
-
//# sourceMappingURL=chunk-
|
|
139
|
+
//# sourceMappingURL=chunk-6GJBSIRU.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-6GJBSIRU.cjs","../src/components/persistent-pagination.tsx"],"names":[],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACwFQ,+CAAA;AA/BD,SAAS,oBAAA,CAAqB;AAAA,EACnC,SAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,SAAA;AAAA,EACA,gBAAA,EAAkB,GAAA;AAAA,EAClB,mBAAA,EAAqB;AACvB,CAAA,EAA8B;AAI5B,EAAA,uBACE,8BAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,kCAAA;AAAA,QACT,qCAAA;AAAA,QACA,kCAAA;AAAA,QACA,UAAA,GAAa,qBAAA;AAAA,QACb;AAAA,MACF,CAAA;AAAA,MACA,KAAA,EAAO;AAAA,QACL,OAAA,EAAS,UAAA,EAAY,gBAAA,EAAkB,CAAA;AAAA,QACvC,kBAAA,EAAoB,CAAA,EAAA;AACtB,MAAA;AACK,MAAA;AACM,MAAA;AACA,MAAA;AACG,MAAA;AAGb,MAAA;AACC,QAAA;AAA0D,UAAA;AACJ,UAAA;AAAY,UAAA;AAAK,UAAA;AACvE,QAAA;AAIF,wBAAA;AAAC,UAAA;AAAA,UAAA;AACe,YAAA;AACP,YAAA;AACL,cAAA;AACF,YAAA;AACa,YAAA;AAEZ,YAAA;AAAA,UAAA;AACH,QAAA;AAAA,MAAA;AAAA,IAAA;AAGF,EAAA;AAEJ;AAKgB;AACR,EAAA;AAEkB,EAAA;AACT,IAAA;AACG,IAAA;AACK,IAAA;AACD,IAAA;AACtB,EAAA;AAE0B,EAAA;AACT,IAAA;AACU,MAAA;AACzB,IAAA;AACe,IAAA;AACjB,EAAA;AAEO,EAAA;AACL,IAAA;AACA,IAAA;AACA,IAAA;AACF,EAAA;AACF;AAcgB;AACd,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACA,EAAA;AACmC;AAGhB,EAAA;AACO,EAAA;AACC,EAAA;AAErB,EAAA;AACgB,EAAA;AAGpB,EAAA;AAAC,IAAA;AAAA,IAAA;AACY,MAAA;AACT,QAAA;AACC,QAAA;AACD,QAAA;AACF,MAAA;AACO,MAAA;AACI,QAAA;AACW,QAAA;AACtB,MAAA;AACK,MAAA;AACM,MAAA;AACA,MAAA;AACG,MAAA;AACI,MAAA;AAGhB,MAAA;AAAc,QAAA;AAShB,wBAAA;AAAC,UAAA;AAAA,UAAA;AACe,YAAA;AACP,YAAA;AACL,cAAA;AACF,YAAA;AACa,YAAA;AAKb,YAAA;AAAC,cAAA;AAAA,cAAA;AACc,gBAAA;AACD,gBAAA;AACZ,gBAAA;AAAiD,gBAAA;AAAA,cAAA;AACnD,YAAA;AAAA,UAAA;AACF,QAAA;AAAA,MAAA;AAAA,IAAA;AAGF,EAAA;AAEJ;ADvF6B;AACA;AACA;AACA;AACA;AACA","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-6GJBSIRU.cjs","sourcesContent":[null,"'use client';\n\nimport type { ReactNode } from 'react';\nimport { cn } from '../utils/cn';\nimport { UnifiedPagination } from './unified-pagination';\n\ninterface PersistentPaginationProps {\n /**\n * Whether pagination is currently in a loading state\n */\n isLoading: boolean;\n /**\n * The pagination component\n */\n children: ReactNode;\n /**\n * Current page number\n */\n currentPage: number;\n /**\n * Total number of pages\n */\n totalPages: number;\n /**\n * Additional CSS classes\n */\n className?: string;\n /**\n * Disabled opacity (0-1)\n */\n disabledOpacity?: number;\n /**\n * Transition duration in milliseconds\n */\n transitionDuration?: number;\n /**\n * Whether to show loading state in pagination\n */\n showLoadingState?: boolean;\n}\n\n/**\n * PersistentPagination\n *\n * A wrapper component that keeps pagination visible during loading states\n * but provides visual feedback that it's temporarily disabled.\n *\n * Features:\n * - Maintains pagination visibility during content loading\n * - Disables interaction but preserves layout\n * - Shows current page context even when loading\n * - Provides accessibility support for loading states\n * - Smooth transitions between enabled/disabled states\n *\n * Usage:\n * ```tsx\n * <PersistentPagination\n * isLoading={isLoadingVendors}\n * currentPage={currentPage}\n * totalPages={totalPages}\n * >\n * <Pagination currentPage={currentPage} totalPages={totalPages} />\n * </PersistentPagination>\n * ```\n */\nexport function PersistentPagination({\n isLoading,\n children,\n currentPage,\n totalPages,\n className,\n disabledOpacity = 0.5,\n transitionDuration = 300,\n}: PersistentPaginationProps) {\n // ALWAYS show pagination for predictable layout - just gray it out when not needed\n // Removed condition that hides pagination completely\n\n return (\n <div\n className={cn(\n 'relative transition-all ease-in-out',\n 'flex items-center justify-center',\n isLoading && 'pointer-events-none',\n className,\n )}\n style={{\n opacity: isLoading ? disabledOpacity : 1,\n transitionDuration: `${transitionDuration}ms`,\n }}\n role=\"navigation\"\n aria-label=\"Pagination\"\n aria-busy={isLoading}\n data-loading={isLoading}\n >\n {/* Loading state announcement for screen readers */}\n {isLoading && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n Pagination temporarily disabled while loading page {currentPage} of {totalPages}\n </div>\n )}\n\n {/* Pagination controls with disabled state */}\n <div\n className={cn('relative transition-all ease-in-out', isLoading && 'cursor-not-allowed')}\n style={{\n transitionDuration: `${transitionDuration}ms`,\n }}\n aria-hidden={isLoading}\n >\n {children}\n </div>\n\n {/* REMOVED: Loading overlay - only card skeletons should show during loading */}\n </div>\n );\n}\n\n/**\n * Hook for managing pagination loading states\n */\nexport function usePaginationLoading(isLoading: boolean, currentPage: number, totalPages: number) {\n const shouldShowPagination = totalPages > 1 || isLoading;\n\n const paginationProps = {\n 'aria-busy': isLoading,\n 'data-loading': isLoading,\n 'data-current-page': currentPage,\n 'data-total-pages': totalPages,\n };\n\n const getLoadingMessage = () => {\n if (isLoading) {\n return `Loading page ${currentPage} of ${totalPages}`;\n }\n return `Page ${currentPage} of ${totalPages}`;\n };\n\n return {\n shouldShowPagination,\n paginationProps,\n getLoadingMessage,\n };\n}\n\n/**\n * Enhanced pagination component that includes loading states\n */\ninterface PersistentPaginationWrapperProps {\n isLoading: boolean;\n currentPage: number;\n totalPages: number;\n onPageChange?: (page: number) => void;\n className?: string;\n variant?: 'vendor' | 'blog';\n}\n\nexport function PersistentPaginationWrapper({\n isLoading,\n currentPage,\n totalPages,\n onPageChange,\n className,\n}: PersistentPaginationWrapperProps) {\n // ALWAYS show pagination for predictable layout\n // For no results (totalPages = 0), show grayed out pagination\n const hasResults = totalPages > 0;\n const displayTotalPages = hasResults ? totalPages : 1;\n const displayCurrentPage = hasResults ? currentPage : 1;\n // Only disable during loading, but still show when no results (just grayed out)\n const isPaginationDisabled = isLoading;\n const hasNoResults = !hasResults && !isLoading;\n\n return (\n <div\n className={cn(\n 'relative flex items-center justify-center transition-all ease-in-out',\n (isPaginationDisabled || hasNoResults) && 'pointer-events-none',\n className,\n )}\n style={{\n opacity: isPaginationDisabled ? 0.3 : hasNoResults ? 0.5 : 1,\n transitionDuration: '300ms',\n }}\n role=\"navigation\"\n aria-label=\"Pagination\"\n aria-busy={isLoading}\n data-loading={isLoading}\n data-has-results={hasResults}\n >\n {/* Loading/no results state announcement for screen readers */}\n {(isLoading || !hasResults) && (\n <div className=\"sr-only\" role=\"status\" aria-live=\"polite\">\n {isLoading\n ? `Pagination temporarily disabled while loading page ${displayCurrentPage} of ${displayTotalPages}`\n : `No results available - pagination disabled`}\n </div>\n )}\n\n {/* Pagination controls with disabled state */}\n <div\n className={cn('relative transition-all ease-in-out', isPaginationDisabled && 'cursor-not-allowed')}\n style={{\n transitionDuration: '300ms',\n }}\n aria-hidden={isPaginationDisabled}\n >\n {/* UnifiedPagination directly — Pagination and BlogPagination in\n multi-platform-hub are both thin wrappers around it, so the wrapper\n never has to be handed down from the consuming app. */}\n <UnifiedPagination\n currentPage={displayCurrentPage}\n totalPages={displayTotalPages}\n onPageChange={hasResults ? onPageChange : () => {}} // Provide empty function instead of undefined\n />\n </div>\n\n {/* REMOVED: Loading overlays - only card skeletons should show during loading */}\n </div>\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 _chunkYHNIPSG6cjs = require('./chunk-YHNIPSG6.cjs');
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
var _chunkPRPZBXWZcjs = require('./chunk-PRPZBXWZ.cjs');
|
|
@@ -88,7 +88,7 @@ var Pagination = ({ currentPage, totalPages, onPageChange, className }) => {
|
|
|
88
88
|
const pageNumbers = getPageNumbers();
|
|
89
89
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "nav", { role: "navigation", "aria-label": "pagination", className: _chunkPRPZBXWZcjs.cn.call(void 0, "mx-auto flex w-full justify-center", className), children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "ul", { className: "flex flex-row items-center gap-1", children: [
|
|
90
90
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
91
|
-
|
|
91
|
+
_chunkYHNIPSG6cjs.Button,
|
|
92
92
|
{
|
|
93
93
|
variant: "outline",
|
|
94
94
|
size: "icon",
|
|
@@ -107,7 +107,7 @@ var Pagination = ({ currentPage, totalPages, onPageChange, className }) => {
|
|
|
107
107
|
] }) }, `ellipsis-${index}`);
|
|
108
108
|
}
|
|
109
109
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
110
|
-
|
|
110
|
+
_chunkYHNIPSG6cjs.Button,
|
|
111
111
|
{
|
|
112
112
|
variant: currentPage === page ? "accent" : "outline",
|
|
113
113
|
size: "icon",
|
|
@@ -120,7 +120,7 @@ var Pagination = ({ currentPage, totalPages, onPageChange, className }) => {
|
|
|
120
120
|
) }, page);
|
|
121
121
|
}),
|
|
122
122
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "li", { children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
123
|
-
|
|
123
|
+
_chunkYHNIPSG6cjs.Button,
|
|
124
124
|
{
|
|
125
125
|
variant: "outline",
|
|
126
126
|
size: "icon",
|
|
@@ -181,7 +181,7 @@ var PaginationEllipsis = _react.forwardRef.call(void 0,
|
|
|
181
181
|
PaginationEllipsis.displayName = "PaginationEllipsis";
|
|
182
182
|
var PaginationPrevious = _react.forwardRef.call(void 0,
|
|
183
183
|
({ className, ...props }, ref) => {
|
|
184
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
184
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkYHNIPSG6cjs.Button, { ref, variant: "outline", size: "icon", className: _chunkPRPZBXWZcjs.cn.call(void 0, "h-10 w-10", className), ...props, children: [
|
|
185
185
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronLeft, { className: "h-4 w-4" }),
|
|
186
186
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", children: "Previous page" })
|
|
187
187
|
] });
|
|
@@ -190,7 +190,7 @@ var PaginationPrevious = _react.forwardRef.call(void 0,
|
|
|
190
190
|
PaginationPrevious.displayName = "PaginationPrevious";
|
|
191
191
|
var PaginationNext = _react.forwardRef.call(void 0,
|
|
192
192
|
({ className, ...props }, ref) => {
|
|
193
|
-
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
193
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _chunkYHNIPSG6cjs.Button, { ref, variant: "outline", size: "icon", className: _chunkPRPZBXWZcjs.cn.call(void 0, "h-10 w-10", className), ...props, children: [
|
|
194
194
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ChevronRight, { className: "h-4 w-4" }),
|
|
195
195
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "sr-only", children: "Next page" })
|
|
196
196
|
] });
|
|
@@ -212,4 +212,4 @@ PaginationNext.displayName = "PaginationNext";
|
|
|
212
212
|
|
|
213
213
|
|
|
214
214
|
exports.CONTENT_REF_GROUPS = CONTENT_REF_GROUPS; exports.getContentRefLabel = getContentRefLabel; exports.getContentRefLabelOrTitleCase = getContentRefLabelOrTitleCase; exports.orderContentRefTypes = orderContentRefTypes; exports.buildSuggestionUrl = buildSuggestionUrl; exports.Pagination = Pagination; exports.PaginationContent = PaginationContent; exports.PaginationItem = PaginationItem; exports.PaginationLink = PaginationLink; exports.PaginationEllipsis = PaginationEllipsis; exports.PaginationPrevious = PaginationPrevious; exports.PaginationNext = PaginationNext;
|
|
215
|
-
//# sourceMappingURL=chunk-
|
|
215
|
+
//# sourceMappingURL=chunk-72OIVRPG.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-7Z64COGD.cjs","../src/utils/content-ref-groups.ts","../src/utils/suggestion-url.ts","../src/components/pagination.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-7Z64COGD.cjs","sourcesContent":[null,"/**\n * Content Ref Group Configuration\n *\n * Single source of truth for grouping content_refs by type. Used by both:\n * - components/related-content (detail page rail — lives in this lib)\n * - the hub's lib/utils/investor-email-utils.ts (email builder, via the\n * hub's re-export shim at lib/config/content-ref-groups.ts)\n *\n * Lives in utils/ (server-safe tsup block) so hub server-side code can\n * import it.\n *\n * Each entry carries the metadata RelatedContentSection needs to render the\n * group WITHOUT re-implementing per-type logic locally:\n * - `label`: section heading.\n * - `order`: source-stable ordering (lowest first).\n * - `layout`: 'list' (one-per-row, full-width cards) or 'grid' (responsive\n * column grid).\n * - `gridSize`: card-size variant passed to the per-type card dispatch.\n * `'lg'` matches the canonical large-card variant openframe + flamingo\n * apps already use; `'default'` is the legacy denser variant. New types\n * should pick `'lg'` whenever the card has a large variant.\n *\n * Adding a new content type = one entry here. RelatedContentSection picks up\n * the new group automatically (no hardcoded set to update). NOTE: the hub's\n * related-content SUGGESTION candidate list is DERIVED from these keys (minus\n * an explicit exclusion knob) — a new entry here becomes a suggestion\n * candidate iff it also resolves through the hub's TYPE_TO_ENTITY → RAG\n * config chain (unresolvable entries are dropped loudly at module load).\n */\n\nexport type ContentRefLayout = 'list' | 'grid';\n\n/** Subset of `EntityCardSize` (entity-card dispatch) appropriate for\n * grid/list rendering in RelatedContentSection. Duplicated as a literal\n * union here to avoid a config→component import cycle. Kept in lockstep\n * with `EntityCardSize`; widen here when a new size is added there. */\nexport type ContentRefGridSize = 'lg' | 'default' | 'sm';\n\nexport interface ContentRefGroupConfig {\n label: string;\n order: number;\n layout: ContentRefLayout;\n gridSize: ContentRefGridSize;\n}\n\nexport const CONTENT_REF_GROUPS: Record<string, ContentRefGroupConfig> = {\n investor_update: { label: 'Investor Updates', order: 1, layout: 'grid', gridSize: 'default' },\n product_release: { label: 'Product Releases', order: 2, layout: 'list', gridSize: 'lg' },\n podcast: { label: 'Podcasts', order: 3, layout: 'list', gridSize: 'default' },\n webinar: { label: 'Webinars', order: 4, layout: 'list', gridSize: 'default' },\n case_study: { label: 'Case Studies', order: 5, layout: 'grid', gridSize: 'default' },\n event: { label: 'Events', order: 6, layout: 'list', gridSize: 'default' },\n blog_post_existing: { label: 'Blog Posts', order: 7, layout: 'grid', gridSize: 'default' },\n customer_interview: { label: 'Customer Interviews', order: 8, layout: 'grid', gridSize: 'default' },\n onboarding_guide: { label: 'Onboarding Guides', order: 9, layout: 'list', gridSize: 'default' },\n what_i_shipped: { label: 'What I Shipped', order: 10, layout: 'grid', gridSize: 'default' },\n how_i_work: { label: 'How I Work', order: 11, layout: 'grid', gridSize: 'default' },\n};\n\n/** Human-readable label for a content_ref `type`. Returns null when the type\n * isn't registered — caller decides the fallback. Use `getContentRefLabelOrTitleCase`\n * to get a consistent title-cased fallback across all surfaces. */\nexport function getContentRefLabel(type: string): string | null {\n return CONTENT_REF_GROUPS[type]?.label ?? null;\n}\n\n/** Resolved label with a single shared fallback shape — title-cased version\n * of the raw type string for any unregistered type. Both RelatedContentSection\n * AND the investor-email builder consume this so cross-surface label rendering\n * for unregistered types is identical (no drift between \"podcast guest\" and\n * \"Podcast Guest\"). */\nexport function getContentRefLabelOrTitleCase(type: string): string {\n return CONTENT_REF_GROUPS[type]?.label ?? type.replace(/_/g, ' ').replace(/\\b\\w/g, ch => ch.toUpperCase());\n}\n\n/** Sort a set of present content_ref types into the canonical group order\n * (registered types first in CONTENT_REF_GROUPS `order`, then unregistered\n * types appended in insertion order). Used by RelatedContentSection AND the\n * investor-email builder so cross-surface ordering stays identical. */\nexport function orderContentRefTypes(present: Iterable<string>): string[] {\n const presentSet = new Set(present);\n const registeredInOrder = Object.entries(CONTENT_REF_GROUPS)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([type]) => type)\n .filter(type => presentSet.has(type));\n const unregistered = [...presentSet].filter(type => !CONTENT_REF_GROUPS[type]);\n return [...registeredInOrder, ...unregistered];\n}\n","/**\n * Shared fetch-URL composer for the two suggestion sections (FaqSection +\n * RelatedContentSection) — ONE owner of the entityType/entityId/count query\n * shape so the sections can never drift. Pure + server-safe.\n *\n * Byte-parity contract with the original `buildFaqsUrl`: when only\n * entityType/entityId are set, the param order is `entityType`, `entityId`;\n * with nothing set, the bare `path` is returned (no `?`).\n */\nexport interface SuggestionUrlOptions {\n /** Fetch-URL prefix for third-party embeds / reverse proxies\n * ('' = same-origin relative). */\n apiBaseUrl?: string;\n /** Both required together for entity scope; partial → bare path. */\n entityType?: string;\n entityId?: number | string;\n /** Maps to the server's `count` param. Undefined → param not sent\n * (server default applies). */\n count?: number;\n /** Extra query params appended after the shared trio (e.g. the\n * related-content `excludeTypes` deny-list). Empty/undefined values\n * are skipped. */\n extraParams?: Record<string, string | undefined>;\n}\n\nexport function buildSuggestionUrl(path: string, opts: SuggestionUrlOptions = {}): string {\n const qs = new URLSearchParams();\n const { entityType, entityId } = opts;\n if (entityType && entityId !== undefined && entityId !== null && entityId !== '') {\n qs.set('entityType', entityType);\n qs.set('entityId', String(entityId));\n }\n if (opts.count !== undefined) qs.set('count', String(opts.count));\n for (const [key, value] of Object.entries(opts.extraParams ?? {})) {\n if (value !== undefined && value !== '') qs.set(key, value);\n }\n const query = qs.toString();\n return `${opts.apiBaseUrl ?? ''}${path}${query ? `?${query}` : ''}`;\n}\n","'use client';\n\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';\nimport { type ButtonHTMLAttributes, type HTMLAttributes, forwardRef } from 'react';\nimport { cn } from '../utils/cn';\nimport { Button } from './ui/button';\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n className?: string;\n}\n\nconst Pagination = ({ currentPage, totalPages, onPageChange, className }: PaginationProps) => {\n // Generate page numbers to display\n const getPageNumbers = () => {\n const pages = [];\n const maxPagesToShow = 5;\n\n if (totalPages <= maxPagesToShow) {\n // Show all pages if there are fewer than maxPagesToShow\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Always show first page\n pages.push(1);\n\n // Calculate start and end of page range\n let start = Math.max(2, currentPage - 1);\n let end = Math.min(totalPages - 1, currentPage + 1);\n\n // Adjust if at the beginning or end\n if (currentPage <= 2) {\n end = Math.min(totalPages - 1, 4);\n } else if (currentPage >= totalPages - 1) {\n start = Math.max(2, totalPages - 3);\n }\n\n // Add ellipsis if needed\n if (start > 2) {\n pages.push(-1); // -1 represents ellipsis\n }\n\n // Add middle pages\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n // Add ellipsis if needed\n if (end < totalPages - 1) {\n pages.push(-2); // -2 represents ellipsis\n }\n\n // Always show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n return (\n <nav role=\"navigation\" aria-label=\"pagination\" className={cn('mx-auto flex w-full justify-center', className)}>\n <ul className=\"flex flex-row items-center gap-1\">\n <li>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n aria-label=\"Go to previous page\"\n className=\"!h-10 !w-10 md:!h-10 md:!w-10\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n </li>\n\n {pageNumbers.map((page, index) => {\n if (page < 0) {\n // Render ellipsis\n return (\n <li key={`ellipsis-${index}`}>\n <span className=\"flex h-9 w-9 items-center justify-center text-muted-foreground text-h6\">\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n </li>\n );\n }\n\n return (\n <li key={page}>\n <Button\n variant={currentPage === page ? 'accent' : 'outline'}\n size=\"icon\"\n onClick={() => onPageChange(page)}\n className=\"!h-9 !w-9 md:!h-9 md:!w-9\"\n aria-label={`Page ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n >\n {page}\n </Button>\n </li>\n );\n })}\n\n <li>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n aria-label=\"Go to next page\"\n className=\"!h-10 !w-10 md:!h-10 md:!w-10\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next page</span>\n </Button>\n </li>\n </ul>\n </nav>\n );\n};\n\nconst PaginationContent = forwardRef<HTMLUListElement, HTMLAttributes<HTMLUListElement>>(\n ({ className, ...props }, ref) => {\n return <ul ref={ref} className={cn('flex items-center justify-center', className)} {...props} />;\n },\n);\nPaginationContent.displayName = 'PaginationContent';\n\nconst PaginationItem = forwardRef<HTMLLIElement, HTMLAttributes<HTMLLIElement>>(({ className, ...props }, ref) => {\n return <li ref={ref} className={cn('', className)} {...props} />;\n});\nPaginationItem.displayName = 'PaginationItem';\n\nconst PaginationLink = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(\n 'inline-flex h-10 w-10 items-center justify-center rounded-md border border-input bg-background transition-colors text-h6 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className,\n )}\n {...props}\n />\n );\n },\n);\nPaginationLink.displayName = 'PaginationLink';\n\nconst PaginationEllipsis = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(\n ({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn('flex h-10 w-10 items-center justify-center text-muted-foreground', className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n },\n);\nPaginationEllipsis.displayName = 'PaginationEllipsis';\n\nconst PaginationPrevious = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, ...props }, ref) => {\n return (\n <Button ref={ref} variant=\"outline\" size=\"icon\" className={cn('h-10 w-10', className)} {...props}>\n <ChevronLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous page</span>\n </Button>\n );\n },\n);\nPaginationPrevious.displayName = 'PaginationPrevious';\n\nconst PaginationNext = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, ...props }, ref) => {\n return (\n <Button ref={ref} variant=\"outline\" size=\"icon\" className={cn('h-10 w-10', className)} {...props}>\n <ChevronRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next page</span>\n </Button>\n );\n },\n);\nPaginationNext.displayName = 'PaginationNext';\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-72OIVRPG.cjs","../src/utils/content-ref-groups.ts","../src/utils/suggestion-url.ts","../src/components/pagination.tsx"],"names":[],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-72OIVRPG.cjs","sourcesContent":[null,"/**\n * Content Ref Group Configuration\n *\n * Single source of truth for grouping content_refs by type. Used by both:\n * - components/related-content (detail page rail — lives in this lib)\n * - the hub's lib/utils/investor-email-utils.ts (email builder, via the\n * hub's re-export shim at lib/config/content-ref-groups.ts)\n *\n * Lives in utils/ (server-safe tsup block) so hub server-side code can\n * import it.\n *\n * Each entry carries the metadata RelatedContentSection needs to render the\n * group WITHOUT re-implementing per-type logic locally:\n * - `label`: section heading.\n * - `order`: source-stable ordering (lowest first).\n * - `layout`: 'list' (one-per-row, full-width cards) or 'grid' (responsive\n * column grid).\n * - `gridSize`: card-size variant passed to the per-type card dispatch.\n * `'lg'` matches the canonical large-card variant openframe + flamingo\n * apps already use; `'default'` is the legacy denser variant. New types\n * should pick `'lg'` whenever the card has a large variant.\n *\n * Adding a new content type = one entry here. RelatedContentSection picks up\n * the new group automatically (no hardcoded set to update). NOTE: the hub's\n * related-content SUGGESTION candidate list is DERIVED from these keys (minus\n * an explicit exclusion knob) — a new entry here becomes a suggestion\n * candidate iff it also resolves through the hub's TYPE_TO_ENTITY → RAG\n * config chain (unresolvable entries are dropped loudly at module load).\n */\n\nexport type ContentRefLayout = 'list' | 'grid';\n\n/** Subset of `EntityCardSize` (entity-card dispatch) appropriate for\n * grid/list rendering in RelatedContentSection. Duplicated as a literal\n * union here to avoid a config→component import cycle. Kept in lockstep\n * with `EntityCardSize`; widen here when a new size is added there. */\nexport type ContentRefGridSize = 'lg' | 'default' | 'sm';\n\nexport interface ContentRefGroupConfig {\n label: string;\n order: number;\n layout: ContentRefLayout;\n gridSize: ContentRefGridSize;\n}\n\nexport const CONTENT_REF_GROUPS: Record<string, ContentRefGroupConfig> = {\n investor_update: { label: 'Investor Updates', order: 1, layout: 'grid', gridSize: 'default' },\n product_release: { label: 'Product Releases', order: 2, layout: 'list', gridSize: 'lg' },\n podcast: { label: 'Podcasts', order: 3, layout: 'list', gridSize: 'default' },\n webinar: { label: 'Webinars', order: 4, layout: 'list', gridSize: 'default' },\n case_study: { label: 'Case Studies', order: 5, layout: 'grid', gridSize: 'default' },\n event: { label: 'Events', order: 6, layout: 'list', gridSize: 'default' },\n blog_post_existing: { label: 'Blog Posts', order: 7, layout: 'grid', gridSize: 'default' },\n customer_interview: { label: 'Customer Interviews', order: 8, layout: 'grid', gridSize: 'default' },\n onboarding_guide: { label: 'Onboarding Guides', order: 9, layout: 'list', gridSize: 'default' },\n what_i_shipped: { label: 'What I Shipped', order: 10, layout: 'grid', gridSize: 'default' },\n how_i_work: { label: 'How I Work', order: 11, layout: 'grid', gridSize: 'default' },\n};\n\n/** Human-readable label for a content_ref `type`. Returns null when the type\n * isn't registered — caller decides the fallback. Use `getContentRefLabelOrTitleCase`\n * to get a consistent title-cased fallback across all surfaces. */\nexport function getContentRefLabel(type: string): string | null {\n return CONTENT_REF_GROUPS[type]?.label ?? null;\n}\n\n/** Resolved label with a single shared fallback shape — title-cased version\n * of the raw type string for any unregistered type. Both RelatedContentSection\n * AND the investor-email builder consume this so cross-surface label rendering\n * for unregistered types is identical (no drift between \"podcast guest\" and\n * \"Podcast Guest\"). */\nexport function getContentRefLabelOrTitleCase(type: string): string {\n return CONTENT_REF_GROUPS[type]?.label ?? type.replace(/_/g, ' ').replace(/\\b\\w/g, ch => ch.toUpperCase());\n}\n\n/** Sort a set of present content_ref types into the canonical group order\n * (registered types first in CONTENT_REF_GROUPS `order`, then unregistered\n * types appended in insertion order). Used by RelatedContentSection AND the\n * investor-email builder so cross-surface ordering stays identical. */\nexport function orderContentRefTypes(present: Iterable<string>): string[] {\n const presentSet = new Set(present);\n const registeredInOrder = Object.entries(CONTENT_REF_GROUPS)\n .sort(([, a], [, b]) => a.order - b.order)\n .map(([type]) => type)\n .filter(type => presentSet.has(type));\n const unregistered = [...presentSet].filter(type => !CONTENT_REF_GROUPS[type]);\n return [...registeredInOrder, ...unregistered];\n}\n","/**\n * Shared fetch-URL composer for the two suggestion sections (FaqSection +\n * RelatedContentSection) — ONE owner of the entityType/entityId/count query\n * shape so the sections can never drift. Pure + server-safe.\n *\n * Byte-parity contract with the original `buildFaqsUrl`: when only\n * entityType/entityId are set, the param order is `entityType`, `entityId`;\n * with nothing set, the bare `path` is returned (no `?`).\n */\nexport interface SuggestionUrlOptions {\n /** Fetch-URL prefix for third-party embeds / reverse proxies\n * ('' = same-origin relative). */\n apiBaseUrl?: string;\n /** Both required together for entity scope; partial → bare path. */\n entityType?: string;\n entityId?: number | string;\n /** Maps to the server's `count` param. Undefined → param not sent\n * (server default applies). */\n count?: number;\n /** Extra query params appended after the shared trio (e.g. the\n * related-content `excludeTypes` deny-list). Empty/undefined values\n * are skipped. */\n extraParams?: Record<string, string | undefined>;\n}\n\nexport function buildSuggestionUrl(path: string, opts: SuggestionUrlOptions = {}): string {\n const qs = new URLSearchParams();\n const { entityType, entityId } = opts;\n if (entityType && entityId !== undefined && entityId !== null && entityId !== '') {\n qs.set('entityType', entityType);\n qs.set('entityId', String(entityId));\n }\n if (opts.count !== undefined) qs.set('count', String(opts.count));\n for (const [key, value] of Object.entries(opts.extraParams ?? {})) {\n if (value !== undefined && value !== '') qs.set(key, value);\n }\n const query = qs.toString();\n return `${opts.apiBaseUrl ?? ''}${path}${query ? `?${query}` : ''}`;\n}\n","'use client';\n\nimport { ChevronLeft, ChevronRight, MoreHorizontal } from 'lucide-react';\nimport { type ButtonHTMLAttributes, type HTMLAttributes, forwardRef } from 'react';\nimport { cn } from '../utils/cn';\nimport { Button } from './ui/button';\n\ninterface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n className?: string;\n}\n\nconst Pagination = ({ currentPage, totalPages, onPageChange, className }: PaginationProps) => {\n // Generate page numbers to display\n const getPageNumbers = () => {\n const pages = [];\n const maxPagesToShow = 5;\n\n if (totalPages <= maxPagesToShow) {\n // Show all pages if there are fewer than maxPagesToShow\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // Always show first page\n pages.push(1);\n\n // Calculate start and end of page range\n let start = Math.max(2, currentPage - 1);\n let end = Math.min(totalPages - 1, currentPage + 1);\n\n // Adjust if at the beginning or end\n if (currentPage <= 2) {\n end = Math.min(totalPages - 1, 4);\n } else if (currentPage >= totalPages - 1) {\n start = Math.max(2, totalPages - 3);\n }\n\n // Add ellipsis if needed\n if (start > 2) {\n pages.push(-1); // -1 represents ellipsis\n }\n\n // Add middle pages\n for (let i = start; i <= end; i++) {\n pages.push(i);\n }\n\n // Add ellipsis if needed\n if (end < totalPages - 1) {\n pages.push(-2); // -2 represents ellipsis\n }\n\n // Always show last page\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n };\n\n const pageNumbers = getPageNumbers();\n\n return (\n <nav role=\"navigation\" aria-label=\"pagination\" className={cn('mx-auto flex w-full justify-center', className)}>\n <ul className=\"flex flex-row items-center gap-1\">\n <li>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(currentPage - 1)}\n disabled={currentPage === 1}\n aria-label=\"Go to previous page\"\n className=\"!h-10 !w-10 md:!h-10 md:!w-10\"\n >\n <ChevronLeft className=\"h-4 w-4\" />\n </Button>\n </li>\n\n {pageNumbers.map((page, index) => {\n if (page < 0) {\n // Render ellipsis\n return (\n <li key={`ellipsis-${index}`}>\n <span className=\"flex h-9 w-9 items-center justify-center text-muted-foreground text-h6\">\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n </li>\n );\n }\n\n return (\n <li key={page}>\n <Button\n variant={currentPage === page ? 'accent' : 'outline'}\n size=\"icon\"\n onClick={() => onPageChange(page)}\n className=\"!h-9 !w-9 md:!h-9 md:!w-9\"\n aria-label={`Page ${page}`}\n aria-current={currentPage === page ? 'page' : undefined}\n >\n {page}\n </Button>\n </li>\n );\n })}\n\n <li>\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={() => onPageChange(currentPage + 1)}\n disabled={currentPage === totalPages}\n aria-label=\"Go to next page\"\n className=\"!h-10 !w-10 md:!h-10 md:!w-10\"\n >\n <ChevronRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next page</span>\n </Button>\n </li>\n </ul>\n </nav>\n );\n};\n\nconst PaginationContent = forwardRef<HTMLUListElement, HTMLAttributes<HTMLUListElement>>(\n ({ className, ...props }, ref) => {\n return <ul ref={ref} className={cn('flex items-center justify-center', className)} {...props} />;\n },\n);\nPaginationContent.displayName = 'PaginationContent';\n\nconst PaginationItem = forwardRef<HTMLLIElement, HTMLAttributes<HTMLLIElement>>(({ className, ...props }, ref) => {\n return <li ref={ref} className={cn('', className)} {...props} />;\n});\nPaginationItem.displayName = 'PaginationItem';\n\nconst PaginationLink = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, ...props }, ref) => {\n return (\n <button\n ref={ref}\n className={cn(\n 'inline-flex h-10 w-10 items-center justify-center rounded-md border border-input bg-background transition-colors text-h6 hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring',\n className,\n )}\n {...props}\n />\n );\n },\n);\nPaginationLink.displayName = 'PaginationLink';\n\nconst PaginationEllipsis = forwardRef<HTMLSpanElement, HTMLAttributes<HTMLSpanElement>>(\n ({ className, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={cn('flex h-10 w-10 items-center justify-center text-muted-foreground', className)}\n {...props}\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n <span className=\"sr-only\">More pages</span>\n </span>\n );\n },\n);\nPaginationEllipsis.displayName = 'PaginationEllipsis';\n\nconst PaginationPrevious = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, ...props }, ref) => {\n return (\n <Button ref={ref} variant=\"outline\" size=\"icon\" className={cn('h-10 w-10', className)} {...props}>\n <ChevronLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">Previous page</span>\n </Button>\n );\n },\n);\nPaginationPrevious.displayName = 'PaginationPrevious';\n\nconst PaginationNext = forwardRef<HTMLButtonElement, ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, ...props }, ref) => {\n return (\n <Button ref={ref} variant=\"outline\" size=\"icon\" className={cn('h-10 w-10', className)} {...props}>\n <ChevronRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">Next page</span>\n </Button>\n );\n },\n);\nPaginationNext.displayName = 'PaginationNext';\n\nexport {\n Pagination,\n PaginationContent,\n PaginationEllipsis,\n PaginationItem,\n PaginationLink,\n PaginationNext,\n PaginationPrevious,\n};\n"]}
|