@flamingo-stack/openframe-frontend-core 0.0.295 → 0.0.296-snapshot.20260621021605

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 (291) hide show
  1. package/README.md +9 -0
  2. package/dist/{chunk-7RIYT7ZH.js → chunk-2QG57XOJ.js} +1067 -205
  3. package/dist/chunk-2QG57XOJ.js.map +1 -0
  4. package/dist/{chunk-7KXD7CWD.js → chunk-3JIQVE7T.js} +9 -15
  5. package/dist/{chunk-7KXD7CWD.js.map → chunk-3JIQVE7T.js.map} +1 -1
  6. package/dist/{chunk-FT4FCV7L.cjs → chunk-4PSQS3SW.cjs} +7 -9
  7. package/dist/chunk-4PSQS3SW.cjs.map +1 -0
  8. package/dist/{chunk-OOKKGOPQ.js → chunk-4TLE6VLU.js} +30 -24
  9. package/dist/chunk-4TLE6VLU.js.map +1 -0
  10. package/dist/{chunk-6IBA2MQV.cjs → chunk-53FUMSZ5.cjs} +40 -46
  11. package/dist/chunk-53FUMSZ5.cjs.map +1 -0
  12. package/dist/{chunk-D3LEFMOA.cjs → chunk-54KNMC2R.cjs} +3 -3
  13. package/dist/{chunk-D3LEFMOA.cjs.map → chunk-54KNMC2R.cjs.map} +1 -1
  14. package/dist/{chunk-EYEW6PTA.cjs → chunk-6C526VNN.cjs} +358 -118
  15. package/dist/chunk-6C526VNN.cjs.map +1 -0
  16. package/dist/{chunk-5O6N3BKR.cjs → chunk-7OVGB2DQ.cjs} +19 -25
  17. package/dist/chunk-7OVGB2DQ.cjs.map +1 -0
  18. package/dist/{chunk-6GCI7JOE.js → chunk-AD6C23QY.js} +8 -7
  19. package/dist/{chunk-6GCI7JOE.js.map → chunk-AD6C23QY.js.map} +1 -1
  20. package/dist/chunk-F5OB2YAL.cjs +144 -0
  21. package/dist/chunk-F5OB2YAL.cjs.map +1 -0
  22. package/dist/chunk-FBWXMMRB.cjs +2 -0
  23. package/dist/chunk-FBWXMMRB.cjs.map +1 -0
  24. package/dist/{chunk-YIGPRLQY.cjs → chunk-FCDQNTDG.cjs} +21 -20
  25. package/dist/chunk-FCDQNTDG.cjs.map +1 -0
  26. package/dist/{chunk-XXI7BNB6.cjs → chunk-FQOTC3UU.cjs} +321 -18
  27. package/dist/chunk-FQOTC3UU.cjs.map +1 -0
  28. package/dist/{chunk-INDQMNP6.cjs → chunk-GUTS7HGA.cjs} +11658 -2146
  29. package/dist/chunk-GUTS7HGA.cjs.map +1 -0
  30. package/dist/chunk-GZ4C3XW6.js +2 -0
  31. package/dist/chunk-GZ4C3XW6.js.map +1 -0
  32. package/dist/{chunk-HOVJGXF7.js → chunk-IL47XWV5.js} +8 -14
  33. package/dist/{chunk-HOVJGXF7.js.map → chunk-IL47XWV5.js.map} +1 -1
  34. package/dist/{chunk-LCNMR277.js → chunk-IZ7JSBFP.js} +1 -1
  35. package/dist/chunk-IZ7JSBFP.js.map +1 -0
  36. package/dist/{chunk-5IJ46KAV.js → chunk-JALO4TAZ.js} +360 -57
  37. package/dist/chunk-JALO4TAZ.js.map +1 -0
  38. package/dist/{chunk-AQOWFSMB.cjs → chunk-L6PSSIUQ.cjs} +1 -1
  39. package/dist/chunk-L6PSSIUQ.cjs.map +1 -0
  40. package/dist/{chunk-J3RDKZ32.js → chunk-L7ULJKG7.js} +6 -10
  41. package/dist/{chunk-J3RDKZ32.js.map → chunk-L7ULJKG7.js.map} +1 -1
  42. package/dist/{chunk-6BZEAPNT.js → chunk-PC746XCO.js} +15120 -5608
  43. package/dist/chunk-PC746XCO.js.map +1 -0
  44. package/dist/{chunk-3ZXUQQL4.js → chunk-PI4WSYQV.js} +2 -2
  45. package/dist/{chunk-E4XABBSU.js → chunk-PWQUAVA3.js} +338 -98
  46. package/dist/chunk-PWQUAVA3.js.map +1 -0
  47. package/dist/chunk-SA2WPJVO.js +144 -0
  48. package/dist/chunk-SA2WPJVO.js.map +1 -0
  49. package/dist/{chunk-ETACGX2A.cjs → chunk-UNVE2SDJ.cjs} +37 -31
  50. package/dist/chunk-UNVE2SDJ.cjs.map +1 -0
  51. package/dist/{chunk-5E2HOSSH.cjs → chunk-WMSTJAZT.cjs} +913 -51
  52. package/dist/chunk-WMSTJAZT.cjs.map +1 -0
  53. package/dist/{chunk-EJXHZX2E.js → chunk-X4DOXQRT.js} +4 -6
  54. package/dist/{chunk-EJXHZX2E.js.map → chunk-X4DOXQRT.js.map} +1 -1
  55. package/dist/{chunk-A2YL7QRX.cjs → chunk-YBYI62OE.cjs} +33 -37
  56. package/dist/chunk-YBYI62OE.cjs.map +1 -0
  57. package/dist/components/case-studies/index.cjs +126 -0
  58. package/dist/components/case-studies/index.cjs.map +1 -0
  59. package/dist/components/case-studies/index.d.ts +2 -0
  60. package/dist/components/case-studies/index.d.ts.map +1 -0
  61. package/dist/components/case-studies/index.js +126 -0
  62. package/dist/components/case-studies/index.js.map +1 -0
  63. package/dist/components/case-studies/share-experience-section.d.ts +48 -0
  64. package/dist/components/case-studies/share-experience-section.d.ts.map +1 -0
  65. package/dist/components/chat/chat-container.d.ts.map +1 -1
  66. package/dist/components/chat/error-message-display.d.ts.map +1 -1
  67. package/dist/components/chat/index.cjs +8 -18
  68. package/dist/components/chat/index.cjs.map +1 -1
  69. package/dist/components/chat/index.js +75 -85
  70. package/dist/components/chat/types/component.types.d.ts +2 -0
  71. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  72. package/dist/components/contact/index.cjs +8 -15
  73. package/dist/components/contact/index.cjs.map +1 -1
  74. package/dist/components/contact/index.js +7 -14
  75. package/dist/components/docs/doc-viewer.d.ts +39 -2
  76. package/dist/components/docs/doc-viewer.d.ts.map +1 -1
  77. package/dist/components/docs/docs-hub-page.d.ts +46 -0
  78. package/dist/components/docs/docs-hub-page.d.ts.map +1 -0
  79. package/dist/components/docs/index.cjs +17 -9
  80. package/dist/components/docs/index.cjs.map +1 -1
  81. package/dist/components/docs/index.d.ts +4 -0
  82. package/dist/components/docs/index.d.ts.map +1 -1
  83. package/dist/components/docs/index.js +16 -8
  84. package/dist/components/docs/skeletons.d.ts +32 -0
  85. package/dist/components/docs/skeletons.d.ts.map +1 -0
  86. package/dist/components/docs/use-docs-resolve-link.d.ts +20 -0
  87. package/dist/components/docs/use-docs-resolve-link.d.ts.map +1 -0
  88. package/dist/components/docs/use-document-tree.d.ts.map +1 -1
  89. package/dist/components/embeds/embed-container.d.ts +37 -0
  90. package/dist/components/embeds/embed-container.d.ts.map +1 -0
  91. package/dist/components/embeds/embed-iframe.d.ts.map +1 -1
  92. package/dist/components/embeds/file-download-card.d.ts +18 -0
  93. package/dist/components/embeds/file-download-card.d.ts.map +1 -0
  94. package/dist/components/embeds/index.cjs +38 -15
  95. package/dist/components/embeds/index.cjs.map +1 -1
  96. package/dist/components/embeds/index.d.ts +8 -0
  97. package/dist/components/embeds/index.d.ts.map +1 -1
  98. package/dist/components/embeds/index.js +40 -17
  99. package/dist/components/embeds/linkedin-embed-client.d.ts +8 -0
  100. package/dist/components/embeds/linkedin-embed-client.d.ts.map +1 -0
  101. package/dist/components/embeds/markdown-image.d.ts +5 -0
  102. package/dist/components/embeds/markdown-image.d.ts.map +1 -0
  103. package/dist/components/embeds/reddit-embed-client.d.ts +7 -0
  104. package/dist/components/embeds/reddit-embed-client.d.ts.map +1 -0
  105. package/dist/components/embeds/rich-markdown-runtime.d.ts +46 -0
  106. package/dist/components/embeds/rich-markdown-runtime.d.ts.map +1 -0
  107. package/dist/components/embeds/twitter-embed-client.d.ts +8 -0
  108. package/dist/components/embeds/twitter-embed-client.d.ts.map +1 -0
  109. package/dist/components/faq/index.cjs +9 -16
  110. package/dist/components/faq/index.cjs.map +1 -1
  111. package/dist/components/faq/index.js +8 -15
  112. package/dist/components/features/index.cjs +8 -16
  113. package/dist/components/features/index.cjs.map +1 -1
  114. package/dist/components/features/index.js +24 -32
  115. package/dist/components/features/notifications/notification-drawer.d.ts.map +1 -1
  116. package/dist/components/features/notifications/notifications-context.d.ts +5 -1
  117. package/dist/components/features/notifications/notifications-context.d.ts.map +1 -1
  118. package/dist/components/index.cjs +257 -452
  119. package/dist/components/index.cjs.map +1 -1
  120. package/dist/components/index.js +781 -976
  121. package/dist/components/index.js.map +1 -1
  122. package/dist/components/layout/page-header.d.ts +78 -0
  123. package/dist/components/layout/page-header.d.ts.map +1 -0
  124. package/dist/components/layout/page-layout.d.ts +10 -1
  125. package/dist/components/layout/page-layout.d.ts.map +1 -1
  126. package/dist/components/layout/page-with-header.d.ts +67 -0
  127. package/dist/components/layout/page-with-header.d.ts.map +1 -0
  128. package/dist/components/layout/title-block.d.ts +17 -1
  129. package/dist/components/layout/title-block.d.ts.map +1 -1
  130. package/dist/components/navigation/index.cjs +7 -15
  131. package/dist/components/navigation/index.cjs.map +1 -1
  132. package/dist/components/navigation/index.js +9 -17
  133. package/dist/components/onboarding-guides/index.cjs +35 -36
  134. package/dist/components/onboarding-guides/index.cjs.map +1 -1
  135. package/dist/components/onboarding-guides/index.js +13 -14
  136. package/dist/components/onboarding-guides/index.js.map +1 -1
  137. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts +1 -1
  138. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
  139. package/dist/components/related-content/index.cjs +9 -16
  140. package/dist/components/related-content/index.cjs.map +1 -1
  141. package/dist/components/related-content/index.js +8 -15
  142. package/dist/components/shared/dev-section/dev-section-page.d.ts +9 -0
  143. package/dist/components/shared/dev-section/dev-section-page.d.ts.map +1 -1
  144. package/dist/components/shared/dev-section/dev-section-view.d.ts.map +1 -1
  145. package/dist/components/shared/dev-section/index.d.ts +1 -1
  146. package/dist/components/shared/dev-section/index.d.ts.map +1 -1
  147. package/dist/components/shared/doc-search/use-doc-search.d.ts.map +1 -1
  148. package/dist/components/shared/legal-document/legal-document-page.d.ts.map +1 -1
  149. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  150. package/dist/components/tickets/index.cjs +100 -112
  151. package/dist/components/tickets/index.cjs.map +1 -1
  152. package/dist/components/tickets/index.js +20 -32
  153. package/dist/components/tickets/index.js.map +1 -1
  154. package/dist/components/ui/button/split-button.d.ts.map +1 -1
  155. package/dist/components/ui/file-manager/index.cjs +50 -52
  156. package/dist/components/ui/file-manager/index.cjs.map +1 -1
  157. package/dist/components/ui/file-manager/index.js +4 -6
  158. package/dist/components/ui/file-manager/index.js.map +1 -1
  159. package/dist/components/ui/index.cjs +13 -19
  160. package/dist/components/ui/index.cjs.map +1 -1
  161. package/dist/components/ui/index.d.ts +2 -0
  162. package/dist/components/ui/index.d.ts.map +1 -1
  163. package/dist/components/ui/index.js +133 -139
  164. package/dist/components/ui/release-changelog-section.d.ts +6 -2
  165. package/dist/components/ui/release-changelog-section.d.ts.map +1 -1
  166. package/dist/components/ui/rich-markdown-renderer.d.ts +34 -0
  167. package/dist/components/ui/rich-markdown-renderer.d.ts.map +1 -0
  168. package/dist/components/ui/simple-markdown-renderer.d.ts +2 -8
  169. package/dist/components/ui/simple-markdown-renderer.d.ts.map +1 -1
  170. package/dist/contexts/chat-runtime-context.d.ts +14 -0
  171. package/dist/contexts/chat-runtime-context.d.ts.map +1 -1
  172. package/dist/contexts/index.cjs +3 -3
  173. package/dist/contexts/index.js +5 -5
  174. package/dist/embed-shims/index.cjs +3 -3
  175. package/dist/embed-shims/index.cjs.map +1 -1
  176. package/dist/embed-shims/index.js +4 -4
  177. package/dist/hooks/index.cjs +4 -9
  178. package/dist/hooks/index.cjs.map +1 -1
  179. package/dist/hooks/index.js +6 -11
  180. package/dist/index.cjs +14 -20
  181. package/dist/index.cjs.map +1 -1
  182. package/dist/index.js +362 -368
  183. package/dist/types/doc-source.d.ts +31 -1
  184. package/dist/types/doc-source.d.ts.map +1 -1
  185. package/dist/utils/index.cjs +4 -0
  186. package/dist/utils/index.cjs.map +1 -1
  187. package/dist/utils/index.d.ts +1 -0
  188. package/dist/utils/index.d.ts.map +1 -1
  189. package/dist/utils/index.js +4 -1
  190. package/dist/utils/index.js.map +1 -1
  191. package/dist/utils/page-header-constants.d.ts +15 -0
  192. package/dist/utils/page-header-constants.d.ts.map +1 -0
  193. package/dist/utils/social-embed-cache.d.ts +29 -0
  194. package/dist/utils/social-embed-cache.d.ts.map +1 -0
  195. package/package.json +7 -1
  196. package/src/components/case-studies/index.ts +4 -0
  197. package/src/components/case-studies/share-experience-section.tsx +185 -0
  198. package/src/components/chat/chat-container.tsx +5 -7
  199. package/src/components/chat/embeddable-chat.tsx +1 -1
  200. package/src/components/chat/error-message-display.tsx +49 -31
  201. package/src/components/chat/types/component.types.ts +2 -0
  202. package/src/components/docs/doc-viewer.tsx +111 -19
  203. package/src/components/docs/docs-hub-page.tsx +149 -0
  204. package/src/components/docs/index.ts +17 -0
  205. package/src/components/docs/skeletons.tsx +138 -0
  206. package/src/components/docs/use-docs-resolve-link.ts +52 -0
  207. package/src/components/docs/use-document-tree.ts +21 -0
  208. package/src/components/embeds/embed-container.tsx +80 -0
  209. package/src/components/embeds/embed-iframe.tsx +7 -9
  210. package/src/components/embeds/file-download-card.tsx +54 -0
  211. package/src/components/embeds/index.ts +30 -0
  212. package/src/components/embeds/linkedin-embed-client.tsx +100 -0
  213. package/src/components/embeds/markdown-image.tsx +88 -0
  214. package/src/components/embeds/og-link-preview.tsx +13 -13
  215. package/src/components/embeds/reddit-embed-client.tsx +550 -0
  216. package/src/components/embeds/rich-markdown-runtime.tsx +79 -0
  217. package/src/components/embeds/twitter-embed-client.tsx +308 -0
  218. package/src/components/features/notifications/notification-drawer.tsx +18 -7
  219. package/src/components/features/notifications/notifications-context.tsx +7 -0
  220. package/src/components/layout/page-header.tsx +182 -0
  221. package/src/components/layout/page-layout.tsx +14 -1
  222. package/src/components/layout/page-with-header.tsx +110 -0
  223. package/src/components/layout/title-block.tsx +40 -62
  224. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +3 -3
  225. package/src/components/shared/dev-section/dev-section-page.tsx +9 -1
  226. package/src/components/shared/dev-section/dev-section-view.tsx +14 -9
  227. package/src/components/shared/dev-section/index.ts +1 -1
  228. package/src/components/shared/doc-search/use-doc-search.ts +7 -3
  229. package/src/components/shared/legal-document/legal-document-page.tsx +2 -2
  230. package/src/components/shared/product-release/release-detail-page.tsx +6 -4
  231. package/src/components/ui/button/split-button.tsx +5 -2
  232. package/src/components/ui/index.ts +2 -0
  233. package/src/components/ui/release-changelog-section.tsx +7 -2
  234. package/src/components/ui/rich-markdown-renderer.tsx +1203 -0
  235. package/src/components/ui/simple-markdown-renderer.tsx +7 -11
  236. package/src/contexts/chat-runtime-context.tsx +14 -0
  237. package/src/stories/NotificationDrawer.stories.tsx +2 -0
  238. package/src/types/doc-source.ts +33 -1
  239. package/src/utils/index.ts +1 -0
  240. package/src/utils/page-header-constants.ts +15 -0
  241. package/src/utils/social-embed-cache.ts +391 -0
  242. package/dist/chunk-26PKDALD.js +0 -2379
  243. package/dist/chunk-26PKDALD.js.map +0 -1
  244. package/dist/chunk-3MCHAFHB.js +0 -89
  245. package/dist/chunk-3MCHAFHB.js.map +0 -1
  246. package/dist/chunk-3XIB4VKS.cjs +0 -619
  247. package/dist/chunk-3XIB4VKS.cjs.map +0 -1
  248. package/dist/chunk-4W7NYJ3B.cjs +0 -3009
  249. package/dist/chunk-4W7NYJ3B.cjs.map +0 -1
  250. package/dist/chunk-5E2HOSSH.cjs.map +0 -1
  251. package/dist/chunk-5IJ46KAV.js.map +0 -1
  252. package/dist/chunk-5O6N3BKR.cjs.map +0 -1
  253. package/dist/chunk-6BZEAPNT.js.map +0 -1
  254. package/dist/chunk-6IBA2MQV.cjs.map +0 -1
  255. package/dist/chunk-6JINAOI7.cjs +0 -311
  256. package/dist/chunk-6JINAOI7.cjs.map +0 -1
  257. package/dist/chunk-7RIYT7ZH.js.map +0 -1
  258. package/dist/chunk-A2YL7QRX.cjs.map +0 -1
  259. package/dist/chunk-AQOWFSMB.cjs.map +0 -1
  260. package/dist/chunk-E4XABBSU.js.map +0 -1
  261. package/dist/chunk-ETACGX2A.cjs.map +0 -1
  262. package/dist/chunk-EYEW6PTA.cjs.map +0 -1
  263. package/dist/chunk-FQJK446R.js +0 -1606
  264. package/dist/chunk-FQJK446R.js.map +0 -1
  265. package/dist/chunk-FT4FCV7L.cjs.map +0 -1
  266. package/dist/chunk-INDQMNP6.cjs.map +0 -1
  267. package/dist/chunk-J54Z3OCR.cjs +0 -1606
  268. package/dist/chunk-J54Z3OCR.cjs.map +0 -1
  269. package/dist/chunk-KXCRGTRN.cjs +0 -2379
  270. package/dist/chunk-KXCRGTRN.cjs.map +0 -1
  271. package/dist/chunk-LCNMR277.js.map +0 -1
  272. package/dist/chunk-LFGGF7OT.cjs +0 -449
  273. package/dist/chunk-LFGGF7OT.cjs.map +0 -1
  274. package/dist/chunk-M2OCXTNT.js +0 -311
  275. package/dist/chunk-M2OCXTNT.js.map +0 -1
  276. package/dist/chunk-NSPOYUBH.js +0 -3009
  277. package/dist/chunk-NSPOYUBH.js.map +0 -1
  278. package/dist/chunk-OOKKGOPQ.js.map +0 -1
  279. package/dist/chunk-OQ6X7ZOC.js +0 -449
  280. package/dist/chunk-OQ6X7ZOC.js.map +0 -1
  281. package/dist/chunk-POKKCWKF.js +0 -354
  282. package/dist/chunk-POKKCWKF.js.map +0 -1
  283. package/dist/chunk-TFSYSWPS.cjs +0 -89
  284. package/dist/chunk-TFSYSWPS.cjs.map +0 -1
  285. package/dist/chunk-XXI7BNB6.cjs.map +0 -1
  286. package/dist/chunk-YD43AKI5.js +0 -619
  287. package/dist/chunk-YD43AKI5.js.map +0 -1
  288. package/dist/chunk-YETA25JW.cjs +0 -354
  289. package/dist/chunk-YETA25JW.cjs.map +0 -1
  290. package/dist/chunk-YIGPRLQY.cjs.map +0 -1
  291. /package/dist/{chunk-3ZXUQQL4.js.map → chunk-PI4WSYQV.js.map} +0 -0
