@flamingo-stack/openframe-frontend-core 0.0.410 → 0.0.411-snapshot.20260711170430

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/{chunk-STGWQFYT.cjs → chunk-3SNDISEN.cjs} +92 -30
  2. package/dist/chunk-3SNDISEN.cjs.map +1 -0
  3. package/dist/{chunk-RL344I7V.cjs → chunk-3U4IZF7H.cjs} +7 -7
  4. package/dist/{chunk-RL344I7V.cjs.map → chunk-3U4IZF7H.cjs.map} +1 -1
  5. package/dist/{chunk-7Q52HP45.js → chunk-4FNDOTW2.js} +139 -77
  6. package/dist/chunk-4FNDOTW2.js.map +1 -0
  7. package/dist/{chunk-O5W26SCL.js → chunk-6AB36PRE.js} +2 -2
  8. package/dist/{chunk-IK5AR6QG.js → chunk-B2BERJ4M.js} +6 -6
  9. package/dist/{chunk-SOALFYU6.cjs → chunk-BKYV2ALJ.cjs} +582 -591
  10. package/dist/chunk-BKYV2ALJ.cjs.map +1 -0
  11. package/dist/{chunk-KPGKNUJF.cjs → chunk-BRHCGXOH.cjs} +40 -40
  12. package/dist/{chunk-KPGKNUJF.cjs.map → chunk-BRHCGXOH.cjs.map} +1 -1
  13. package/dist/{chunk-NO2KT42M.js → chunk-DGIF3YDV.js} +2 -2
  14. package/dist/{chunk-LQWYXIKB.js → chunk-FXZO4EKN.js} +5 -5
  15. package/dist/{chunk-CUN4CJUN.cjs → chunk-G2G7HLEM.cjs} +3 -3
  16. package/dist/{chunk-CUN4CJUN.cjs.map → chunk-G2G7HLEM.cjs.map} +1 -1
  17. package/dist/{chunk-NEMUCNCG.cjs → chunk-H4ISMWHG.cjs} +73 -73
  18. package/dist/{chunk-NEMUCNCG.cjs.map → chunk-H4ISMWHG.cjs.map} +1 -1
  19. package/dist/{chunk-L6OPVKVR.js → chunk-HXRULNWA.js} +5 -5
  20. package/dist/{chunk-RPGFIUN3.cjs → chunk-MF5CVIAC.cjs} +32 -32
  21. package/dist/{chunk-RPGFIUN3.cjs.map → chunk-MF5CVIAC.cjs.map} +1 -1
  22. package/dist/{chunk-J6M2G6TD.js → chunk-MHNBDSWH.js} +6 -6
  23. package/dist/{chunk-E4J5KKHH.js → chunk-NJSBYUJZ.js} +3 -3
  24. package/dist/{chunk-YRKPMYI3.cjs → chunk-RALT6D4H.cjs} +15 -15
  25. package/dist/{chunk-YRKPMYI3.cjs.map → chunk-RALT6D4H.cjs.map} +1 -1
  26. package/dist/{chunk-ZMFQWMM7.js → chunk-SAJM3PDE.js} +2 -2
  27. package/dist/{chunk-V3EZQWHQ.cjs → chunk-SMLAYAIW.cjs} +5 -5
  28. package/dist/{chunk-V3EZQWHQ.cjs.map → chunk-SMLAYAIW.cjs.map} +1 -1
  29. package/dist/{chunk-5HOII3WB.js → chunk-SOLI7V4I.js} +4 -4
  30. package/dist/{chunk-WGOATV3P.cjs → chunk-SZ27SV6T.cjs} +73 -73
  31. package/dist/{chunk-WGOATV3P.cjs.map → chunk-SZ27SV6T.cjs.map} +1 -1
  32. package/dist/{chunk-ZF5O3KUQ.js → chunk-TYCWPT33.js} +3 -3
  33. package/dist/{chunk-F4KE5AZO.cjs → chunk-VTTPNZX3.cjs} +40 -40
  34. package/dist/{chunk-F4KE5AZO.cjs.map → chunk-VTTPNZX3.cjs.map} +1 -1
  35. package/dist/{chunk-T6ZUBXPA.cjs → chunk-VXM2GCKS.cjs} +12 -12
  36. package/dist/{chunk-T6ZUBXPA.cjs.map → chunk-VXM2GCKS.cjs.map} +1 -1
  37. package/dist/{chunk-KZPVN7AZ.js → chunk-XBC5AES6.js} +2 -2
  38. package/dist/{chunk-KRLBVBYU.cjs → chunk-XVPWVG6N.cjs} +18 -18
  39. package/dist/{chunk-KRLBVBYU.cjs.map → chunk-XVPWVG6N.cjs.map} +1 -1
  40. package/dist/{chunk-IVM47EGI.js → chunk-YVJ2XBFU.js} +389 -398
  41. package/dist/chunk-YVJ2XBFU.js.map +1 -0
  42. package/dist/{chunk-VUW4G6SU.js → chunk-Z4RKJOFH.js} +3 -3
  43. package/dist/{chunk-A3RW7M6B.cjs → chunk-ZZWFS7CD.cjs} +29 -29
  44. package/dist/{chunk-A3RW7M6B.cjs.map → chunk-ZZWFS7CD.cjs.map} +1 -1
  45. package/dist/components/announcement-bar.d.ts.map +1 -1
  46. package/dist/components/case-studies/index.cjs +9 -9
  47. package/dist/components/case-studies/index.js +3 -3
  48. package/dist/components/chat/index.cjs +3 -3
  49. package/dist/components/chat/index.js +2 -2
  50. package/dist/components/contact/index.cjs +4 -4
  51. package/dist/components/contact/index.js +3 -3
  52. package/dist/components/docs/index.cjs +6 -6
  53. package/dist/components/docs/index.js +5 -5
  54. package/dist/components/embeds/index.cjs +4 -4
  55. package/dist/components/embeds/index.js +3 -3
  56. package/dist/components/faq/index.cjs +5 -5
  57. package/dist/components/faq/index.js +4 -4
  58. package/dist/components/features/index.cjs +3 -3
  59. package/dist/components/features/index.js +2 -2
  60. package/dist/components/help-center-pages/index.cjs +22 -22
  61. package/dist/components/help-center-pages/index.js +13 -13
  62. package/dist/components/index.cjs +137 -135
  63. package/dist/components/index.cjs.map +1 -1
  64. package/dist/components/index.js +14 -12
  65. package/dist/components/index.js.map +1 -1
  66. package/dist/components/navigation/header.d.ts.map +1 -1
  67. package/dist/components/navigation/index.cjs +5 -3
  68. package/dist/components/navigation/index.cjs.map +1 -1
  69. package/dist/components/navigation/index.d.ts +1 -1
  70. package/dist/components/navigation/index.d.ts.map +1 -1
  71. package/dist/components/navigation/index.js +4 -2
  72. package/dist/components/navigation/mobile-burger-menu.d.ts.map +1 -1
  73. package/dist/components/navigation/mobile-nav-panel.d.ts +2 -0
  74. package/dist/components/navigation/mobile-nav-panel.d.ts.map +1 -1
  75. package/dist/components/navigation/sliding-sidebar.d.ts.map +1 -1
  76. package/dist/components/onboarding-guides/index.cjs +7 -7
  77. package/dist/components/onboarding-guides/index.js +6 -6
  78. package/dist/components/related-content/index.cjs +5 -5
  79. package/dist/components/related-content/index.js +4 -4
  80. package/dist/components/tickets/index.cjs +6 -6
  81. package/dist/components/tickets/index.js +5 -5
  82. package/dist/components/ui/index.cjs +3 -3
  83. package/dist/components/ui/index.js +2 -2
  84. package/dist/components/ui/modal-v2.d.ts.map +1 -1
  85. package/dist/components/ui/modal.d.ts.map +1 -1
  86. package/dist/hooks/index.cjs +6 -2
  87. package/dist/hooks/index.cjs.map +1 -1
  88. package/dist/hooks/index.js +5 -1
  89. package/dist/hooks/ui/index.d.ts +2 -0
  90. package/dist/hooks/ui/index.d.ts.map +1 -1
  91. package/dist/hooks/ui/use-focus-trap.d.ts +32 -0
  92. package/dist/hooks/ui/use-focus-trap.d.ts.map +1 -0
  93. package/dist/hooks/ui/use-header-height.d.ts +10 -1
  94. package/dist/hooks/ui/use-header-height.d.ts.map +1 -1
  95. package/dist/index.cjs +9 -3
  96. package/dist/index.cjs.map +1 -1
  97. package/dist/index.js +8 -2
  98. package/package.json +1 -1
  99. package/src/components/announcement-bar.tsx +9 -2
  100. package/src/components/navigation/header.tsx +5 -0
  101. package/src/components/navigation/index.ts +1 -1
  102. package/src/components/navigation/mobile-burger-menu.tsx +16 -29
  103. package/src/components/navigation/mobile-nav-panel.tsx +32 -35
  104. package/src/components/navigation/sliding-sidebar.tsx +29 -9
  105. package/src/components/ui/modal-v2.tsx +7 -6
  106. package/src/components/ui/modal.tsx +7 -9
  107. package/src/hooks/ui/index.ts +6 -0
  108. package/src/hooks/ui/use-focus-trap.ts +110 -0
  109. package/src/hooks/ui/use-header-height.ts +17 -2
  110. package/src/stories/MobileNavPanel.stories.tsx +150 -0
  111. package/dist/chunk-7Q52HP45.js.map +0 -1
  112. package/dist/chunk-IVM47EGI.js.map +0 -1
  113. package/dist/chunk-SOALFYU6.cjs.map +0 -1
  114. package/dist/chunk-STGWQFYT.cjs.map +0 -1
  115. /package/dist/{chunk-O5W26SCL.js.map → chunk-6AB36PRE.js.map} +0 -0
  116. /package/dist/{chunk-IK5AR6QG.js.map → chunk-B2BERJ4M.js.map} +0 -0
  117. /package/dist/{chunk-NO2KT42M.js.map → chunk-DGIF3YDV.js.map} +0 -0
  118. /package/dist/{chunk-LQWYXIKB.js.map → chunk-FXZO4EKN.js.map} +0 -0
  119. /package/dist/{chunk-L6OPVKVR.js.map → chunk-HXRULNWA.js.map} +0 -0
  120. /package/dist/{chunk-J6M2G6TD.js.map → chunk-MHNBDSWH.js.map} +0 -0
  121. /package/dist/{chunk-E4J5KKHH.js.map → chunk-NJSBYUJZ.js.map} +0 -0
  122. /package/dist/{chunk-ZMFQWMM7.js.map → chunk-SAJM3PDE.js.map} +0 -0
  123. /package/dist/{chunk-5HOII3WB.js.map → chunk-SOLI7V4I.js.map} +0 -0
  124. /package/dist/{chunk-ZF5O3KUQ.js.map → chunk-TYCWPT33.js.map} +0 -0
  125. /package/dist/{chunk-KZPVN7AZ.js.map → chunk-XBC5AES6.js.map} +0 -0
  126. /package/dist/{chunk-VUW4G6SU.js.map → chunk-Z4RKJOFH.js.map} +0 -0
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- var _chunkSOALFYU6cjs = require('./chunk-SOALFYU6.cjs');
7
+ var _chunkBKYV2ALJcjs = require('./chunk-BKYV2ALJ.cjs');
8
8
 