@@ -1,51 +1,130 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } 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 _chunk27APPAJNcjs = require('./chunk-27APPAJN.cjs');
4
5
 
5
6
 
6
7
 
7
8
 
9
+ var _chunkG7UE6RKVcjs = require('./chunk-G7UE6RKV.cjs');
8
10
 
9
11
 
10
12
 
11
13
 
12
- var _chunkLFGGF7OTcjs = require('./chunk-LFGGF7OT.cjs');
13
-
14
-
15
- var _chunk27APPAJNcjs = require('./chunk-27APPAJN.cjs');
16
-
17
-
18
- var _chunkPXXS27EEcjs = require('./chunk-PXXS27EE.cjs');
19
-
20
-
21
- var _chunkTFSYSWPScjs = require('./chunk-TFSYSWPS.cjs');
22
-
23
14
 
24
- var _chunkYETA25JWcjs = require('./chunk-YETA25JW.cjs');
15
+ var _chunkLGLPNWS6cjs = require('./chunk-LGLPNWS6.cjs');
25
16
 
26
17
 
27
18
 
19
+ var _chunkFIG2RKZFcjs = require('./chunk-FIG2RKZF.cjs');
28
20
 
29
- var _chunkG7UE6RKVcjs = require('./chunk-G7UE6RKV.cjs');
30
21
 