9
9
 
10
10
 
@@ -59,7 +59,7 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
59
59
  )
60
60
  ] })
61
61
  ] }),
62
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkSOALFYU6cjs.EmbedIframe, { src, title: displayName, height })
62
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBKYV2ALJcjs.EmbedIframe, { src, title: displayName, height })
63
63
  ] });
64
64
  }
65
65
 
@@ -85,7 +85,7 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
85
85
  {
86
86
  variant: "outline",
87
87
  size: "small-legacy",
88
- href: _chunkSOALFYU6cjs.toGoogleSheetsOriginalUrl.call(void 0, externalUrl),
88
+ href: _chunkBKYV2ALJcjs.toGoogleSheetsOriginalUrl.call(void 0, externalUrl),
89
89
  openInNewTab: true,
90
90
  leftIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkBGD345ZVcjs.GoogleSheetsIcon, { className: "w-4 h-4" }),
91
91
  rightIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.ExternalLink, { className: "w-4 h-4" }),
@@ -95,9 +95,9 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
95
95
  )
96
96
  ] }),
97
97
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
98
- _chunkSOALFYU6cjs.EmbedIframe,
98
+ _chunkBKYV2ALJcjs.EmbedIframe,
99
99
  {
100
- src: _chunkSOALFYU6cjs.toGoogleSheetsEmbedUrl.call(void 0, externalUrl),
100
+ src: _chunkBKYV2ALJcjs.toGoogleSheetsEmbedUrl.call(void 0, externalUrl),
101
101
  title: displayName,
102
102
  height
103
103
  }