31
22
 
32
- var _chunkLGLPNWS6cjs = require('./chunk-LGLPNWS6.cjs');
33
23
 
34
24
 
35
25
 
36
- var _chunkFIG2RKZFcjs = require('./chunk-FIG2RKZF.cjs');
37
-
38
26
 
39
27
 
28
+ var _chunkZS2SBWBRcjs = require('./chunk-ZS2SBWBR.cjs');
40
29
 
41
30
 
31
+ var _chunkPXXS27EEcjs = require('./chunk-PXXS27EE.cjs');
42
32
 
33
+ // src/hooks/ui/use-auto-limit-tags.ts
34
+ var _react = require('react'); var React = _interopRequireWildcard(_react);
35
+ function useAutoLimitTags({
36
+ count,
37
+ limitTags = "auto",
38
+ placeholder = "",
39
+ reserveInputWidth = true
40
+ }) {
41
+ const middleRef = _react.useRef.call(void 0, null);
42
+ const measureRef = _react.useRef.call(void 0, null);
43
+ const textMeasureRef = _react.useRef.call(void 0, null);
44
+ const badgeRef = _react.useRef.call(void 0, null);
45
+ const inputRef = _react.useRef.call(void 0, null);
46
+ const [visibleCount, setVisibleCount] = _react.useState.call(void 0, count);
47
+ const recalculate = _react.useCallback.call(void 0, () => {
48
+ if (limitTags !== "auto") {
49
+ setVisibleCount(Math.min(limitTags, count));
50
+ return;
51
+ }
52
+ const middle = middleRef.current;
53
+ const measure = measureRef.current;
54
+ if (!middle || !measure) {
55
+ setVisibleCount(count);
56
+ return;
57
+ }
58
+ if (count === 0) {
59
+ setVisibleCount(0);
60
+ return;
61
+ }
62
+ const cs = getComputedStyle(middle);
63
+ const padL = parseFloat(cs.paddingLeft) || 0;
64
+ const padR = parseFloat(cs.paddingRight) || 0;
65
+ const gap = parseFloat(cs.gap) || 0;
66
+ const middleW = middle.clientWidth;
67
+ let inputReservedW = 0;
68
+ let trailingGap = 0;
69
+ if (reserveInputWidth) {
70
+ const textW = _nullishCoalesce(_optionalChain([textMeasureRef, 'access', _2 => _2.current, 'optionalAccess', _3 => _3.offsetWidth]), () => ( 60));
71
+ const inputMinW = inputRef.current ? parseFloat(getComputedStyle(inputRef.current).minWidth) || 60 : 60;
72
+ inputReservedW = Math.max(textW + 8, inputMinW);
73
+ trailingGap = gap;
74
+ }
75
+ const available = middleW - padL - padR - inputReservedW - trailingGap;
76
+ const tagEls = Array.from(measure.children);
77
+ const widths = tagEls.map((el) => el.offsetWidth);
78
+ let total = 0;
79
+ for (let i = 0; i < widths.length; i++) {
80
+ total += widths[i] + (i > 0 ? gap : 0);
81
+ }
82
+ if (total <= available) {
83
+ setVisibleCount(count);
84
+ return;
85
+ }
86
+ const badgeW = _nullishCoalesce(_optionalChain([badgeRef, 'access', _4 => _4.current, 'optionalAccess', _5 => _5.offsetWidth]), () => ( 40));
87
+ const spaceWithBadge = available - badgeW - gap;
88
+ let used = 0;
89
+ let fitCount = 0;
90
+ for (let i = 0; i < widths.length; i++) {
91
+ const need = widths[i] + (i > 0 ? gap : 0);
92
+ if (used + need > spaceWithBadge) break;
93
+ used += need;
94
+ fitCount++;
95
+ }
96
+ setVisibleCount(Math.max(0, fitCount));
97
+ }, [count, limitTags, placeholder, reserveInputWidth]);
98
+ _react.useEffect.call(void 0, () => {
99
+ recalculate();
100
+ }, [recalculate]);
101
+ _react.useEffect.call(void 0, () => {
102
+ const el = middleRef.current;
103
+ if (!el) return;
104
+ const ro = new ResizeObserver(recalculate);
105
+ ro.observe(el);
106
+ return () => ro.disconnect();
107
+ }, [recalculate]);
108
+ return { visibleCount, middleRef, measureRef, textMeasureRef, badgeRef, inputRef };
109
+ }
43
110
 
111
+ // src/hooks/ui/use-debounce.ts
44
112
 
45
- var _chunkZS2SBWBRcjs = require('./chunk-ZS2SBWBR.cjs');
113
+ function useDebounce(value, delay = 500) {
114
+ const [debouncedValue, setDebouncedValue] = _react.useState.call(void 0, value);
115
+ _react.useEffect.call(void 0, () => {
116
+ const timer = setTimeout(() => {
117
+ setDebouncedValue(value);
118
+ }, delay);
119
+ return () => {
120
+ clearTimeout(timer);
121
+ };
122
+ }, [value, delay]);
123
+ return debouncedValue;
124
+ }
46
125
 
47
126
  // src/hooks/ui/use-header-height.ts
48
- var _react = require('react'); var React = _interopRequireWildcard(_react);
127
+
49
128
  function useHeaderHeight(defaultHeight = 64) {
50
129
  const [height, setHeight] = _react.useState.call(void 0, defaultHeight);
51
130
  _react.useEffect.call(void 0, () => {
@@ -504,16 +583,16 @@ function useNotificationPermission() {
504
583
  sync();
505
584
  let cancelled = false;
506
585
  let status;
507
- _optionalChain([navigator, 'access', _2 => _2.permissions, 'optionalAccess', _3 => _3.query, 'call', _4 => _4({ name: "notifications" }), 'access', _5 => _5.then, 'call', _6 => _6((s) => {
586
+ _optionalChain([navigator, 'access', _6 => _6.permissions, 'optionalAccess', _7 => _7.query, 'call', _8 => _8({ name: "notifications" }), 'access', _9 => _9.then, 'call', _10 => _10((s) => {
508
587
  if (cancelled) return;
509
588
  status = s;
510
589
  s.addEventListener("change", sync);
511
- }), 'access', _7 => _7.catch, 'call', _8 => _8(() => void 0)]);
590
+ }), 'access', _11 => _11.catch, 'call', _12 => _12(() => void 0)]);
512
591
  document.addEventListener("visibilitychange", sync);
513
592
  window.addEventListener("focus", sync);
514
593
  return () => {
515
594
  cancelled = true;
516
- _optionalChain([status, 'optionalAccess', _9 => _9.removeEventListener, 'call', _10 => _10("change", sync)]);
595
+ _optionalChain([status, 'optionalAccess', _13 => _13.removeEventListener, 'call', _14 => _14("change", sync)]);
517
596
  document.removeEventListener("visibilitychange", sync);
518
597
  window.removeEventListener("focus", sync);
519
598
  };
@@ -678,7 +757,7 @@ function useSearch(config) {
678
757
  const [results, setResults] = _react.useState.call(void 0, []);
679
758
  const [isLoading, setIsLoading] = _react.useState.call(void 0, false);
680
759
  const [error, setError] = _react.useState.call(void 0, null);
681
- const debouncedQuery = _chunkYETA25JWcjs.useDebounce.call(void 0, query, debounceMs);
760
+ const debouncedQuery = useDebounce(query, debounceMs);
682
761
  const clearResults = _react.useCallback.call(void 0, () => {
683
762
  setResults([]);
684
763
  setError(null);
@@ -805,6 +884,180 @@ function useWindowSize() {
805
884
 
806
885
  // src/hooks/platform/use-platform-config.ts
807
886
 
887
+
888
+ // src/utils/platform-config.tsx
889
+ var _lucidereact = require('lucide-react');
890
+ var _jsxruntime = require('react/jsx-runtime');
891
+ var platformIcons = {
892
+ openframe: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.OpenFrameLogo, { className: "h-5 w-5", lowerPathColor: "#FFC008", upperPathColor: "#ffffff" }),
893
+ openmsp: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.OpenmspLogo, { className: "h-5 w-5" }),
894
+ flamingo: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#EC4899" }),
895
+ "flamingo-teaser": /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#EC4899" }),
896
+ "marketing-hub": /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#F357BB" }),
897
+ "product-hub": /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#5EA62E" }),
898
+ "revenue-hub": /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#FFC008" }),
899
+ "people-hub": /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#5EFAF0" }),
900
+ "company-hub": /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: "h-5 w-5", fill: "#f36666" }),
901
+ tmcg: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.MiamiCyberGangLogoFaceOnly, { className: "h-5 w-5" }),
902
+ universal: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Globe, { className: "h-5 w-5 text-[#10B981]" })
903
+ };
904
+ var platformColors = {
905
+ openmsp: "bg-[#3B82F6]",
906
+ openframe: "bg-[#8B5CF6]",
907
+ flamingo: "bg-[#EC4899]",
908
+ "flamingo-teaser": "bg-[#F59E0B]",
909
+ "marketing-hub": "bg-[#F357BB]",
910
+ "product-hub": "bg-[#5EA62E]",
911
+ "revenue-hub": "bg-[#FFC008]",
912
+ "people-hub": "bg-[#5EFAF0]",
913
+ "company-hub": "bg-[#f36666]",
914
+ tmcg: "bg-[#FF6B6B]",
915
+ universal: "bg-[#10B981]"
916
+ };
917
+ var platformDisplayNames = {
918
+ openmsp: "OpenMSP",
919
+ openframe: "OpenFrame",
920
+ flamingo: "Flamingo",
921
+ "flamingo-teaser": "Flamingo Teaser",
922
+ "marketing-hub": "Flamingo Marketing Hub",
923
+ "product-hub": "Flamingo Product Hub",
924
+ "revenue-hub": "Flamingo Revenue Hub",
925
+ "people-hub": "Flamingo People Hub",
926
+ "company-hub": "Flamingo Company Hub",
927
+ tmcg: "TMCG",
928
+ universal: "Universal"
929
+ };
930
+ var platformDescriptions = {
931
+ openmsp: "Comprehensive directory and comparison platform for managed service providers (MSPs) and technology vendors. Reduce vendor costs and discover open-source alternatives.",
932
+ openframe: "AI-driven open-source security operations center (SOC) and endpoint detection platform for MSPs.",
933
+ flamingo: "AI-driven open-source OS for MSPs. Swap bloated vendor tools for open ones. Automate the boring crap. Take your margin back.",
934
+ "flamingo-teaser": "Preview of Flamingo - the AI-driven open-source OS for MSPs.",
935
+ tmcg: "The Miami Cyber Gang - A cybersecurity community focused on education and collaboration.",
936
+ universal: "Cross-platform universal content."
937
+ };
938
+ var platformSlogans = {
939
+ openmsp: "Find Your Perfect MSP Partner",
940
+ openframe: "Open-Source Security Operations",
941
+ flamingo: "Open-Source OS for MSPs",
942
+ "flamingo-teaser": "Coming Soon: Open-Source OS for MSPs",
943
+ tmcg: "Miami Cyber Community",
944
+ universal: "Universal Platform"
945
+ };
946
+ var platformHexColors = {
947
+ openmsp: "#FFC008",
948
+ openframe: "#FFC008",
949
+ flamingo: "#FF6B9D",
950
+ universal: "#FFC008",
951
+ "flamingo-teaser": "#F59E0B",
952
+ "marketing-hub": "#F357BB",
953
+ "product-hub": "#5EA62E",
954
+ "revenue-hub": "#FFC008",
955
+ "people-hub": "#5EFAF0",
956
+ "company-hub": "#f36666",
957
+ tmcg: "#FF6B6B"
958
+ };
959
+ var platformIconNames = {
960
+ openmsp: "openmsp-logo",
961
+ openframe: "openframe-logo",
962
+ flamingo: "flamingo-logo",
963
+ universal: "globe",
964
+ "flamingo-teaser": "flamingo-logo",
965
+ "marketing-hub": "flamingo-logo",
966
+ "product-hub": "flamingo-logo",
967
+ "revenue-hub": "flamingo-logo",
968
+ "people-hub": "flamingo-logo",
969
+ "company-hub": "flamingo-logo",
970
+ tmcg: "tmcg-logo"
971
+ };
972
+ function getDefaultColorForPlatform(platformName) {
973
+ return platformHexColors[platformName] || platformHexColors.universal;
974
+ }
975
+ function getDefaultIconForPlatform(platformName) {
976
+ return platformIconNames[platformName] || platformIconNames.universal;
977
+ }
978
+ function transformPlatformConfigsToOptions(platformConfigs) {
979
+ return platformConfigs.map((platform) => ({
980
+ id: platform.id,
981
+ // Database UUID for matching
982
+ name: platform.name,
983
+ // Platform name enum
984
+ displayName: platform.display_name,
985
+ // Human-readable name
986
+ description: platform.description,
987
+ icon: platformIcons[platform.name] || platformIcons.universal,
988
+ color: platformColors[platform.name] || platformColors.universal
989
+ }));
990
+ }
991
+ function getPlatformIcon(platformName) {
992
+ return platformIcons[platformName] || platformIcons.universal;
993
+ }
994
+ function getPlatformColor(platformName) {
995
+ return platformColors[platformName] || platformColors.universal;
996
+ }
997
+ function getPlatformDisplayName(platformName) {
998
+ return platformDisplayNames[platformName] || platformName;
999
+ }
1000
+ function getPlatformDescription(platformName) {
1001
+ return platformDescriptions[platformName] || platformName;
1002
+ }
1003
+ function getPlatformSlogan(platformName) {
1004
+ return platformSlogans[platformName] || platformName;
1005
+ }
1006
+ function getSmallPlatformIcon(platformName) {
1007
+ const className = "h-4 w-4 flex-shrink-0";
1008
+ switch (platformName) {
1009
+ case "openframe":
1010
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.OpenFrameLogo, { className, lowerPathColor: "#FFC008", upperPathColor: "#ffffff" });
1011
+ case "openmsp":
1012
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.OpenmspLogo, { className, frontBubbleColor: "#f1f1f1", innerFrontBubbleColor: "#000000", backBubbleColor: "#FFC008" });
1013
+ case "flamingo":
1014
+ case "flamingo-teaser":
1015
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: `${className}`, fill: "#EC4899" });
1016
+ case "marketing-hub":
1017
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-flamingo-pink-base)" });
1018
+ case "product-hub":
1019
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-attention-green-success)" });
1020
+ case "revenue-hub":
1021
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-attention-yellow-warning)" });
1022
+ case "people-hub":
1023
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-flamingo-cyan-base)" });
1024
+ case "company-hub":
1025
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-attention-red-error)" });
1026
+ case "tmcg":
1027
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.MiamiCyberGangLogoFaceOnly, { className });
1028
+ case "universal":
1029
+ default:
1030
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Globe, { className });
1031
+ }
1032
+ }
1033
+ function getPlatformIconComponent(platformName, className = "h-6 w-6") {
1034
+ switch (platformName) {
1035
+ case "openframe":
1036
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.OpenFrameLogo, { className });
1037
+ case "openmsp":
1038
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.OpenmspLogo, { className, color: "#f1f1f1" });
1039
+ case "flamingo":
1040
+ case "flamingo-teaser":
1041
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className: `${className} text-white` });
1042
+ case "marketing-hub":
1043
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-flamingo-pink-base)" });
1044
+ case "product-hub":
1045
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-attention-green-success)" });
1046
+ case "revenue-hub":
1047
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-attention-yellow-warning)" });
1048
+ case "people-hub":
1049
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-flamingo-cyan-base)" });
1050
+ case "company-hub":
1051
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.FlamingoLogo, { className, fill: "var(--ods-attention-red-error)" });
1052
+ case "tmcg":
1053
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLGLPNWS6cjs.MiamiCyberGangLogoFaceOnly, { size: 24, className });
1054
+ case "universal":
1055
+ default:
1056
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Globe, { className });
1057
+ }
1058
+ }
1059
+
1060
+ // src/hooks/platform/use-platform-config.ts
808
1061
  var platformCache = null;
809
1062
  var fetchPromise = null;
810
1063
  function usePlatformConfig() {
@@ -857,7 +1110,7 @@ function usePlatformConfig() {
857
1110
  label: platform.label
858
1111
  }))
859
1112
  ];
860
- const selectableOptions = _chunkLFGGF7OTcjs.transformPlatformConfigsToOptions.call(void 0, platforms);
1113
+ const selectableOptions = transformPlatformConfigsToOptions(platforms);
861
1114
  return {
862
1115
  platforms,
863
1116
  platformOptions,
@@ -882,8 +1135,32 @@ var _sonner = require('sonner');
882
1135
 
883
1136
 
884
1137
 
1138
+ // src/types/tool.types.ts
1139
+ var ToolTypeValues = {
1140
+ TACTICAL_RMM: "TACTICAL_RMM",
1141
+ FLEET_MDM: "FLEET_MDM",
1142
+ MESHCENTRAL: "MESHCENTRAL",
1143
+ AUTHENTIK: "AUTHENTIK",
1144
+ OPENFRAME: "OPENFRAME",
1145
+ OPENFRAME_CHAT: "OPENFRAME_CHAT",
1146
+ OPENFRAME_CLIENT: "OPENFRAME_CLIENT",
1147
+ OSQUERY: "OSQUERY",
1148
+ SYSTEM: "SYSTEM"
1149
+ };
1150
+ var toolLabels = {
1151
+ TACTICAL_RMM: "Tactical",
1152
+ FLEET_MDM: "Fleet",
1153
+ MESHCENTRAL: "MeshCentral",
1154
+ AUTHENTIK: "Authentik",
1155
+ OPENFRAME: "OpenFrame",
1156
+ OPENFRAME_CHAT: "OpenFrame Chat",
1157
+ OPENFRAME_CLIENT: "OpenFrame Client",
1158
+ OSQUERY: "Osquery",
1159
+ SYSTEM: "System"
1160
+ };
1161
+
885
1162
  // src/components/tool-icon.tsx
886
- var _jsxruntime = require('react/jsx-runtime');
1163
+
887
1164
  var renderOpenFrameLogo = (_size, className) => (
888
1165
  // eslint-disable-next-line deprecation/deprecation
889
1166
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -896,17 +1173,17 @@ var renderOpenFrameLogo = (_size, className) => (
896
1173
  )
897
1174
  );
898
1175
  var toolIconMap = {
899
- [_chunkLFGGF7OTcjs.ToolTypeValues.FLEET_MDM]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.FleetMdmLogoGreyIcon, { size, className }),
900
- [_chunkLFGGF7OTcjs.ToolTypeValues.MESHCENTRAL]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.MeshcentralLogoGreyIcon, { size, className }),
901
- [_chunkLFGGF7OTcjs.ToolTypeValues.TACTICAL_RMM]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.TacticalRmmLogoIcon, { size, className }),
902
- [_chunkLFGGF7OTcjs.ToolTypeValues.OPENFRAME]: renderOpenFrameLogo,
903
- [_chunkLFGGF7OTcjs.ToolTypeValues.OPENFRAME_CHAT]: renderOpenFrameLogo,
904
- [_chunkLFGGF7OTcjs.ToolTypeValues.OPENFRAME_CLIENT]: renderOpenFrameLogo,
905
- [_chunkLFGGF7OTcjs.ToolTypeValues.AUTHENTIK]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.AuthentikLogoGreyIcon, { size, className }),
906
- [_chunkLFGGF7OTcjs.ToolTypeValues.OSQUERY]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.OsqueryLogoGreyIcon, { size, className }),
907
- [_chunkLFGGF7OTcjs.ToolTypeValues.SYSTEM]: () => null
1176
+ [ToolTypeValues.FLEET_MDM]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.FleetMdmLogoGreyIcon, { size, className }),
1177
+ [ToolTypeValues.MESHCENTRAL]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.MeshcentralLogoGreyIcon, { size, className }),
1178
+ [ToolTypeValues.TACTICAL_RMM]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.TacticalRmmLogoIcon, { size, className }),
1179
+ [ToolTypeValues.OPENFRAME]: renderOpenFrameLogo,
1180
+ [ToolTypeValues.OPENFRAME_CHAT]: renderOpenFrameLogo,
1181
+ [ToolTypeValues.OPENFRAME_CLIENT]: renderOpenFrameLogo,
1182
+ [ToolTypeValues.AUTHENTIK]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.AuthentikLogoGreyIcon, { size, className }),
1183
+ [ToolTypeValues.OSQUERY]: (size, className) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkZS2SBWBRcjs.OsqueryLogoGreyIcon, { size, className }),
1184
+ [ToolTypeValues.SYSTEM]: () => null
908
1185
  };
909
- var ToolIcon = ({ toolType, size = 16, className }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: _nullishCoalesce(_optionalChain([toolIconMap, 'access', _11 => _11[toolType], 'optionalCall', _12 => _12(size, className)]), () => ( null)) });
1186
+ var ToolIcon = ({ toolType, size = 16, className }) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: _nullishCoalesce(_optionalChain([toolIconMap, 'access', _15 => _15[toolType], 'optionalCall', _16 => _16(size, className)]), () => ( null)) });
910
1187
  ToolIcon.displayName = "ToolIcon";
911
1188
 
912
1189
  // src/components/ui/toaster.tsx