@@ -120,7 +120,7 @@ function FileDownloadCard({
120
120
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-lg font-semibold text-ods-text-primary", children: fileName || "File" }),
121
121
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex items-center justify-center gap-3 mt-2 text-sm text-ods-text-secondary", children: [
122
122
  mimeType && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: mimeType }),
123
- typeof fileSize === "number" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkSOALFYU6cjs.formatFileSize.call(void 0, fileSize) })
123
+ typeof fileSize === "number" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkBKYV2ALJcjs.formatFileSize.call(void 0, fileSize) })
124
124
  ] })
125
125
  ] }),
126
126
  fileUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -141,4 +141,4 @@ function FileDownloadCard({
141
141
 
142
142
 
143
143
  exports.PdfViewer = PdfViewer; exports.GoogleSheetsViewer = GoogleSheetsViewer; exports.FileDownloadCard = FileDownloadCard;
144
- //# sourceMappingURL=chunk-RL344I7V.cjs.map
144
+ //# sourceMappingURL=chunk-3U4IZF7H.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-RL344I7V.cjs","../src/components/embeds/pdf-viewer.tsx","../src/components/embeds/google-sheets-viewer.tsx","../src/components/embeds/file-download-card.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-RL344I7V.cjs","sourcesContent":[null,"\"use client\"\n\nimport React from 'react'\nimport { Button } from '../ui'\nimport { Download, Eye } from 'lucide-react'\nimport { AdobePdfIcon } from '../icons-v2-generated'\nimport { EmbedIframe } from './embed-iframe'\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 if (!src) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AdobePdfIcon className=\"w-16 h-16 text-ods-text-secondary mb-4\" />\n <p className=\"text-ods-text-secondary\">PDF file not available</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <AdobePdfIcon className=\"w-5 h-5 shrink-0\" />\n <h2 className=\"text-xl font-semibold text-ods-text-primary truncate\">{displayName}</h2>\n </div>\n <div className=\"flex items-center gap-2 w-full 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=\"w-4 h-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=\"w-4 h-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Download\n </Button>\n </div>\n </div>\n <EmbedIframe src={src} title={displayName} height={height} />\n </div>\n )\n}\n","\"use client\"\n\nimport React from 'react'\nimport { Button } from '../ui'\nimport { ExternalLink } from 'lucide-react'\nimport { GoogleSheetsIcon } from '../icons-v2-generated'\nimport { EmbedIframe } from './embed-iframe'\nimport { toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl } from '../../utils/embed-url-converters'\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 if (!externalUrl) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <GoogleSheetsIcon className=\"w-16 h-16 text-ods-text-secondary mb-4\" />\n <p className=\"text-ods-text-secondary\">Google Sheet URL not configured</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <GoogleSheetsIcon className=\"w-5 h-5 shrink-0\" />\n <h2 className=\"text-xl font-semibold text-ods-text-primary truncate\">{displayName}</h2>\n </div>\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={toGoogleSheetsOriginalUrl(externalUrl)}\n openInNewTab\n leftIcon={<GoogleSheetsIcon className=\"w-4 h-4\" />}\n rightIcon={<ExternalLink className=\"w-4 h-4\" />}\n className=\"w-full sm:w-auto\"\n >\n Open in Google Sheets\n </Button>\n </div>\n <EmbedIframe\n src={toGoogleSheetsEmbedUrl(externalUrl)}\n title={displayName}\n height={height}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { Button } from '../ui'\nimport { FileText, Download } from 'lucide-react'\nimport { formatFileSize } from '../../utils'\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({\n fileName,\n mimeType,\n fileSize,\n fileUrl,\n}: FileDownloadCardProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <div className=\"bg-ods-card border border-ods-border rounded-xl p-8 max-w-md w-full text-center space-y-4\">\n <FileText className=\"w-16 h-16 text-ods-text-secondary mx-auto\" />\n <div>\n <h3 className=\"text-lg font-semibold text-ods-text-primary\">\n {fileName || 'File'}\n </h3>\n <div className=\"flex items-center justify-center gap-3 mt-2 text-sm text-ods-text-secondary\">\n {mimeType && <span>{mimeType}</span>}\n {typeof fileSize === 'number' && <span>{formatFileSize(fileSize)}</span>}\n </div>\n </div>\n {fileUrl && (\n <Button\n variant=\"accent\"\n href={fileUrl}\n openInNewTab\n leftIcon={<Download className=\"w-4 h-4\" />}\n >\n Download File\n </Button>\n )}\n </div>\n </div>\n )\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-3U4IZF7H.cjs","../src/components/embeds/pdf-viewer.tsx","../src/components/embeds/google-sheets-viewer.tsx","../src/components/embeds/file-download-card.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-3U4IZF7H.cjs","sourcesContent":[null,"\"use client\"\n\nimport React from 'react'\nimport { Button } from '../ui'\nimport { Download, Eye } from 'lucide-react'\nimport { AdobePdfIcon } from '../icons-v2-generated'\nimport { EmbedIframe } from './embed-iframe'\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 if (!src) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AdobePdfIcon className=\"w-16 h-16 text-ods-text-secondary mb-4\" />\n <p className=\"text-ods-text-secondary\">PDF file not available</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <AdobePdfIcon className=\"w-5 h-5 shrink-0\" />\n <h2 className=\"text-xl font-semibold text-ods-text-primary truncate\">{displayName}</h2>\n </div>\n <div className=\"flex items-center gap-2 w-full 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=\"w-4 h-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=\"w-4 h-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Download\n </Button>\n </div>\n </div>\n <EmbedIframe src={src} title={displayName} height={height} />\n </div>\n )\n}\n","\"use client\"\n\nimport React from 'react'\nimport { Button } from '../ui'\nimport { ExternalLink } from 'lucide-react'\nimport { GoogleSheetsIcon } from '../icons-v2-generated'\nimport { EmbedIframe } from './embed-iframe'\nimport { toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl } from '../../utils/embed-url-converters'\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 if (!externalUrl) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <GoogleSheetsIcon className=\"w-16 h-16 text-ods-text-secondary mb-4\" />\n <p className=\"text-ods-text-secondary\">Google Sheet URL not configured</p>\n </div>\n )\n }\n\n return (\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <GoogleSheetsIcon className=\"w-5 h-5 shrink-0\" />\n <h2 className=\"text-xl font-semibold text-ods-text-primary truncate\">{displayName}</h2>\n </div>\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={toGoogleSheetsOriginalUrl(externalUrl)}\n openInNewTab\n leftIcon={<GoogleSheetsIcon className=\"w-4 h-4\" />}\n rightIcon={<ExternalLink className=\"w-4 h-4\" />}\n className=\"w-full sm:w-auto\"\n >\n Open in Google Sheets\n </Button>\n </div>\n <EmbedIframe\n src={toGoogleSheetsEmbedUrl(externalUrl)}\n title={displayName}\n height={height}\n />\n </div>\n )\n}\n","import React from 'react'\nimport { Button } from '../ui'\nimport { FileText, Download } from 'lucide-react'\nimport { formatFileSize } from '../../utils'\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({\n fileName,\n mimeType,\n fileSize,\n fileUrl,\n}: FileDownloadCardProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <div className=\"bg-ods-card border border-ods-border rounded-xl p-8 max-w-md w-full text-center space-y-4\">\n <FileText className=\"w-16 h-16 text-ods-text-secondary mx-auto\" />\n <div>\n <h3 className=\"text-lg font-semibold text-ods-text-primary\">\n {fileName || 'File'}\n </h3>\n <div className=\"flex items-center justify-center gap-3 mt-2 text-sm text-ods-text-secondary\">\n {mimeType && <span>{mimeType}</span>}\n {typeof fileSize === 'number' && <span>{formatFileSize(fileSize)}</span>}\n </div>\n </div>\n {fileUrl && (\n <Button\n variant=\"accent\"\n href={fileUrl}\n openInNewTab\n leftIcon={<Download className=\"w-4 h-4\" />}\n >\n Download File\n </Button>\n )}\n </div>\n </div>\n )\n}\n"]}
@@ -141,11 +141,68 @@ function useDeferredError(error, value, delay = 1500) {
141
141
  };
142
142
  }
143
143
 
144
+ // src/hooks/ui/use-focus-trap.ts
145
+ import { useEffect as useEffect4, useRef as useRef2 } from "react";
146
+ var FOCUSABLE_SELECTOR = [
147
+ "a[href]",
148
+ "button:not([disabled])",
149
+ "input:not([disabled])",
150
+ "select:not([disabled])",
151
+ "textarea:not([disabled])",
152
+ '[tabindex]:not([tabindex="-1"])'
153
+ ].join(", ");
154
+ function useFocusTrap(containerRef, active, { onEscape, contain = true } = {}) {
155
+ const onEscapeRef = useRef2(onEscape);
156
+ onEscapeRef.current = onEscape;
157
+ useEffect4(() => {
158
+ if (!active) return;
159
+ const container = containerRef.current;
160
+ if (!container) return;
161
+ const previouslyFocused = document.activeElement;
162
+ const focusables = () => Array.from(container.querySelectorAll(FOCUSABLE_SELECTOR)).filter((el) => el.getClientRects().length > 0);
163
+ const first = focusables()[0];
164
+ (first ?? container).focus({ preventScroll: true });
165
+ const handleKeyDown = (e) => {
166
+ if (e.key === "Escape") {
167
+ onEscapeRef.current?.();
168
+ return;
169
+ }
170
+ if (e.key !== "Tab" || !contain) return;
171
+ const items = focusables();
172
+ if (items.length === 0) {
173
+ e.preventDefault();
174
+ container.focus({ preventScroll: true });
175
+ return;
176
+ }
177
+ const firstEl = items[0];
178
+ const lastEl = items[items.length - 1];
179
+ const current = document.activeElement;
180
+ if (e.shiftKey && (current === firstEl || current === container)) {
181
+ e.preventDefault();
182
+ lastEl.focus({ preventScroll: true });
183
+ } else if (!e.shiftKey && current === lastEl) {
184
+ e.preventDefault();
185
+ firstEl.focus({ preventScroll: true });
186
+ }
187
+ };
188
+ container.addEventListener("keydown", handleKeyDown);
189
+ return () => {
190
+ container.removeEventListener("keydown", handleKeyDown);
191
+ const current = document.activeElement;
192
+ if (previouslyFocused && previouslyFocused.isConnected && (current === null || current === document.body || container.contains(current))) {
193
+ previouslyFocused.focus({ preventScroll: true });
194
+ }
195
+ };
196
+ }, [containerRef, active, contain]);
197
+ }
198
+
144
199
  // src/hooks/ui/use-header-height.ts
145
- import { useEffect as useEffect4, useState as useState4 } from "react";
146
- function useHeaderHeight(defaultHeight = 64) {
200
+ import { useEffect as useEffect5, useState as useState4 } from "react";
201
+ function useHeaderHeight(defaultHeight = 64, options = {}) {
202
+ const { enabled = true } = options;
147
203
  const [height, setHeight] = useState4(defaultHeight);
148
- useEffect4(() => {
204
+ useEffect5(() => {
205
+ if (!enabled) return;
149
206
  const measure = () => {
150
207
  let total = 0;
151
208
  const header2 = document.querySelector("header");
@@ -179,26 +236,26 @@ function useHeaderHeight(defaultHeight = 64) {
179
236
  resizeObserver.disconnect();
180
237
  mutationObserver.disconnect();
181
238
  };
182
- }, [defaultHeight]);
239
+ }, [defaultHeight, enabled]);
183
240
  return height;
184
241
  }
185
242
 
186
243
  // src/hooks/ui/use-horizontal-scrollbar.ts
187
- import { useRef as useRef2, useState as useState5, useCallback as useCallback3 } from "react";
244
+ import { useRef as useRef3, useState as useState5, useCallback as useCallback3 } from "react";
188
245
  function useHorizontalScrollbar() {
189
- const scrollElRef = useRef2(null);
190
- const trackRef = useRef2(null);
191
- const thumbRef = useRef2(null);
192
- const roRef = useRef2(null);
193
- const moRef = useRef2(null);
246
+ const scrollElRef = useRef3(null);
247
+ const trackRef = useRef3(null);
248
+ const thumbRef = useRef3(null);
249
+ const roRef = useRef3(null);
250
+ const moRef = useRef3(null);
194
251
  const [thumbRatio, setThumbRatio] = useState5(0);
195
252
  const [canScrollLeft, setCanScrollLeft] = useState5(false);
196
253
  const [canScrollRight, setCanScrollRight] = useState5(false);
197
- const prevCanScrollLeftRef = useRef2(false);
198
- const prevCanScrollRightRef = useRef2(false);
199
- const isDraggingRef = useRef2(false);
200
- const dragStartRef = useRef2({ mouseX: 0, scrollLeft: 0 });
201
- const rafIdRef = useRef2(0);
254
+ const prevCanScrollLeftRef = useRef3(false);
255
+ const prevCanScrollRightRef = useRef3(false);
256
+ const isDraggingRef = useRef3(false);
257
+ const dragStartRef = useRef3({ mouseX: 0, scrollLeft: 0 });
258
+ const rafIdRef = useRef3(0);
202
259
  const syncThumbToDOM = useCallback3(() => {
203
260
  const el = scrollElRef.current;
204
261
  const thumb = thumbRef.current;
@@ -376,7 +433,7 @@ function useHorizontalScrollbar() {
376
433
  }
377
434
 
378
435
  // src/hooks/ui/use-image-edge-color.ts
379
- import { useState as useState6, useEffect as useEffect5 } from "react";
436
+ import { useState as useState6, useEffect as useEffect6 } from "react";
380
437
  function extractEdgeColor(img) {
381
438
  const canvas = document.createElement("canvas");
382
439
  const ctx = canvas.getContext("2d");
@@ -433,7 +490,7 @@ function extractEdgeColor(img) {
433
490
  }
434
491
  function useImageEdgeColor(imageUrl, fallback = "#000000") {
435
492
  const [color, setColor] = useState6(fallback);
436
- useEffect5(() => {
493
+ useEffect6(() => {
437
494
  if (!imageUrl) {
438
495
  setColor(fallback);
439
496
  return;
@@ -462,7 +519,7 @@ function useImageEdgeColor(imageUrl, fallback = "#000000") {
462
519
  }
463
520
 
464
521
  // src/hooks/ui/use-local-storage.ts
465
- import { useEffect as useEffect6, useRef as useRef3, useState as useState7 } from "react";
522
+ import { useEffect as useEffect7, useRef as useRef4, useState as useState7 } from "react";
466
523
  function useLocalStorage(key, initialValue) {
467
524
  const [storedValue, setStoredValue] = useState7(() => {
468
525
  try {
@@ -475,9 +532,9 @@ function useLocalStorage(key, initialValue) {
475
532
  }
476
533
  return initialValue;
477
534
  });
478
- const isInitialized = useRef3(true);
479
- const isFromStorageEvent = useRef3(false);
480
- useEffect6(() => {
535
+ const isInitialized = useRef4(true);
536
+ const isFromStorageEvent = useRef4(false);
537
+ useEffect7(() => {
481
538
  if (!isInitialized.current) return;
482
539
  const handleStorageChange = (e) => {
483
540
  if (e.key === key && e.newValue !== null) {
@@ -516,7 +573,7 @@ function useLocalStorage(key, initialValue) {
516
573
  window.removeEventListener("localStorageUpdate", handleCustomStorageUpdate);
517
574
  };
518
575
  }, [key]);
519
- useEffect6(() => {
576
+ useEffect7(() => {
520
577
  if (!isInitialized.current) return;
521
578
  if (isFromStorageEvent.current) {
522
579
  isFromStorageEvent.current = false;
@@ -577,10 +634,10 @@ function useLgUp() {
577
634
  }
578
635
 
579
636
  // src/hooks/ui/use-memoized-callback.ts
580
- import { useCallback as useCallback4, useRef as useRef4 } from "react";
637
+ import { useCallback as useCallback4, useRef as useRef5 } from "react";
581
638
  function useMemoizedCallback(callback, dependencies) {
582
- const callbackRef = useRef4(callback);
583
- const dependenciesRef = useRef4(dependencies);
639
+ const callbackRef = useRef5(callback);
640
+ const dependenciesRef = useRef5(dependencies);
584
641
  callbackRef.current = callback;
585
642
  const depsChanged = dependencies.some((dep, i) => !Object.is(dep, dependenciesRef.current[i]));
586
643
  if (depsChanged) {
@@ -590,11 +647,11 @@ function useMemoizedCallback(callback, dependencies) {
590
647
  }
591
648
 
592
649
  // src/hooks/ui/use-notification-permission.ts
593
- import { useCallback as useCallback5, useEffect as useEffect7, useState as useState9 } from "react";
650
+ import { useCallback as useCallback5, useEffect as useEffect8, useState as useState9 } from "react";
594
651
  function useNotificationPermission() {
595
652
  const [supported, setSupported] = useState9(false);
596
653
  const [permission, setPermission] = useState9("default");
597
- useEffect7(() => {
654
+ useEffect8(() => {
598
655
  if (typeof window === "undefined" || !("Notification" in window)) return;
599
656
  setSupported(true);
600
657
  const sync = () => setPermission(Notification.permission);
@@ -630,7 +687,7 @@ function useNotificationPermission() {
630
687
  }
631
688
 
632
689
  // src/hooks/ui/use-onboarding-state.ts
633
- import { useState as useState10, useEffect as useEffect8, useCallback as useCallback6 } from "react";
690
+ import { useState as useState10, useEffect as useEffect9, useCallback as useCallback6 } from "react";
634
691
 
635
692
  // src/utils/onboarding-storage.ts
636
693
  var DEFAULT_STATE = {
@@ -707,7 +764,7 @@ function dismissOnboarding(key) {
707
764
  function useOnboardingState(storageKey = "openframe-onboarding-state") {
708
765
  const [state, setState] = useState10(() => loadOnboardingState(storageKey));
709
766
  const [, forceUpdate] = useState10(0);
710
- useEffect8(() => {
767
+ useEffect9(() => {
711
768
  const handleStorageUpdate = (e) => {
712
769
  if (e.detail.key === storageKey) {
713
770
  const newState = loadOnboardingState(storageKey);
@@ -768,7 +825,7 @@ function useOnboardingState(storageKey = "openframe-onboarding-state") {
768
825
  }
769
826
 
770
827
  // src/hooks/ui/use-search.ts
771
- import { useState as useState11, useEffect as useEffect9, useCallback as useCallback7 } from "react";
828
+ import { useState as useState11, useEffect as useEffect10, useCallback as useCallback7 } from "react";
772
829
  function useSearch(config) {
773
830
  const { searchFn, mapResult, debounceMs = 300, minQueryLength = 2 } = config;
774
831
  const [query, setQuery] = useState11("");
@@ -780,7 +837,7 @@ function useSearch(config) {
780
837
  setResults([]);
781
838
  setError(null);
782
839
  }, []);
783
- useEffect9(() => {
840
+ useEffect10(() => {
784
841
  if (!debouncedQuery || debouncedQuery.length < minQueryLength) {
785
842
  setResults([]);
786
843
  setIsLoading(false);
@@ -853,11 +910,11 @@ function useTablePagination(config) {
853
910
  }
854
911
 
855
912
  // src/hooks/ui/use-throttle.ts
856
- import { useState as useState12, useEffect as useEffect10, useRef as useRef5 } from "react";
913
+ import { useState as useState12, useEffect as useEffect11, useRef as useRef6 } from "react";
857
914
  function useThrottle(value, limit = 200) {
858
915
  const [throttledValue, setThrottledValue] = useState12(value);
859
- const lastUpdated = useRef5(Date.now());
860
- useEffect10(() => {
916
+ const lastUpdated = useRef6(Date.now());
917
+ useEffect11(() => {
861
918
  const now = Date.now();
862
919
  const elapsed = now - lastUpdated.current;
863
920
  if (elapsed >= limit) {
@@ -900,8 +957,11 @@ function useWindowSize() {
900
957
  return windowSize;
901
958
  }
902
959
 
960
+ // src/hooks/ui/index.ts
961
+ import { usePreventScroll } from "@react-aria/overlays";
962
+
903
963
  // src/hooks/platform/use-platform-config.ts
904
- import { useState as useState14, useEffect as useEffect11 } from "react";
964
+ import { useState as useState14, useEffect as useEffect12 } from "react";
905
965
 
906
966
  // src/utils/platform-config.tsx
907
967
  import { Globe } from "lucide-react";
@@ -1082,7 +1142,7 @@ function usePlatformConfig() {
1082
1142
  const [platforms, setPlatforms] = useState14(platformCache || []);
1083
1143
  const [isLoading, setIsLoading] = useState14(!platformCache);
1084
1144
  const [error, setError] = useState14(null);
1085
- useEffect11(() => {
1145
+ useEffect12(() => {
1086
1146
  if (platformCache) {
1087
1147
  setPlatforms(platformCache);
1088
1148
  setIsLoading(false);
@@ -1531,7 +1591,7 @@ var useToast = () => ({
1531
1591
  });
1532
1592
 
1533
1593
  // src/hooks/use-contact-submission.ts
1534
- import { useState as useState16, useCallback as useCallback8, useEffect as useEffect12 } from "react";
1594
+ import { useState as useState16, useCallback as useCallback8, useEffect as useEffect13 } from "react";
1535
1595
  init_next_navigation();
1536
1596
 
1537
1597
  // src/utils/local-storage-adapter.ts
@@ -1833,7 +1893,7 @@ function useContactSubmission(options = {}) {
1833
1893
  setIsSubmitting(false);
1834
1894
  }
1835
1895
  }, [isSubmitting, toast2, userId, successToastMessage, contactUrl]);
1836
- useEffect12(() => {
1896
+ useEffect13(() => {
1837
1897
  if (isSuccess && successRedirectUrl) {
1838
1898
  console.log("\u{1F680} Contact submission successful, redirecting to:", successRedirectUrl);
1839
1899
  const timer = setTimeout(() => {
@@ -1847,7 +1907,7 @@ function useContactSubmission(options = {}) {
1847
1907
  return () => clearTimeout(timer);
1848
1908
  }
1849
1909
  }, [isSuccess, successRedirectUrl, router]);
1850
- useEffect12(() => {
1910
+ useEffect13(() => {
1851
1911
  if (isSuccess && onSuccess) {
1852
1912
  onSuccess();
1853
1913
  }
@@ -1856,18 +1916,18 @@ function useContactSubmission(options = {}) {
1856
1916
  }
1857
1917
 
1858
1918
  // src/hooks/use-quick-action-hint.ts
1859
- import { useEffect as useEffect13, useState as useState17, useRef as useRef6, useCallback as useCallback9 } from "react";
1919
+ import { useEffect as useEffect14, useState as useState17, useRef as useRef7, useCallback as useCallback9 } from "react";
1860
1920
  function useQuickActionHint({
1861
1921
  actionCount,
1862
1922
  cycleDuration = 5e3,
1863
1923
  enabled = true
1864
1924
  }) {
1865
1925
  const [activeHintIndex, setActiveHintIndex] = useState17(-1);
1866
- const containerRef = useRef6(null);
1867
- const timeoutRef = useRef6(null);
1868
- const cycleCountRef = useRef6(0);
1869
- const currentIndexRef = useRef6(0);
1870
- const sequenceRef = useRef6([]);
1926
+ const containerRef = useRef7(null);
1927
+ const timeoutRef = useRef7(null);
1928
+ const cycleCountRef = useRef7(0);
1929
+ const currentIndexRef = useRef7(0);
1930
+ const sequenceRef = useRef7([]);
1871
1931
  const shuffleIndices = useCallback9((length) => {
1872
1932
  const indices = Array.from({ length }, (_, i) => i);
1873
1933
  for (let i = indices.length - 1; i > 0; i--) {
@@ -1899,7 +1959,7 @@ function useQuickActionHint({
1899
1959
  }
1900
1960
  timeoutRef.current = setTimeout(advanceHint, cycleDuration);
1901
1961
  }, [actionCount, cycleDuration, shuffleIndices]);
1902
- useEffect13(() => {
1962
+ useEffect14(() => {
1903
1963
  if (!enabled || actionCount === 0) {
1904
1964
  return;
1905
1965
  }
@@ -1952,7 +2012,7 @@ function useCopyToClipboard({
1952
2012
  }
1953
2013
 
1954
2014
  // src/hooks/use-batch-images.ts
1955
- import { useEffect as useEffect14, useMemo as useMemo2, useState as useState19, useRef as useRef7 } from "react";
2015
+ import { useEffect as useEffect15, useMemo as useMemo2, useState as useState19, useRef as useRef8 } from "react";
1956
2016
  var globalBatchImageConfig = {};
1957
2017
  function configureBatchImageFetch(config) {
1958
2018
  globalBatchImageConfig = { ...globalBatchImageConfig, ...config };
@@ -2031,8 +2091,8 @@ function useBatchImages(imageUrls, config) {
2031
2091
  () => Array.from(new Set(imageUrls.filter((url) => Boolean(url)))),
2032
2092
  [imageUrls]
2033
2093
  );
2034
- const requestedUrls = useRef7(/* @__PURE__ */ new Set());
2035
- useEffect14(() => {
2094
+ const requestedUrls = useRef8(/* @__PURE__ */ new Set());
2095
+ useEffect15(() => {
2036
2096
  if (uniqueUrls.length === 0) {
2037
2097
  setFetchedImages({});
2038
2098
  return;
@@ -2062,7 +2122,7 @@ function useBatchImages(imageUrls, config) {
2062
2122
  }
2063
2123
 
2064
2124
  // src/hooks/use-authenticated-image.ts
2065
- import { useEffect as useEffect15, useState as useState20, useRef as useRef8 } from "react";
2125
+ import { useEffect as useEffect16, useState as useState20, useRef as useRef9 } from "react";
2066
2126
  var globalImageConfig = {};
2067
2127
  var imageCache = /* @__PURE__ */ new Map();
2068
2128
  var pendingRequests = /* @__PURE__ */ new Map();
@@ -2094,8 +2154,8 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
2094
2154
  const [fetchedImageUrl, setFetchedImageUrl] = useState20();
2095
2155
  const [isLoading, setIsLoading] = useState20(false);
2096
2156
  const [error, setError] = useState20(null);
2097
- const currentCacheKeyRef = useRef8(null);
2098
- useEffect15(() => {
2157
+ const currentCacheKeyRef = useRef9(null);
2158
+ useEffect16(() => {
2099
2159
  if (!imageUrl) {
2100
2160
  setFetchedImageUrl(void 0);
2101
2161
  setIsLoading(false);
@@ -2206,7 +2266,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
2206
2266
  });
2207
2267
  pendingRequests.set(cacheKey, fetchPromise2);
2208
2268
  }, [imageUrl, refreshKey, config]);
2209
- useEffect15(() => {
2269
+ useEffect16(() => {
2210
2270
  return () => {
2211
2271
  if (currentCacheKeyRef.current) {
2212
2272
  const entry = imageCache.get(currentCacheKeyRef.current);
@@ -2221,7 +2281,7 @@ function useAuthenticatedImage(imageUrl, refreshKey, config) {
2221
2281
 
2222
2282
  // src/hooks/state/use-query-params.ts
2223
2283
  init_next_navigation();
2224
- import { useEffect as useEffect16, useState as useState21, useMemo as useMemo3, useCallback as useCallback11 } from "react";
2284
+ import { useEffect as useEffect17, useState as useState21, useMemo as useMemo3, useCallback as useCallback11 } from "react";
2225
2285
 
2226
2286
  // src/hooks/state/graphql-parser.ts
2227
2287
  import {
@@ -2690,7 +2750,7 @@ function useQueryParams(query, options = {}) {
2690
2750
  const defaultValues = options.defaultValues || {};
2691
2751
  const skipIntrospection = options.skipIntrospection || false;
2692
2752
  const debug = options.debug || false;
2693
- useEffect16(() => {
2753
+ useEffect17(() => {
2694
2754
  async function initialize() {
2695
2755
  try {
2696
2756
  if (debug) console.log("[useQueryParams] Initializing...");
@@ -2842,9 +2902,9 @@ function applyParamMapping(schema, mapping) {
2842
2902
 
2843
2903
  // src/hooks/state/use-api-params.ts
2844
2904
  init_next_navigation();
2845
- import { useCallback as useCallback12, useMemo as useMemo4, useRef as useRef9 } from "react";
2905
+ import { useCallback as useCallback12, useMemo as useMemo4, useRef as useRef10 } from "react";
2846
2906
  function useContentStable(value, key) {
2847
- const ref = useRef9(void 0);
2907
+ const ref = useRef10(void 0);
2848
2908
  if (ref.current && ref.current.key === key) return ref.current.value;
2849
2909
  ref.current = { value, key };
2850
2910
  return value;
@@ -2877,7 +2937,7 @@ function useApiParams(schema, options = {}) {
2877
2937
  }
2878
2938
  return flattened;
2879
2939
  }, [schemaKey]);
2880
- const prevParamsRef = useRef9(void 0);
2940
+ const prevParamsRef = useRef10(void 0);
2881
2941
  const params = useMemo4(() => {
2882
2942
  const sp = new URLSearchParams(searchString);
2883
2943
  const result = {};
@@ -3037,7 +3097,7 @@ function createSearchParams(params) {
3037
3097
  }
3038
3098
 
3039
3099
  // src/hooks/state/use-cursor-pagination-state.ts
3040
- import { useCallback as useCallback13, useEffect as useEffect17, useRef as useRef10, useState as useState22 } from "react";
3100
+ import { useCallback as useCallback13, useEffect as useEffect18, useRef as useRef11, useState as useState22 } from "react";
3041
3101
  var urlSchema = {
3042
3102
  search: { type: "string", default: "" },
3043
3103
  cursor: { type: "string", default: "" }
@@ -3051,10 +3111,10 @@ function useCursorPaginationState(options) {
3051
3111
  const [searchInput, setSearchInput] = useState22(params.search || "");
3052
3112
  const [hasLoadedBeyondFirst, setHasLoadedBeyondFirst] = useState22(false);
3053
3113
  const [initialLoadCount, setInitialLoadCount] = useState22(0);
3054
- const lastSearchRef = useRef10(null);
3055
- const isSyncingFromUrl = useRef10(false);
3056
- const isInitialLoadInProgress = useRef10(true);
3057
- useEffect17(() => {
3114
+ const lastSearchRef = useRef11(null);
3115
+ const isSyncingFromUrl = useRef11(false);
3116
+ const isInitialLoadInProgress = useRef11(true);
3117
+ useEffect18(() => {
3058
3118
  if (isInitialLoadInProgress.current) return;
3059
3119
  const urlSearch = params.search || "";
3060
3120
  if (urlSearch !== searchInput) {
@@ -3065,7 +3125,7 @@ function useCursorPaginationState(options) {
3065
3125
  }, 0);
3066
3126
  }
3067
3127
  }, [params.search, initialLoadCount]);
3068
- useEffect17(() => {
3128
+ useEffect18(() => {
3069
3129
  if (isInitialLoadInProgress.current) return;
3070
3130
  if (isSyncingFromUrl.current) return;
3071
3131
  if (searchInput !== params.search) {
@@ -3076,7 +3136,7 @@ function useCursorPaginationState(options) {
3076
3136
  });
3077
3137
  }
3078
3138
  }, [searchInput, params.search, setParams, initialLoadCount]);
3079
- useEffect17(() => {
3139
+ useEffect18(() => {
3080
3140
  if (initialLoadCount === 0) {
3081
3141
  const cursor = params.cursor || null;
3082
3142
  const search = params.search || "";
@@ -3090,7 +3150,7 @@ function useCursorPaginationState(options) {
3090
3150
  });
3091
3151
  }
3092
3152
  }, []);
3093
- useEffect17(() => {
3153
+ useEffect18(() => {
3094
3154
  if (isInitialLoadInProgress.current) return;
3095
3155
  if (initialLoadCount === 0) return;
3096
3156
  const currentSearch = params.search || "";
@@ -3130,7 +3190,7 @@ function useCursorPaginationState(options) {
3130
3190
  }
3131
3191
 
3132
3192
  // src/hooks/nats/use-nats-client.ts
3133
- import { useEffect as useEffect18, useMemo as useMemo5, useState as useState23 } from "react";
3193
+ import { useEffect as useEffect19, useMemo as useMemo5, useState as useState23 } from "react";
3134
3194
  function useNatsClient(clientOptions, options = {}) {
3135
3195
  const { autoConnect = true } = options;
3136
3196
  const client = useMemo5(() => {
@@ -3139,7 +3199,7 @@ function useNatsClient(clientOptions, options = {}) {
3139
3199
  }, [clientOptions]);
3140
3200
  const [status, setStatus] = useState23("disconnected");
3141
3201
  const [lastError, setLastError] = useState23(null);
3142
- useEffect18(() => {
3202
+ useEffect19(() => {
3143
3203
  if (!client) {
3144
3204
  setStatus("disconnected");
3145
3205
  setLastError(null);
@@ -3170,7 +3230,7 @@ function useNatsClient(clientOptions, options = {}) {
3170
3230
  }
3171
3231
 
3172
3232
  // src/hooks/use-near-viewport.ts
3173
- import { useEffect as useEffect19, useRef as useRef11, useState as useState24, useCallback as useCallback14 } from "react";
3233
+ import { useEffect as useEffect20, useRef as useRef12, useState as useState24, useCallback as useCallback14 } from "react";
3174
3234
  var observers = /* @__PURE__ */ new Map();
3175
3235
  var subscribers = /* @__PURE__ */ new WeakMap();
3176
3236
  function getObserverFor(rootMargin) {
@@ -3195,7 +3255,7 @@ function getObserverFor(rootMargin) {
3195
3255
  }
3196
3256
  function useNearViewport(rootMargin = "500px") {
3197
3257
  const [isNear, setIsNear] = useState24(false);
3198
- const elRef = useRef11(null);
3258
+ const elRef = useRef12(null);
3199
3259
  const ref = useCallback14(
3200
3260
  (node) => {
3201
3261
  const prev = elRef.current;
@@ -3214,7 +3274,7 @@ function useNearViewport(rootMargin = "500px") {
3214
3274
  },
3215
3275
  [rootMargin]
3216
3276
  );
3217
- useEffect19(() => {
3277
+ useEffect20(() => {
3218
3278
  return () => {
3219
3279
  const el = elRef.current;
3220
3280
  if (!el) return;
@@ -3372,7 +3432,7 @@ function useOgPlaceholderUrl({
3372
3432
  }
3373
3433
 
3374
3434
  // src/hooks/use-scroll-to-hash.ts
3375
- import { useEffect as useEffect20 } from "react";
3435
+ import { useEffect as useEffect21 } from "react";
3376
3436
 
3377
3437
  // src/utils/scroll-into-view.ts
3378
3438
  var activeRaf = 0;
@@ -3510,7 +3570,7 @@ function navigateSamePageHash(target, options = {}) {
3510
3570
  var MAX_POLL_FRAMES = 60;
3511
3571
  function useScrollToHash(readyDep = true, options) {
3512
3572
  const headerOffset = options?.headerOffset ?? 0;
3513
- useEffect20(() => {
3573
+ useEffect21(() => {
3514
3574
  if (typeof window === "undefined") return;
3515
3575
  if (readyDep === null || readyDep === false) return;
3516
3576
  let rafId = null;
@@ -3550,7 +3610,7 @@ function useScrollToHash(readyDep = true, options) {
3550
3610
  }
3551
3611
 
3552
3612
  // src/hooks/use-humanity-signals.ts
3553
- import { useCallback as useCallback15, useRef as useRef12 } from "react";
3613
+ import { useCallback as useCallback15, useRef as useRef13 } from "react";
3554
3614
 
3555
3615
  // src/utils/humanity-signals.ts
3556
3616
  var HONEYPOT_FIELD = "contact_url_confirm";
@@ -3574,8 +3634,8 @@ var splitCsvEnv = (s) => s?.split(",").map((t) => t.trim()).filter(Boolean) ?? [
3574
3634
 
3575
3635
  // src/hooks/use-humanity-signals.ts
3576
3636
  function useHumanitySignals() {
3577
- const ref = useRef12(null);
3578
- const mountedAt = useRef12(typeof performance !== "undefined" ? performance.now() : 0);
3637
+ const ref = useRef13(null);
3638
+ const mountedAt = useRef13(typeof performance !== "undefined" ? performance.now() : 0);
3579
3639
  const getSignals = useCallback15(
3580
3640
  () => ({
3581
3641
  [HONEYPOT_FIELD]: ref.current?.value ?? "",
@@ -3594,6 +3654,7 @@ export {
3594
3654
  useAutoLimitTags,
3595
3655
  useDebounce,
3596
3656
  useDeferredError,
3657
+ useFocusTrap,
3597
3658
  useHeaderHeight,
3598
3659
  useHorizontalScrollbar,
3599
3660
  useImageEdgeColor,
@@ -3610,6 +3671,7 @@ export {
3610
3671
  useTablePagination,
3611
3672
  useThrottle,
3612
3673
  useWindowSize,
3674
+ usePreventScroll,
3613
3675
  platformIcons,
3614
3676
  platformColors,
3615
3677
  platformDisplayNames,
@@ -3704,4 +3766,4 @@ export {
3704
3766
  splitCsvEnv,
3705
3767
  useHumanitySignals
3706
3768
  };
3707
- //# sourceMappingURL=chunk-7Q52HP45.js.map
3769
+ //# sourceMappingURL=chunk-4FNDOTW2.js.map