@@ -1025,11 +1302,11 @@ function CommandApprovalToast({
1025
1302
  }) {
1026
1303
  const [expanded, setExpanded] = React.useState(defaultExpanded);
1027
1304
  const handleApprove = () => {
1028
- _optionalChain([onApprove, 'optionalCall', _13 => _13()]);
1305
+ _optionalChain([onApprove, 'optionalCall', _17 => _17()]);
1029
1306
  _sonner.toast.dismiss(id);
1030
1307
  };
1031
1308
  const handleReject = () => {
1032
- _optionalChain([onReject, 'optionalCall', _14 => _14()]);
1309
+ _optionalChain([onReject, 'optionalCall', _18 => _18()]);
1033
1310
  _sonner.toast.dismiss(id);
1034
1311
  };
1035
1312
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
@@ -1238,6 +1515,260 @@ var useToast = () => ({
1238
1515
  // src/hooks/use-contact-submission.ts
1239
1516
 
1240
1517
  _chunkG7UE6RKVcjs.init_next_navigation.call(void 0, );
1518
+
1519
+ // src/utils/local-storage-adapter.ts
1520
+ function getStorage(backend) {
1521
+ if (typeof window === "undefined") return null;
1522
+ try {
1523
+ return backend === "session" ? window.sessionStorage : window.localStorage;
1524
+ } catch (e3) {
1525
+ return null;
1526
+ }
1527
+ }
1528
+ function createLocalStorageAdapter(options) {
1529
+ const tag = _nullishCoalesce(options.logTag, () => ( "[local-storage]"));
1530
+ const backend = _nullishCoalesce(options.backend, () => ( "local"));
1531
+ const resolveKey = () => {
1532
+ const ns = _optionalChain([options, 'access', _19 => _19.namespace, 'optionalCall', _20 => _20()]);
1533
+ return ns ? `${ns}.${options.key}` : options.key;
1534
+ };
1535
+ return {
1536
+ resolveKey,
1537
+ load() {
1538
+ const storage = getStorage(backend);
1539
+ if (!storage) return null;
1540
+ try {
1541
+ const raw = storage.getItem(resolveKey());
1542
+ if (!raw) return null;
1543
+ const parsed = JSON.parse(raw);
1544
+ if (options.validate && !options.validate(parsed)) return null;
1545
+ return parsed;
1546
+ } catch (err) {
1547
+ console.warn(`${tag} parse failed for key ${resolveKey()}:`, err);
1548
+ return null;
1549
+ }
1550
+ },
1551
+ save(value) {
1552
+ const storage = getStorage(backend);
1553
+ if (!storage) return;
1554
+ try {
1555
+ storage.setItem(resolveKey(), JSON.stringify(value));
1556
+ } catch (err) {
1557
+ console.warn(`${tag} write failed for key ${resolveKey()}:`, err);
1558
+ }
1559
+ },
1560
+ clear() {
1561
+ const storage = getStorage(backend);
1562
+ if (!storage) return;
1563
+ try {
1564
+ storage.removeItem(resolveKey());
1565
+ } catch (err) {
1566
+ console.warn(`${tag} clear failed for key ${resolveKey()}:`, err);
1567
+ }
1568
+ }
1569
+ };
1570
+ }
1571
+
1572
+ // src/utils/app-config.ts
1573
+ function getAppType() {
1574
+ return process.env.NEXT_PUBLIC_APP_TYPE || "openmsp";
1575
+ }
1576
+
1577
+ // src/utils/embed-proxy-auth-storage.ts
1578
+ function isValidPersistedAuth(value) {
1579
+ if (!value || typeof value !== "object") return false;
1580
+ const v = value;
1581
+ if (typeof v.secret !== "string" || v.secret.trim().length === 0 || typeof v.email !== "string" || v.email.trim().length === 0) return false;
1582
+ if (v.firstName != null && typeof v.firstName !== "string") return false;
1583
+ if (v.lastName != null && typeof v.lastName !== "string") return false;
1584
+ if (v.avatarUrl != null && typeof v.avatarUrl !== "string") return false;
1585
+ return true;
1586
+ }
1587
+ var adapter = createLocalStorageAdapter({
1588
+ // Storage key unchanged from the legacy chat-prefixed helper. Renaming
1589
+ // it would silently log every existing admin out — the key is a
1590
+ // storage contract, not a code identifier.
1591
+ key: "chat.proxy-auth.v1",
1592
+ namespace: () => getAppType(),
1593
+ validate: isValidPersistedAuth,
1594
+ logTag: "[embed-proxy-auth-storage]",
1595
+ // localStorage — survives tab close, new tabs, and browser restarts.
1596
+ // Admin re-pasting creds every tab cycle was the dev-experience
1597
+ // tradeoff prior `sessionStorage` setup demanded — rejected. See
1598
+ // file-level doc comment for the security tradeoff rationale.
1599
+ backend: "local"
1600
+ });
1601
+ function normalizeOptional(value) {
1602
+ if (!value) return void 0;
1603
+ const trimmed = value.trim();
1604
+ return trimmed.length > 0 ? trimmed : void 0;
1605
+ }
1606
+ function getEmbedProxyAuth() {
1607
+ const persisted = adapter.load();
1608
+ if (!persisted) return null;
1609
+ return {
1610
+ secret: persisted.secret,
1611
+ email: persisted.email.trim().toLowerCase(),
1612
+ firstName: normalizeOptional(persisted.firstName),
1613
+ lastName: normalizeOptional(persisted.lastName),
1614
+ avatarUrl: normalizeOptional(persisted.avatarUrl)
1615
+ };
1616
+ }
1617
+ function getPersistedProxyEmail() {
1618
+ const persisted = adapter.load();
1619
+ return _nullishCoalesce(_optionalChain([persisted, 'optionalAccess', _21 => _21.email, 'access', _22 => _22.trim, 'call', _23 => _23(), 'access', _24 => _24.toLowerCase, 'call', _25 => _25()]), () => ( null));
1620
+ }
1621
+ function setEmbedProxyAuth(value) {
1622
+ adapter.save({
1623
+ secret: value.secret,
1624
+ email: value.email.trim().toLowerCase(),
1625
+ firstName: normalizeOptional(value.firstName),
1626
+ lastName: normalizeOptional(value.lastName),
1627
+ avatarUrl: normalizeOptional(value.avatarUrl)
1628
+ });
1629
+ }
1630
+ function clearEmbedProxyAuth() {
1631
+ adapter.clear();
1632
+ }
1633
+ function applyProxyAuth(url, baseHeaders = { "Content-Type": "application/json" }) {
1634
+ const auth = getEmbedProxyAuth();
1635
+ const headers = { ...baseHeaders };
1636
+ if (_optionalChain([auth, 'optionalAccess', _26 => _26.secret])) {
1637
+ headers.Authorization = `Bearer ${auth.secret}`;
1638
+ }
1639
+ if (_optionalChain([auth, 'optionalAccess', _27 => _27.email])) {
1640
+ headers["X-Chat-Act-As"] = auth.email;
1641
+ }
1642
+ if (_optionalChain([auth, 'optionalAccess', _28 => _28.firstName])) headers["X-Chat-First-Name"] = auth.firstName;
1643
+ if (_optionalChain([auth, 'optionalAccess', _29 => _29.lastName])) headers["X-Chat-Last-Name"] = auth.lastName;
1644
+ if (_optionalChain([auth, 'optionalAccess', _30 => _30.avatarUrl])) headers["X-Chat-Avatar-Url"] = auth.avatarUrl;
1645
+ return { url, headers };
1646
+ }
1647
+
1648
+ // src/utils/embed-authed-fetch.ts
1649
+ var ADAPTER_GLOBAL_KEY = "__embedAuthedFetchAdapter__";
1650
+ function getRegisteredAuthAdapter() {
1651
+ if (typeof globalThis === "undefined") return null;
1652
+ return _nullishCoalesce(globalThis[ADAPTER_GLOBAL_KEY], () => ( null));
1653
+ }
1654
+ function storeRegisteredAuthAdapter(adapter2) {
1655
+ if (typeof globalThis === "undefined") return;
1656
+ globalThis[ADAPTER_GLOBAL_KEY] = adapter2;
1657
+ }
1658
+ function setEmbedAuthAdapter(adapter2) {
1659
+ if (adapter2 && getRegisteredAuthAdapter() && process.env.NODE_ENV !== "production") {
1660
+ console.warn(
1661
+ "[setEmbedAuthAdapter] overwriting a previously-registered auth adapter. Two chat-runtime providers should not coexist \u2014 verify mount order and pass `null` from the unmounting provider."
1662
+ );
1663
+ }
1664
+ storeRegisteredAuthAdapter(adapter2);
1665
+ }
1666
+ function hasEmbedAuthAdapter() {
1667
+ return getRegisteredAuthAdapter() !== null;
1668
+ }
1669
+ function embedAuthedFetch(url, init = {}) {
1670
+ assertSameOrigin(url);
1671
+ let baseHeaders;
1672
+ if (init.headers === void 0) {
1673
+ baseHeaders = { "Content-Type": "application/json" };
1674
+ } else {
1675
+ baseHeaders = {};
1676
+ if (init.headers instanceof Headers) {
1677
+ init.headers.forEach((v, k) => {
1678
+ baseHeaders[k] = v;
1679
+ });
1680
+ } else if (Array.isArray(init.headers)) {
1681
+ for (const [k, v] of init.headers) baseHeaders[k] = v;
1682
+ } else {
1683
+ Object.assign(baseHeaders, init.headers);
1684
+ }
1685
+ }
1686
+ return fetchWithRefresh(url, init, baseHeaders, false);
1687
+ }
1688
+ var IN_FLIGHT_REFRESH_GLOBAL_KEY = "__embedAuthedFetchInFlightRefresh__";
1689
+ function getInFlightRefresh() {
1690
+ if (typeof globalThis === "undefined") return null;
1691
+ return _nullishCoalesce(globalThis[IN_FLIGHT_REFRESH_GLOBAL_KEY], () => ( null));
1692
+ }
1693
+ function setInFlightRefresh(refresh) {
1694
+ if (typeof globalThis === "undefined") return;
1695
+ globalThis[IN_FLIGHT_REFRESH_GLOBAL_KEY] = refresh;
1696
+ }
1697
+ function dedupedRefresh() {
1698
+ const adapter2 = getRegisteredAuthAdapter();
1699
+ if (!_optionalChain([adapter2, 'optionalAccess', _31 => _31.refresh])) return Promise.resolve(false);
1700
+ let inFlightRefresh = getInFlightRefresh();
1701
+ if (!inFlightRefresh) {
1702
+ inFlightRefresh = Promise.resolve().then(() => adapter2.refresh()).catch(() => false).finally(() => {
1703
+ setInFlightRefresh(null);
1704
+ });
1705
+ setInFlightRefresh(inFlightRefresh);
1706
+ }
1707
+ return inFlightRefresh;
1708
+ }
1709
+ async function fetchWithRefresh(url, init, baseHeaders, isRetry) {
1710
+ const { url: authedUrl, headers } = applyProxyAuth(url, { ...baseHeaders });
1711
+ const adapter2 = getRegisteredAuthAdapter();
1712
+ if (_optionalChain([adapter2, 'optionalAccess', _32 => _32.getHeaders])) {
1713
+ for (const [k, v] of Object.entries(adapter2.getHeaders())) {
1714
+ if (v !== void 0) headers[k] = v;
1715
+ }
1716
+ }
1717
+ const credentials = _nullishCoalesce(_nullishCoalesce(_optionalChain([adapter2, 'optionalAccess', _33 => _33.credentials]), () => ( init.credentials)), () => ( "same-origin"));
1718
+ const response = await fetch(authedUrl, {
1719
+ ...init,
1720
+ headers,
1721
+ // Default `same-origin` carries Supabase cookies for the MPH proxy-
1722
+ // auth model. Hosts on different origins (openframe-frontend ↔
1723
+ // openframe gateway) register `credentials: 'include'` via the
1724
+ // adapter to make their own cookies travel cross-origin (CORS +
1725
+ // `SameSite=None` must be configured server-side for that to work).
1726
+ credentials
1727
+ });
1728
+ if (response.status === 401 && !isRetry && _optionalChain([adapter2, 'optionalAccess', _34 => _34.refresh])) {
1729
+ const refreshed = await dedupedRefresh();
1730
+ if (refreshed) {
1731
+ return fetchWithRefresh(url, init, baseHeaders, true);
1732
+ }
1733
+ }
1734
+ return response;
1735
+ }
1736
+ function assertSameOrigin(url) {
1737
+ if (typeof window === "undefined") return;
1738
+ let target;
1739
+ let pageOrigin;
1740
+ try {
1741
+ target = new URL(url, window.location.href);
1742
+ pageOrigin = new URL(window.location.href).origin;
1743
+ } catch (e4) {
1744
+ throw new Error(`embedAuthedFetch: refusing to fetch malformed URL (${JSON.stringify(url)})`);
1745
+ }
1746
+ if (target.protocol !== "http:" && target.protocol !== "https:") {
1747
+ throw new Error(
1748
+ `embedAuthedFetch: refusing non-http(s) URL (${target.protocol}) \u2014 pass a relative /api/* path instead`
1749
+ );
1750
+ }
1751
+ if (target.origin !== pageOrigin) {
1752
+ if (process.env.NODE_ENV !== "production") {
1753
+ console.warn(
1754
+ `[embedAuthedFetch] cross-origin fetch to ${target.origin} allowed in dev (NODE_ENV !== 'production'). Production builds will reject this \u2014 wire a same-origin proxy before shipping.`
1755
+ );
1756
+ return;
1757
+ }
1758
+ throw new Error(
1759
+ `embedAuthedFetch: refusing cross-origin fetch to ${target.origin} \u2014 pass a relative /api/* path instead`
1760
+ );
1761
+ }
1762
+ }
1763
+
1764
+ // src/utils/embed-content-fetch.ts
1765
+ var contentFetch = (input, init) => {
1766
+ if (!hasEmbedAuthAdapter()) return fetch(input, init);
1767
+ const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
1768
+ return embedAuthedFetch(url, init);
1769
+ };
1770
+
1771
+ // src/hooks/use-contact-submission.ts
1241
1772
  function useContactSubmission(options = {}) {
1242
1773
  const { userId, successRedirectUrl, successToastMessage, onSuccess } = options;
1243
1774
  const { toast: toast2 } = useToast();
@@ -1249,7 +1780,7 @@ function useContactSubmission(options = {}) {
1249
1780
  if (isSubmitting) return;
1250
1781
  setIsSubmitting(true);
1251
1782
  try {
1252
- const response = await _chunkTFSYSWPScjs.contentFetch.call(void 0, contactUrl, {
1783
+ const response = await contentFetch(contactUrl, {
1253
1784
  method: "POST",
1254
1785
  headers: { "Content-Type": "application/json" },
1255
1786
  body: JSON.stringify({
@@ -1389,7 +1920,7 @@ function useCopyToClipboard({
1389
1920
  setCopied(true);
1390
1921
  toast2({ title: successTitle, description: successDescription, variant: "success" });
1391
1922
  setTimeout(() => setCopied(false), resetDelay);
1392
- } catch (e3) {
1923
+ } catch (e5) {
1393
1924
  toast2({ title: errorTitle, description: errorDescription, variant: "destructive" });
1394
1925
  }
1395
1926
  },
@@ -1883,7 +2414,7 @@ function setNestedValue(obj, path, value) {
1883
2414
  }
1884
2415
  function getNestedValue(obj, path) {
1885
2416
  return path.split(".").reduce((current, key) => {
1886
- return _optionalChain([current, 'optionalAccess', _15 => _15[key]]);
2417
+ return _optionalChain([current, 'optionalAccess', _35 => _35[key]]);
1887
2418
  }, obj);
1888
2419
  }
1889
2420
  function mergeVariables(currentVariables, updates, schema) {
@@ -2052,7 +2583,7 @@ var GraphQLIntrospector = class {
2052
2583
  try {
2053
2584
  localStorage.removeItem(this.cacheKey);
2054
2585
  this.schema = null;
2055
- } catch (e4) {
2586
+ } catch (e6) {
2056
2587
  }
2057
2588
  }
2058
2589
  /**
@@ -2616,8 +3147,125 @@ function useNatsClient(clientOptions, options = {}) {
2616
3147
  };
2617
3148
  }
2618
3149
 
3150
+ // src/hooks/use-near-viewport.ts
3151
+
3152
+ var observers = /* @__PURE__ */ new Map();
3153
+ var subscribers = /* @__PURE__ */ new WeakMap();
3154
+ function getObserverFor(rootMargin) {
3155
+ const existing = observers.get(rootMargin);
3156
+ if (existing) return existing;
3157
+ const io = new IntersectionObserver(
3158
+ (entries) => {
3159
+ entries.forEach((entry) => {
3160
+ if (!entry.isIntersecting) return;
3161
+ const cb = subscribers.get(entry.target);
3162
+ if (cb) {
3163
+ cb();
3164
+ io.unobserve(entry.target);
3165
+ subscribers.delete(entry.target);
3166
+ }
3167
+ });
3168
+ },
3169
+ { rootMargin }
3170
+ );
3171
+ observers.set(rootMargin, io);
3172
+ return io;
3173
+ }
3174
+ function useNearViewport(rootMargin = "500px") {
3175
+ const [isNear, setIsNear] = _react.useState.call(void 0, false);
3176
+ const elRef = _react.useRef.call(void 0, null);
3177
+ const ref = _react.useCallback.call(void 0,
3178
+ (node) => {
3179
+ const prev = elRef.current;
3180
+ if (prev) {
3181
+ const stillOurs = subscribers.get(prev);
3182
+ if (stillOurs) {
3183
+ subscribers.delete(prev);
3184
+ _optionalChain([observers, 'access', _36 => _36.get, 'call', _37 => _37(rootMargin), 'optionalAccess', _38 => _38.unobserve, 'call', _39 => _39(prev)]);
3185
+ }
3186
+ }
3187
+ elRef.current = node;
3188
+ if (!node) return;
3189
+ const cb = () => setIsNear(true);
3190
+ subscribers.set(node, cb);
3191
+ getObserverFor(rootMargin).observe(node);
3192
+ },
3193
+ [rootMargin]
3194
+ );
3195
+ _react.useEffect.call(void 0, () => {
3196
+ return () => {
3197
+ const el = elRef.current;
3198
+ if (!el) return;
3199
+ if (subscribers.get(el)) {
3200
+ subscribers.delete(el);
3201
+ _optionalChain([observers, 'access', _40 => _40.get, 'call', _41 => _41(rootMargin), 'optionalAccess', _42 => _42.unobserve, 'call', _43 => _43(el)]);
3202
+ }
3203
+ };
3204
+ }, [rootMargin]);
3205
+ return { ref, isNear };
3206
+ }
3207
+
2619
3208
  // src/hooks/use-access-code-integration.ts
2620
3209
 
3210
+
3211
+ // src/utils/access-code-client.ts
3212
+ async function validateAccessCode(email, code, endpoints) {
3213
+ try {
3214
+ const response = await fetch(endpoints.validateUrl, {
3215
+ method: "POST",
3216
+ headers: {
3217
+ "Content-Type": "application/json"
3218
+ },
3219
+ body: JSON.stringify({ email, code })
3220
+ });
3221
+ if (!response.ok) {
3222
+ const error = await response.json().catch(() => ({}));
3223
+ throw new Error(error.error || "Validation request failed");
3224
+ }
3225
+ return await response.json();
3226
+ } catch (error) {
3227
+ return {
3228
+ valid: false,
3229
+ message: error instanceof Error ? error.message : "Validation failed"
3230
+ };
3231
+ }
3232
+ }
3233
+ async function consumeAccessCode(email, code, endpoints) {
3234
+ try {
3235
+ const response = await fetch(endpoints.consumeUrl, {
3236
+ method: "POST",
3237
+ headers: {
3238
+ "Content-Type": "application/json"
3239
+ },
3240
+ body: JSON.stringify({ email, code })
3241
+ });
3242
+ if (!response.ok) {
3243
+ const error = await response.json().catch(() => ({}));
3244
+ throw new Error(error.error || "Consumption request failed");
3245
+ }
3246
+ return await response.json();
3247
+ } catch (error) {
3248
+ return {
3249
+ success: false,
3250
+ consumed: false,
3251
+ message: error instanceof Error ? error.message : "Consumption failed"
3252
+ };
3253
+ }
3254
+ }
3255
+ async function validateAndConsumeAccessCode(email, code, endpoints) {
3256
+ const validation = await validateAccessCode(email, code, endpoints);
3257
+ if (!validation.valid) {
3258
+ return validation;
3259
+ }
3260
+ const consumption = await consumeAccessCode(email, code, endpoints);
3261
+ return {
3262
+ ...validation,
3263
+ consumed: consumption.consumed,
3264
+ message: consumption.consumed ? `Access granted for ${validation.cohort_name}` : consumption.message || validation.message
3265
+ };
3266
+ }
3267
+
3268
+ // src/hooks/use-access-code-integration.ts
2621
3269
  function useAccessCodeIntegration() {
2622
3270
  const runtime = _chunk27APPAJNcjs.useRequiredEndpointsRuntime.call(void 0, );
2623
3271
  const endpoints = runtime.accessCode;
@@ -2626,7 +3274,7 @@ function useAccessCodeIntegration() {
2626
3274
  const validate = async (email, code) => {
2627
3275
  setIsValidating(true);
2628
3276
  try {
2629
- return await _chunkLFGGF7OTcjs.validateAccessCode.call(void 0, email, code, endpoints);
3277
+ return await validateAccessCode(email, code, endpoints);
2630
3278
  } finally {
2631
3279
  setIsValidating(false);
2632
3280
  }
@@ -2634,7 +3282,7 @@ function useAccessCodeIntegration() {
2634
3282
  const consume = async (email, code) => {
2635
3283
  setIsConsuming(true);
2636
3284
  try {
2637
- return await _chunkLFGGF7OTcjs.consumeAccessCode.call(void 0, email, code, endpoints);
3285
+ return await consumeAccessCode(email, code, endpoints);
2638
3286
  } finally {
2639
3287
  setIsConsuming(false);
2640
3288
  }
@@ -2643,7 +3291,7 @@ function useAccessCodeIntegration() {
2643
3291
  setIsValidating(true);
2644
3292
  setIsConsuming(true);
2645
3293
  try {
2646
- return await _chunkLFGGF7OTcjs.validateAndConsumeAccessCode.call(void 0, email, code, endpoints);
3294
+ return await validateAndConsumeAccessCode(email, code, endpoints);
2647
3295
  } finally {
2648
3296
  setIsValidating(false);
2649
3297
  setIsConsuming(false);
@@ -2659,11 +3307,157 @@ function useAccessCodeIntegration() {
2659
3307
  };
2660
3308
  }
2661
3309
 
3310
+ // src/hooks/use-og-placeholder.ts
3311
+
3312
+ function useOgPlaceholder(buildUrl, title, siteName = "", enabled = true, aspect = "wide") {
3313
+ return _react.useMemo.call(void 0, () => {
3314
+ if (!enabled || !title) return null;
3315
+ const options = {};
3316
+ if (siteName) options.site = siteName;
3317
+ if (aspect === "square") options.aspect = "square";
3318
+ return buildUrl(title, options);
3319
+ }, [buildUrl, title, siteName, enabled, aspect]);
3320
+ }
3321
+
2662
3322
  // src/hooks/use-scroll-to-hash.ts
2663
3323
 
3324
+
3325
+ // src/utils/scroll-into-view.ts
3326
+ var activeRaf = 0;
3327
+ var teardownActive = null;
3328
+ function cancelActiveScroll() {
3329
+ if (activeRaf) {
3330
+ cancelAnimationFrame(activeRaf);
3331
+ activeRaf = 0;
3332
+ }
3333
+ if (teardownActive) {
3334
+ teardownActive();
3335
+ teardownActive = null;
3336
+ }
3337
+ }
3338
+ var easeOutCubic = (t) => 1 - Math.pow(1 - t, 3);
3339
+ function getScrollableAncestor(el) {
3340
+ for (let node = el.parentElement; node; node = node.parentElement) {
3341
+ const overflowY = getComputedStyle(node).overflowY;
3342
+ if ((overflowY === "auto" || overflowY === "scroll" || overflowY === "overlay") && node.scrollHeight > node.clientHeight) {
3343
+ return node;
3344
+ }
3345
+ }
3346
+ return null;
3347
+ }
3348
+ function scrollElementIntoView(target, options = {}) {
3349
+ if (typeof window === "undefined" || !target) return;
3350
+ const { headerOffset = 0, behavior = "smooth", adjustTargetY, durationMs = 320 } = options;
3351
+ const container = getScrollableAncestor(target);
3352
+ const readCurrent = () => container ? container.scrollTop : window.scrollY;
3353
+ const writeTo = (y) => {
3354
+ if (container) container.scrollTop = y;
3355
+ else window.scrollTo(0, y);
3356
+ };
3357
+ const computeTarget = () => {
3358
+ const raw = container ? container.scrollTop + (target.getBoundingClientRect().top - container.getBoundingClientRect().top) - headerOffset : target.getBoundingClientRect().top + window.scrollY - headerOffset;
3359
+ const adjusted = adjustTargetY ? adjustTargetY(raw) : raw;
3360
+ const maxScroll = container ? Math.max(0, container.scrollHeight - container.clientHeight) : Math.max(0, document.documentElement.scrollHeight - window.innerHeight);
3361
+ return Math.min(Math.max(0, adjusted), maxScroll);
3362
+ };
3363
+ cancelActiveScroll();
3364
+ const prefersReduced = typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
3365
+ if (behavior === "instant" || behavior === "auto" || prefersReduced) {
3366
+ writeTo(computeTarget());
3367
+ return;
3368
+ }
3369
+ let startY = null;
3370
+ let startTime = 0;
3371
+ const onUserGesture = () => cancelActiveScroll();
3372
+ window.addEventListener("wheel", onUserGesture, { passive: true });
3373
+ window.addEventListener("touchmove", onUserGesture, { passive: true });
3374
+ teardownActive = () => {
3375
+ window.removeEventListener("wheel", onUserGesture);
3376
+ window.removeEventListener("touchmove", onUserGesture);
3377
+ };
3378
+ const step = (now) => {
3379
+ if (startY === null) {
3380
+ startY = readCurrent();
3381
+ startTime = now;
3382
+ }
3383
+ const targetY = computeTarget();
3384
+ const t = Math.min(1, (now - startTime) / durationMs);
3385
+ const y = startY + (targetY - startY) * easeOutCubic(t);
3386
+ writeTo(y);
3387
+ if (t < 1) {
3388
+ activeRaf = requestAnimationFrame(step);
3389
+ } else {
3390
+ writeTo(computeTarget());
3391
+ activeRaf = 0;
3392
+ if (teardownActive) {
3393
+ teardownActive();
3394
+ teardownActive = null;
3395
+ }
3396
+ }
3397
+ };
3398
+ activeRaf = requestAnimationFrame(step);
3399
+ }
3400
+
3401
+ // src/utils/same-page-hash-nav.ts
3402
+ var STICKY_HEADER_OFFSET_PX = 96;
3403
+ var HUB_HEADER_OFFSET_PX = 80;
3404
+ function normalizeHashFragment(hash) {
3405
+ if (!hash) return "";
3406
+ const second = hash.indexOf("#", 1);
3407
+ return second < 0 ? hash : hash.slice(0, second);
3408
+ }
3409
+ function navigateSamePageHash(target, options = {}) {
3410
+ if (typeof window === "undefined") return false;
3411
+ const { headerOffset = 0, history: historyMode = "push" } = options;
3412
+ const normalizedTarget = target.startsWith("#") ? window.location.pathname + window.location.search + target : target;
3413
+ let url;
3414
+ try {
3415
+ url = new URL(normalizedTarget, window.location.href);
3416
+ } catch (e7) {
3417
+ return false;
3418
+ }
3419
+ if (url.origin !== window.location.origin || url.pathname !== window.location.pathname || url.search !== window.location.search) {
3420
+ return false;
3421
+ }
3422
+ const current = window.location.pathname + window.location.search + window.location.hash;
3423
+ const normalizedHash = normalizeHashFragment(url.hash);
3424
+ if (process.env.NODE_ENV === "development" && normalizedHash !== url.hash) {
3425
+ console.warn(
3426
+ `[navigateSamePageHash] malformed fragment "${url.hash}" \u2192 normalizing to "${normalizedHash}". Fix the upstream composer.`
3427
+ );
3428
+ }
3429
+ const next = url.pathname + url.search + normalizedHash;
3430
+ const id = normalizedHash && normalizedHash !== "#" ? normalizedHash.slice(1) : "";
3431
+ if (!id && next !== current) return false;
3432
+ if (next !== current) {
3433
+ const oldURL = window.location.href;
3434
+ if (historyMode === "replace") {
3435
+ window.history.replaceState(null, "", next);
3436
+ } else {
3437
+ window.history.pushState(null, "", next);
3438
+ }
3439
+ window.dispatchEvent(new HashChangeEvent("hashchange", {
3440
+ oldURL,
3441
+ newURL: window.location.href
3442
+ }));
3443
+ }
3444
+ const el = id ? document.getElementById(id) : null;
3445
+ if (id && !el && process.env.NODE_ENV === "development") {
3446
+ console.warn(
3447
+ `[navigateSamePageHash] anchor "#${id}" not found \u2014 scrolling to top.`
3448
+ );
3449
+ }
3450
+ scrollElementIntoView(_nullishCoalesce(el, () => ( document.documentElement)), {
3451
+ behavior: "smooth",
3452
+ headerOffset
3453
+ });
3454
+ return true;
3455
+ }
3456
+
3457
+ // src/hooks/use-scroll-to-hash.ts
2664
3458
  var MAX_POLL_FRAMES = 60;
2665
3459
  function useScrollToHash(readyDep = true, options) {
2666
- const headerOffset = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _16 => _16.headerOffset]), () => ( 0));
3460
+ const headerOffset = _nullishCoalesce(_optionalChain([options, 'optionalAccess', _44 => _44.headerOffset]), () => ( 0));
2667
3461
  _react.useEffect.call(void 0, () => {
2668
3462
  if (typeof window === "undefined") return;
2669
3463
  if (readyDep === null || readyDep === false) return;
@@ -2675,7 +3469,7 @@ function useScrollToHash(readyDep = true, options) {
2675
3469
  }
2676
3470
  };
2677
3471
  const tryScrollToHash = () => {
2678
- const hash = _chunkLFGGF7OTcjs.normalizeHashFragment.call(void 0, window.location.hash).slice(1);
3472
+ const hash = normalizeHashFragment(window.location.hash).slice(1);
2679
3473
  if (!hash) return;
2680
3474
  cancelPoll();
2681
3475
  let frames = 0;
@@ -2683,7 +3477,7 @@ function useScrollToHash(readyDep = true, options) {
2683
3477
  const el = document.getElementById(hash);
2684
3478
  if (el) {
2685
3479
  rafId = null;
2686
- _chunkLFGGF7OTcjs.scrollElementIntoView.call(void 0, el, { headerOffset });
3480
+ scrollElementIntoView(el, { headerOffset });
2687
3481
  return;
2688
3482
  }
2689
3483
  if (frames++ < MAX_POLL_FRAMES) {
@@ -2705,13 +3499,35 @@ function useScrollToHash(readyDep = true, options) {
2705
3499
 
2706
3500
  // src/hooks/use-humanity-signals.ts
2707
3501
 
3502
+
3503
+ // src/utils/humanity-signals.ts
3504
+ var HONEYPOT_FIELD = "contact_url_confirm";
3505
+ var ELAPSED_MS_FIELD = "form_elapsed_ms";
3506
+ var DEFAULT_MIN_FILL_MS = 700;
3507
+ function extractHumanitySignals(body) {
3508
+ const b = _nullishCoalesce(body, () => ( {}));
3509
+ const rawHp = b[HONEYPOT_FIELD];
3510
+ const honeypot = rawHp == null ? "" : String(rawHp);
3511
+ const rawMs = b[ELAPSED_MS_FIELD];
3512
+ const elapsedMs = typeof rawMs === "number" && Number.isFinite(rawMs) ? rawMs : null;
3513
+ return { honeypot, elapsedMs };
3514
+ }
3515
+ function evaluateHumanitySignals(body, opts) {
3516
+ const { honeypot, elapsedMs } = extractHumanitySignals(body);
3517
+ if (honeypot.trim() !== "") return { ok: false, reason: "honeypot" };
3518
+ if (elapsedMs !== null && elapsedMs < opts.minFillMs) return { ok: false, reason: "too_fast" };
3519
+ return { ok: true };
3520
+ }
3521
+ var splitCsvEnv = (s) => _nullishCoalesce(_optionalChain([s, 'optionalAccess', _45 => _45.split, 'call', _46 => _46(","), 'access', _47 => _47.map, 'call', _48 => _48((t) => t.trim()), 'access', _49 => _49.filter, 'call', _50 => _50(Boolean)]), () => ( []));
3522
+
3523
+ // src/hooks/use-humanity-signals.ts
2708
3524
  function useHumanitySignals() {
2709
3525
  const ref = _react.useRef.call(void 0, null);
2710
3526
  const mountedAt = _react.useRef.call(void 0, typeof performance !== "undefined" ? performance.now() : 0);
2711
3527
  const getSignals = _react.useCallback.call(void 0,
2712
3528
  () => ({
2713
- [_chunkLFGGF7OTcjs.HONEYPOT_FIELD]: _nullishCoalesce(_optionalChain([ref, 'access', _17 => _17.current, 'optionalAccess', _18 => _18.value]), () => ( "")),
2714
- [_chunkLFGGF7OTcjs.ELAPSED_MS_FIELD]: typeof performance !== "undefined" ? Math.round(performance.now() - mountedAt.current) : 0
3529
+ [HONEYPOT_FIELD]: _nullishCoalesce(_optionalChain([ref, 'access', _51 => _51.current, 'optionalAccess', _52 => _52.value]), () => ( "")),
3530
+ [ELAPSED_MS_FIELD]: typeof performance !== "undefined" ? Math.round(performance.now() - mountedAt.current) : 0
2715
3531
  }),
2716
3532
  []
2717
3533
  );
@@ -2719,7 +3535,7 @@ function useHumanitySignals() {
2719
3535
  if (ref.current) ref.current.value = "";
2720
3536
  if (typeof performance !== "undefined") mountedAt.current = performance.now();
2721
3537
  }, []);
2722
- return { honeypotInputProps: { ref, name: _chunkLFGGF7OTcjs.HONEYPOT_FIELD }, getSignals, resetSignals };
3538
+ return { honeypotInputProps: { ref, name: HONEYPOT_FIELD }, getSignals, resetSignals };
2723
3539
  }
2724
3540
 
2725
3541
 
@@ -2787,5 +3603,51 @@ function useHumanitySignals() {
2787
3603
 
2788
3604
 
2789
3605
 
2790
- exports.useHeaderHeight = useHeaderHeight; exports.useHorizontalScrollbar = useHorizontalScrollbar; exports.useImageEdgeColor = useImageEdgeColor; exports.useLocalStorage = useLocalStorage; exports.useMediaQuery = useMediaQuery; exports.breakpoints = breakpoints; exports.useSmUp = useSmUp; exports.useMdUp = useMdUp; exports.useLgUp = useLgUp; exports.useMemoizedCallback = useMemoizedCallback; exports.useNotificationPermission = useNotificationPermission; exports.useOnboardingState = useOnboardingState; exports.useSearch = useSearch; exports.useTablePagination = useTablePagination; exports.useThrottle = useThrottle; exports.useWindowSize = useWindowSize; exports.usePlatformConfig = usePlatformConfig; exports.usePlatformByValue = usePlatformByValue; exports.useValidatePlatform = useValidatePlatform; exports.ToolIcon = ToolIcon; exports.dotColorByVariant = dotColorByVariant; exports.progressColorByVariant = progressColorByVariant; exports.ToastCard = ToastCard; exports.CommandApprovalToast = CommandApprovalToast; exports.Toaster = Toaster; exports.showToast = showToast; exports.showCommandApprovalToast = showCommandApprovalToast; exports.toast = toast; exports.useToast = useToast; exports.useContactSubmission = useContactSubmission; exports.useQuickActionHint = useQuickActionHint; exports.useCopyToClipboard = useCopyToClipboard; exports.configureBatchImageFetch = configureBatchImageFetch; exports.batchFetchAuthenticatedImages = batchFetchAuthenticatedImages; exports.useBatchImages = useBatchImages; exports.configureAuthenticatedImage = configureAuthenticatedImage; exports.useAuthenticatedImage = useAuthenticatedImage; exports.extractVariablesFromQuery = extractVariablesFromQuery; exports.isScalarType = isScalarType; exports.isInputObjectType = isInputObjectType; exports.flattenQueryVariables = flattenQueryVariables; exports.mergeDefaults = mergeDefaults; exports.validateSchema = validateSchema; exports.getArrayParams = getArrayParams; exports.getRequiredParams = getRequiredParams; exports.shouldIncludeInUrl = shouldIncludeInUrl; exports.urlParamsToVariables = urlParamsToVariables; exports.variablesToUrlParams = variablesToUrlParams; exports.coerceValue = coerceValue; exports.setNestedValue = setNestedValue; exports.getNestedValue = getNestedValue; exports.mergeVariables = mergeVariables; exports.clearParams = clearParams; exports.validateVariables = validateVariables; exports.GraphQLIntrospector = GraphQLIntrospector; exports.introspector = introspector; exports.useQueryParams = useQueryParams; exports.useApiParams = useApiParams; exports.createSearchParams = createSearchParams; exports.useCursorPaginationState = useCursorPaginationState; exports.useNatsClient = useNatsClient; exports.useAccessCodeIntegration = useAccessCodeIntegration; exports.useScrollToHash = useScrollToHash; exports.useHumanitySignals = useHumanitySignals;
2791
- //# sourceMappingURL=chunk-5E2HOSSH.cjs.map
3606
+
3607
+
3608
+
3609
+
3610
+
3611
+
3612
+
3613
+
3614
+
3615
+
3616
+
3617
+
3618
+
3619
+
3620
+
3621
+
3622
+
3623
+
3624
+
3625
+
3626
+
3627
+
3628
+
3629
+
3630
+
3631
+
3632
+
3633
+
3634
+
3635
+
3636
+
3637
+
3638
+
3639
+
3640
+
3641
+
3642
+
3643
+
3644
+
3645
+
3646
+
3647
+
3648
+
3649
+
3650
+
3651
+
3652
+ exports.useAutoLimitTags = useAutoLimitTags; exports.useDebounce = useDebounce; exports.useHeaderHeight = useHeaderHeight; exports.useHorizontalScrollbar = useHorizontalScrollbar; exports.useImageEdgeColor = useImageEdgeColor; exports.useLocalStorage = useLocalStorage; exports.useMediaQuery = useMediaQuery; exports.breakpoints = breakpoints; exports.useSmUp = useSmUp; exports.useMdUp = useMdUp; exports.useLgUp = useLgUp; exports.useMemoizedCallback = useMemoizedCallback; exports.useNotificationPermission = useNotificationPermission; exports.useOnboardingState = useOnboardingState; exports.useSearch = useSearch; exports.useTablePagination = useTablePagination; exports.useThrottle = useThrottle; exports.useWindowSize = useWindowSize; exports.platformIcons = platformIcons; exports.platformColors = platformColors; exports.platformDisplayNames = platformDisplayNames; exports.platformDescriptions = platformDescriptions; exports.platformSlogans = platformSlogans; exports.platformHexColors = platformHexColors; exports.platformIconNames = platformIconNames; exports.getDefaultColorForPlatform = getDefaultColorForPlatform; exports.getDefaultIconForPlatform = getDefaultIconForPlatform; exports.transformPlatformConfigsToOptions = transformPlatformConfigsToOptions; exports.getPlatformIcon = getPlatformIcon; exports.getPlatformColor = getPlatformColor; exports.getPlatformDisplayName = getPlatformDisplayName; exports.getPlatformDescription = getPlatformDescription; exports.getPlatformSlogan = getPlatformSlogan; exports.getSmallPlatformIcon = getSmallPlatformIcon; exports.getPlatformIconComponent = getPlatformIconComponent; exports.usePlatformConfig = usePlatformConfig; exports.usePlatformByValue = usePlatformByValue; exports.useValidatePlatform = useValidatePlatform; exports.ToolTypeValues = ToolTypeValues; exports.toolLabels = toolLabels; exports.ToolIcon = ToolIcon; exports.dotColorByVariant = dotColorByVariant; exports.progressColorByVariant = progressColorByVariant; exports.ToastCard = ToastCard; exports.CommandApprovalToast = CommandApprovalToast; exports.Toaster = Toaster; exports.showToast = showToast; exports.showCommandApprovalToast = showCommandApprovalToast; exports.toast = toast; exports.useToast = useToast; exports.getAppType = getAppType; exports.getEmbedProxyAuth = getEmbedProxyAuth; exports.getPersistedProxyEmail = getPersistedProxyEmail; exports.setEmbedProxyAuth = setEmbedProxyAuth; exports.clearEmbedProxyAuth = clearEmbedProxyAuth; exports.applyProxyAuth = applyProxyAuth; exports.setEmbedAuthAdapter = setEmbedAuthAdapter; exports.embedAuthedFetch = embedAuthedFetch; exports.contentFetch = contentFetch; exports.useContactSubmission = useContactSubmission; exports.useQuickActionHint = useQuickActionHint; exports.useCopyToClipboard = useCopyToClipboard; exports.configureBatchImageFetch = configureBatchImageFetch; exports.batchFetchAuthenticatedImages = batchFetchAuthenticatedImages; exports.useBatchImages = useBatchImages; exports.configureAuthenticatedImage = configureAuthenticatedImage; exports.useAuthenticatedImage = useAuthenticatedImage; exports.extractVariablesFromQuery = extractVariablesFromQuery; exports.isScalarType = isScalarType; exports.isInputObjectType = isInputObjectType; exports.flattenQueryVariables = flattenQueryVariables; exports.mergeDefaults = mergeDefaults; exports.validateSchema = validateSchema; exports.getArrayParams = getArrayParams; exports.getRequiredParams = getRequiredParams; exports.shouldIncludeInUrl = shouldIncludeInUrl; exports.urlParamsToVariables = urlParamsToVariables; exports.variablesToUrlParams = variablesToUrlParams; exports.coerceValue = coerceValue; exports.setNestedValue = setNestedValue; exports.getNestedValue = getNestedValue; exports.mergeVariables = mergeVariables; exports.clearParams = clearParams; exports.validateVariables = validateVariables; exports.GraphQLIntrospector = GraphQLIntrospector; exports.introspector = introspector; exports.useQueryParams = useQueryParams; exports.useApiParams = useApiParams; exports.createSearchParams = createSearchParams; exports.useCursorPaginationState = useCursorPaginationState; exports.useNatsClient = useNatsClient; exports.useNearViewport = useNearViewport; exports.validateAccessCode = validateAccessCode; exports.consumeAccessCode = consumeAccessCode; exports.validateAndConsumeAccessCode = validateAndConsumeAccessCode; exports.useAccessCodeIntegration = useAccessCodeIntegration; exports.useOgPlaceholder = useOgPlaceholder; exports.scrollElementIntoView = scrollElementIntoView; exports.STICKY_HEADER_OFFSET_PX = STICKY_HEADER_OFFSET_PX; exports.HUB_HEADER_OFFSET_PX = HUB_HEADER_OFFSET_PX; exports.normalizeHashFragment = normalizeHashFragment; exports.navigateSamePageHash = navigateSamePageHash; exports.useScrollToHash = useScrollToHash; exports.HONEYPOT_FIELD = HONEYPOT_FIELD; exports.ELAPSED_MS_FIELD = ELAPSED_MS_FIELD; exports.DEFAULT_MIN_FILL_MS = DEFAULT_MIN_FILL_MS; exports.extractHumanitySignals = extractHumanitySignals; exports.evaluateHumanitySignals = evaluateHumanitySignals; exports.splitCsvEnv = splitCsvEnv; exports.useHumanitySignals = useHumanitySignals;
3653
+ //# sourceMappingURL=chunk-WMSTJAZT.cjs.map