@flamingo-stack/openframe-frontend-core 0.0.684 → 0.0.685-2452.7452.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (170) hide show
  1. package/dist/{chunk-T6KWNJDW.js → chunk-22RSJ57Z.js} +470 -465
  2. package/dist/chunk-22RSJ57Z.js.map +1 -0
  3. package/dist/{chunk-K2HZG4RM.cjs → chunk-2OD2PPNO.cjs} +32 -32
  4. package/dist/{chunk-K2HZG4RM.cjs.map → chunk-2OD2PPNO.cjs.map} +1 -1
  5. package/dist/{chunk-QFJHEDZV.js → chunk-3NY5ILEE.js} +3 -3
  6. package/dist/{chunk-QMUALBRX.js → chunk-4A5PYSPH.js} +6 -5
  7. package/dist/{chunk-QMUALBRX.js.map → chunk-4A5PYSPH.js.map} +1 -1
  8. package/dist/{chunk-CHFHYEZR.js → chunk-5QXN54QK.js} +3 -3
  9. package/dist/{chunk-6T4RTIW6.cjs → chunk-7CTJLBZM.cjs} +5 -5
  10. package/dist/{chunk-6T4RTIW6.cjs.map → chunk-7CTJLBZM.cjs.map} +1 -1
  11. package/dist/{chunk-ZYHN5ABN.js → chunk-7GKYMBQ4.js} +4 -4
  12. package/dist/{chunk-GJ7UAN7G.js → chunk-AELY4TAA.js} +3 -3
  13. package/dist/{chunk-SHNSCUIR.cjs → chunk-AKFA7ZDD.cjs} +28 -28
  14. package/dist/{chunk-SHNSCUIR.cjs.map → chunk-AKFA7ZDD.cjs.map} +1 -1
  15. package/dist/{chunk-PUZQENGY.js → chunk-BYG2NLD7.js} +3 -3
  16. package/dist/{chunk-VW4JDXAT.js → chunk-EXZPVTUM.js} +2086 -1644
  17. package/dist/chunk-EXZPVTUM.js.map +1 -0
  18. package/dist/{chunk-XQXIFRFQ.js → chunk-FTPDLV7B.js} +4 -4
  19. package/dist/{chunk-WCZJQIDW.js → chunk-G6G6R3HQ.js} +3 -3
  20. package/dist/{chunk-4IRROD7M.cjs → chunk-H5JOWXGI.cjs} +30 -30
  21. package/dist/{chunk-4IRROD7M.cjs.map → chunk-H5JOWXGI.cjs.map} +1 -1
  22. package/dist/{chunk-TUG7IT6H.js → chunk-HLEXYTOE.js} +2 -2
  23. package/dist/{chunk-UHLN2S7J.cjs → chunk-HTIOL44C.cjs} +1247 -805
  24. package/dist/chunk-HTIOL44C.cjs.map +1 -0
  25. package/dist/{chunk-777QY5YZ.cjs → chunk-ILMGYP66.cjs} +3 -3
  26. package/dist/{chunk-777QY5YZ.cjs.map → chunk-ILMGYP66.cjs.map} +1 -1
  27. package/dist/{chunk-7GSLZBGB.cjs → chunk-JEEYLBPQ.cjs} +10 -10
  28. package/dist/{chunk-7GSLZBGB.cjs.map → chunk-JEEYLBPQ.cjs.map} +1 -1
  29. package/dist/{chunk-KSZBUUTY.js → chunk-KLWCURLZ.js} +6 -6
  30. package/dist/{chunk-7HROJ2CB.cjs → chunk-KVOA22BW.cjs} +81 -81
  31. package/dist/{chunk-7HROJ2CB.cjs.map → chunk-KVOA22BW.cjs.map} +1 -1
  32. package/dist/{chunk-FVEQYZDH.js → chunk-L5OLMZGC.js} +7 -7
  33. package/dist/{chunk-64MGLDCX.cjs → chunk-LSY7OGTC.cjs} +384 -383
  34. package/dist/chunk-LSY7OGTC.cjs.map +1 -0
  35. package/dist/{chunk-J5CGC6ES.cjs → chunk-MGYWANYK.cjs} +12 -12
  36. package/dist/{chunk-J5CGC6ES.cjs.map → chunk-MGYWANYK.cjs.map} +1 -1
  37. package/dist/{chunk-E3G22CS7.cjs → chunk-OFYXFNVF.cjs} +33 -33
  38. package/dist/{chunk-E3G22CS7.cjs.map → chunk-OFYXFNVF.cjs.map} +1 -1
  39. package/dist/{chunk-DJ5UHDWB.cjs → chunk-OIAI5J35.cjs} +59 -59
  40. package/dist/{chunk-DJ5UHDWB.cjs.map → chunk-OIAI5J35.cjs.map} +1 -1
  41. package/dist/{chunk-DQOQ3KTP.cjs → chunk-QNWQQ4RT.cjs} +78 -73
  42. package/dist/chunk-QNWQQ4RT.cjs.map +1 -0
  43. package/dist/{chunk-5GMTMALA.js → chunk-ROOCATH7.js} +6 -6
  44. package/dist/{chunk-7MCK6KMW.js → chunk-RXFHPJ5O.js} +5 -5
  45. package/dist/{chunk-P7TNZJBZ.cjs → chunk-SO5NWQMG.cjs} +6 -6
  46. package/dist/{chunk-P7TNZJBZ.cjs.map → chunk-SO5NWQMG.cjs.map} +1 -1
  47. package/dist/{chunk-B5JLPHHE.js → chunk-THLCPUEG.js} +2 -2
  48. package/dist/{chunk-WA4O5ILG.js → chunk-TKRGKDNG.js} +5 -5
  49. package/dist/{chunk-KCEACU3F.js → chunk-URJD7BME.js} +3 -3
  50. package/dist/{chunk-OKXB2A2F.cjs → chunk-UU7NOXIK.cjs} +7 -7
  51. package/dist/{chunk-OKXB2A2F.cjs.map → chunk-UU7NOXIK.cjs.map} +1 -1
  52. package/dist/{chunk-CZUO5KVD.cjs → chunk-XWP5E453.cjs} +20 -20
  53. package/dist/{chunk-CZUO5KVD.cjs.map → chunk-XWP5E453.cjs.map} +1 -1
  54. package/dist/{chunk-ERTG6C5E.cjs → chunk-YTVZJNJ7.cjs} +22 -22
  55. package/dist/{chunk-ERTG6C5E.cjs.map → chunk-YTVZJNJ7.cjs.map} +1 -1
  56. package/dist/{chunk-VNNEAPXL.cjs → chunk-YVARUYL5.cjs} +15 -15
  57. package/dist/{chunk-VNNEAPXL.cjs.map → chunk-YVARUYL5.cjs.map} +1 -1
  58. package/dist/components/case-studies/index.cjs +16 -16
  59. package/dist/components/case-studies/index.js +4 -4
  60. package/dist/components/chat/ai-assistant-info.d.ts.map +1 -1
  61. package/dist/components/chat/approval-request-message.d.ts.map +1 -1
  62. package/dist/components/chat/chat-appearance-context.d.ts +9 -0
  63. package/dist/components/chat/chat-appearance-context.d.ts.map +1 -0
  64. package/dist/components/chat/chat-input.d.ts.map +1 -1
  65. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  66. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  67. package/dist/components/chat/chat-nav-sidebar.d.ts +50 -0
  68. package/dist/components/chat/chat-nav-sidebar.d.ts.map +1 -0
  69. package/dist/components/chat/chat-top-navigation.d.ts +29 -0
  70. package/dist/components/chat/chat-top-navigation.d.ts.map +1 -0
  71. package/dist/components/chat/error-message-display.d.ts.map +1 -1
  72. package/dist/components/chat/index.cjs +21 -3
  73. package/dist/components/chat/index.cjs.map +1 -1
  74. package/dist/components/chat/index.d.ts +6 -0
  75. package/dist/components/chat/index.d.ts.map +1 -1
  76. package/dist/components/chat/index.js +20 -2
  77. package/dist/components/chat/msp-organization-card.d.ts +7 -1
  78. package/dist/components/chat/msp-organization-card.d.ts.map +1 -1
  79. package/dist/components/chat/onboarding-carousel.d.ts +29 -0
  80. package/dist/components/chat/onboarding-carousel.d.ts.map +1 -0
  81. package/dist/components/chat/system-event-message.d.ts +14 -0
  82. package/dist/components/chat/system-event-message.d.ts.map +1 -0
  83. package/dist/components/chat/types/chat.types.d.ts +13 -0
  84. package/dist/components/chat/types/chat.types.d.ts.map +1 -1
  85. package/dist/components/chat/types/component.types.d.ts +20 -1
  86. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  87. package/dist/components/contact/index.cjs +5 -5
  88. package/dist/components/contact/index.js +4 -4
  89. package/dist/components/docs/index.cjs +8 -8
  90. package/dist/components/docs/index.js +7 -7
  91. package/dist/components/embeds/index.cjs +5 -5
  92. package/dist/components/embeds/index.js +4 -4
  93. package/dist/components/faq/index.cjs +5 -5
  94. package/dist/components/faq/index.js +4 -4
  95. package/dist/components/features/index.cjs +4 -4
  96. package/dist/components/features/index.js +3 -3
  97. package/dist/components/help-center-pages/index.cjs +91 -91
  98. package/dist/components/help-center-pages/index.js +15 -15
  99. package/dist/components/index.cjs +73 -55
  100. package/dist/components/index.cjs.map +1 -1
  101. package/dist/components/index.js +33 -15
  102. package/dist/components/index.js.map +1 -1
  103. package/dist/components/meeting-scheduler/index.cjs +41 -41
  104. package/dist/components/meeting-scheduler/index.js +3 -3
  105. package/dist/components/navigation/index.cjs +7 -7
  106. package/dist/components/navigation/index.js +6 -6
  107. package/dist/components/onboarding-guides/index.cjs +7 -7
  108. package/dist/components/onboarding-guides/index.js +6 -6
  109. package/dist/components/related-content/index.cjs +3 -3
  110. package/dist/components/related-content/index.js +2 -2
  111. package/dist/components/tickets/index.cjs +8 -8
  112. package/dist/components/tickets/index.js +7 -7
  113. package/dist/components/ui/avatar-stack.d.ts +5 -1
  114. package/dist/components/ui/avatar-stack.d.ts.map +1 -1
  115. package/dist/components/ui/index.cjs +22 -4
  116. package/dist/components/ui/index.cjs.map +1 -1
  117. package/dist/components/ui/index.js +21 -3
  118. package/dist/components/ui/reopen-ticket-request-modal.d.ts +4 -1
  119. package/dist/components/ui/reopen-ticket-request-modal.d.ts.map +1 -1
  120. package/dist/index.cjs +27 -9
  121. package/dist/index.cjs.map +1 -1
  122. package/dist/index.js +25 -7
  123. package/dist/index.js.map +1 -1
  124. package/package.json +1 -1
  125. package/src/components/chat/__tests__/chat-appearance.test.tsx +79 -0
  126. package/src/components/chat/__tests__/onboarding-carousel.test.tsx +56 -0
  127. package/src/components/chat/ai-assistant-info.tsx +7 -1
  128. package/src/components/chat/approval-request-message.tsx +6 -1
  129. package/src/components/chat/chat-appearance-context.tsx +15 -0
  130. package/src/components/chat/chat-input.tsx +26 -1
  131. package/src/components/chat/chat-message-enhanced.tsx +180 -142
  132. package/src/components/chat/chat-message-list.tsx +169 -164
  133. package/src/components/chat/chat-nav-sidebar.tsx +163 -0
  134. package/src/components/chat/chat-top-navigation.tsx +109 -0
  135. package/src/components/chat/error-message-display.tsx +21 -3
  136. package/src/components/chat/index.ts +6 -0
  137. package/src/components/chat/msp-organization-card.tsx +35 -0
  138. package/src/components/chat/onboarding-carousel.tsx +162 -0
  139. package/src/components/chat/system-event-message.tsx +54 -0
  140. package/src/components/chat/types/chat.types.ts +15 -0
  141. package/src/components/chat/types/component.types.ts +20 -0
  142. package/src/components/ui/__tests__/avatar-stack.test.tsx +25 -0
  143. package/src/components/ui/avatar-stack.tsx +15 -5
  144. package/src/components/ui/reopen-ticket-request-modal.tsx +6 -2
  145. package/src/stories/FaeLayoutV2.stories.tsx +150 -0
  146. package/src/stories/FaeOnboardingV2.stories.tsx +68 -0
  147. package/src/stories/FaeThreadV2.stories.tsx +192 -0
  148. package/src/stories/fae-brand-decorator.tsx +28 -0
  149. package/src/styles/ods-colors.css +10 -0
  150. package/src/styles/ods-effects.css +13 -0
  151. package/dist/chunk-64MGLDCX.cjs.map +0 -1
  152. package/dist/chunk-DQOQ3KTP.cjs.map +0 -1
  153. package/dist/chunk-T6KWNJDW.js.map +0 -1
  154. package/dist/chunk-UHLN2S7J.cjs.map +0 -1
  155. package/dist/chunk-VW4JDXAT.js.map +0 -1
  156. /package/dist/{chunk-QFJHEDZV.js.map → chunk-3NY5ILEE.js.map} +0 -0
  157. /package/dist/{chunk-CHFHYEZR.js.map → chunk-5QXN54QK.js.map} +0 -0
  158. /package/dist/{chunk-ZYHN5ABN.js.map → chunk-7GKYMBQ4.js.map} +0 -0
  159. /package/dist/{chunk-GJ7UAN7G.js.map → chunk-AELY4TAA.js.map} +0 -0
  160. /package/dist/{chunk-PUZQENGY.js.map → chunk-BYG2NLD7.js.map} +0 -0
  161. /package/dist/{chunk-XQXIFRFQ.js.map → chunk-FTPDLV7B.js.map} +0 -0
  162. /package/dist/{chunk-WCZJQIDW.js.map → chunk-G6G6R3HQ.js.map} +0 -0
  163. /package/dist/{chunk-TUG7IT6H.js.map → chunk-HLEXYTOE.js.map} +0 -0
  164. /package/dist/{chunk-KSZBUUTY.js.map → chunk-KLWCURLZ.js.map} +0 -0
  165. /package/dist/{chunk-FVEQYZDH.js.map → chunk-L5OLMZGC.js.map} +0 -0
  166. /package/dist/{chunk-5GMTMALA.js.map → chunk-ROOCATH7.js.map} +0 -0
  167. /package/dist/{chunk-7MCK6KMW.js.map → chunk-RXFHPJ5O.js.map} +0 -0
  168. /package/dist/{chunk-B5JLPHHE.js.map → chunk-THLCPUEG.js.map} +0 -0
  169. /package/dist/{chunk-WA4O5ILG.js.map → chunk-TKRGKDNG.js.map} +0 -0
  170. /package/dist/{chunk-KCEACU3F.js.map → chunk-URJD7BME.js.map} +0 -0
@@ -5,13 +5,13 @@ import {
5
5
  import {
6
6
  DeliveryRow,
7
7
  ListEmptyState
8
- } from "./chunk-CHFHYEZR.js";
8
+ } from "./chunk-5QXN54QK.js";
9
9
  import {
10
10
  EmptyState
11
11
  } from "./chunk-Q76YVNCQ.js";
12
12
  import {
13
13
  DetailPageSkeleton
14
- } from "./chunk-KCEACU3F.js";
14
+ } from "./chunk-URJD7BME.js";
15
15
  import {
16
16
  useSelfFetch
17
17
  } from "./chunk-DLRE5Y3G.js";
@@ -30,7 +30,7 @@ import {
30
30
  RichMarkdownRenderer,
31
31
  devSectionAnchorId,
32
32
  resolveContentHref
33
- } from "./chunk-QMUALBRX.js";
33
+ } from "./chunk-4A5PYSPH.js";
34
34
  import {
35
35
  useHumanitySignals,
36
36
  useScrollToHash
@@ -46,7 +46,7 @@ import {
46
46
  isModifierClick,
47
47
  useCaptions,
48
48
  useIsHydrated
49
- } from "./chunk-VW4JDXAT.js";
49
+ } from "./chunk-EXZPVTUM.js";
50
50
  import {
51
51
  STICKY_HEADER_OFFSET_PX
52
52
  } from "./chunk-JFM4KLOS.js";
@@ -72,7 +72,7 @@ import {
72
72
  formatReleaseDate,
73
73
  toStripProfile,
74
74
  useEntityCardLink
75
- } from "./chunk-T6KWNJDW.js";
75
+ } from "./chunk-22RSJ57Z.js";
76
76
  import {
77
77
  next_image_default
78
78
  } from "./chunk-MDKCTSDS.js";
@@ -1373,4 +1373,4 @@ export {
1373
1373
  useLegalDocs,
1374
1374
  LegalDocumentPage
1375
1375
  };
1376
- //# sourceMappingURL=chunk-5GMTMALA.js.map
1376
+ //# sourceMappingURL=chunk-ROOCATH7.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  useOptionalTicketLive
4
- } from "./chunk-WCZJQIDW.js";
4
+ } from "./chunk-G6G6R3HQ.js";
5
5
  import {
6
6
  AppLayoutDrawerContainerContext,
7
7
  AppLayoutDrawerCoordinationContext,
@@ -13,7 +13,7 @@ import {
13
13
  UnreadDot,
14
14
  buildTicketOpenHref,
15
15
  useOptionalNotifications
16
- } from "./chunk-QMUALBRX.js";
16
+ } from "./chunk-4A5PYSPH.js";
17
17
  import {
18
18
  useFocusTrap,
19
19
  useLocalStorage
@@ -22,7 +22,7 @@ import {
22
22
  OVERLAY_BACKDROP_CLASS,
23
23
  Tag,
24
24
  useIsHydrated
25
- } from "./chunk-VW4JDXAT.js";
25
+ } from "./chunk-EXZPVTUM.js";
26
26
  import {
27
27
  useHeaderHeight,
28
28
  useIsomorphicLayoutEffect,
@@ -48,7 +48,7 @@ import {
48
48
  } from "./chunk-YQR4D5DA.js";
49
49
  import {
50
50
  SquareAvatar
51
- } from "./chunk-T6KWNJDW.js";
51
+ } from "./chunk-22RSJ57Z.js";
52
52
  import {
53
53
  OpenFrameLogo
54
54
  } from "./chunk-OTX6XNSA.js";
@@ -1918,4 +1918,4 @@ export {
1918
1918
  MobileBurgerMenu,
1919
1919
  AppLayout
1920
1920
  };
1921
- //# sourceMappingURL=chunk-7MCK6KMW.js.map
1921
+ //# sourceMappingURL=chunk-RXFHPJ5O.js.map
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
2
2
 
3
3
 
4
- var _chunk64MGLDCXcjs = require('./chunk-64MGLDCX.cjs');
4
+ var _chunkLSY7OGTCcjs = require('./chunk-LSY7OGTC.cjs');
5
5
 
6
6
 
7
7
 
@@ -12,7 +12,7 @@ var _chunkP22VEIWQcjs = require('./chunk-P22VEIWQ.cjs');
12
12
  var _chunk4HHBN7STcjs = require('./chunk-4HHBN7ST.cjs');
13
13
 
14
14
 
15
- var _chunkDQOQ3KTPcjs = require('./chunk-DQOQ3KTP.cjs');
15
+ var _chunkQNWQQ4RTcjs = require('./chunk-QNWQQ4RT.cjs');
16
16
 
17
17
 
18
18
  var _chunkF6U2H42Lcjs = require('./chunk-F6U2H42L.cjs');
@@ -27,7 +27,7 @@ function FileDownloadCard({ fileName, mimeType, fileSize, fileUrl }) {
27
27
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "text-ods-text-primary text-h3", children: fileName || "File" }),
28
28
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "mt-2 flex items-center justify-center gap-3 text-ods-text-secondary text-h6", children: [
29
29
  mimeType && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: mimeType }),
30
- typeof fileSize === "number" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkDQOQ3KTPcjs.formatFileSize.call(void 0, fileSize) })
30
+ typeof fileSize === "number" && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { children: _chunkQNWQQ4RTcjs.formatFileSize.call(void 0, fileSize) })
31
31
  ] })
32
32
  ] }),
33
33
  fileUrl && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "accent", href: fileUrl, openInNewTab: true, leftIcon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _lucidereact.Download, { className: "h-4 w-4" }), children: "Download File" })
@@ -46,7 +46,7 @@ function GoogleSheetsViewer({ externalUrl, fileName, height }) {
46
46
  ] });
47
47
  }
48
48
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
49
- _chunk64MGLDCXcjs.EmbedViewerFrame,
49
+ _chunkLSY7OGTCcjs.EmbedViewerFrame,
50
50
  {
51
51
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4HHBN7STcjs.GoogleSheetsIcon, { className: "h-5 w-5 shrink-0" }),
52
52
  title: displayName,
@@ -81,7 +81,7 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
81
81
  ] });
82
82
  }
83
83
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
84
- _chunk64MGLDCXcjs.EmbedViewerFrame,
84
+ _chunkLSY7OGTCcjs.EmbedViewerFrame,
85
85
  {
86
86
  icon: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4HHBN7STcjs.AdobePdfIcon, { className: "h-5 w-5 shrink-0" }),
87
87
  title: displayName,
@@ -124,4 +124,4 @@ function PdfViewer({ src, fileName, onPreview, onDownload, height }) {
124
124
 
125
125
 
126
126
  exports.FileDownloadCard = FileDownloadCard; exports.GoogleSheetsViewer = GoogleSheetsViewer; exports.PdfViewer = PdfViewer;
127
- //# sourceMappingURL=chunk-P7TNZJBZ.cjs.map
127
+ //# sourceMappingURL=chunk-SO5NWQMG.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-P7TNZJBZ.cjs","../src/components/embeds/file-download-card.tsx","../src/components/embeds/google-sheets-viewer.tsx","../src/components/embeds/pdf-viewer.tsx"],"names":["jsxs","jsx","Download"],"mappings":"AAAA,qFAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACnBA,2CAAmC;AAwB3B,+CAAA;AAJD,SAAS,gBAAA,CAAiB,EAAE,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA,EAA0B;AACjG,EAAA,uBACE,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,iDAAA,EACb,QAAA,kBAAA,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,2FAAA,EACb,QAAA,EAAA;AAAA,oBAAA,6BAAA,qBAAC,EAAA,EAAS,SAAA,EAAU,4CAAA,CAA4C,CAAA;AAAA,oBAChE,8BAAA,KAAC,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,6BAAA,IAAC,EAAA,EAAG,SAAA,EAAU,+BAAA,EAAiC,QAAA,EAAA,SAAA,GAAY,OAAA,CAAO,CAAA;AAAA,sBAClE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,6EAAA,EACZ,QAAA,EAAA;AAAA,QAAA,SAAA,mBAAY,6BAAA,MAAC,EAAA,EAAM,QAAA,EAAA,SAAA,CAAS,CAAA;AAAA,QAC5B,OAAO,SAAA,IAAa,SAAA,mBAAY,6BAAA,MAAC,EAAA,EAAM,QAAA,EAAA,8CAAA,QAAuB,EAAA,CAAE;AAAA,MAAA,EAAA,CACnE;AAAA,IAAA,EAAA,CACF,CAAA;AAAA,IACC,QAAA,mBACC,6BAAA,wBAAC,EAAA,EAAO,OAAA,EAAQ,QAAA,EAAS,IAAA,EAAM,OAAA,EAAS,YAAA,EAAY,IAAA,EAAC,QAAA,kBAAU,6BAAA,qBAAC,EAAA,EAAS,SAAA,EAAU,UAAA,CAAU,CAAA,EAAI,QAAA,EAAA,gBAAA,CAEjG;AAAA,EAAA,EAAA,CAEJ,EAAA,CACF,CAAA;AAEJ;ADLA;AACA;AElCA;AAmBM;AAPC,SAAS,kBAAA,CAAmB,EAAE,WAAA,EAAa,QAAA,EAAU,OAAO,CAAA,EAA4B;AAC7F,EAAA,MAAM,YAAA,EAAc,SAAA,GAAY,cAAA;AAIhC,EAAA,GAAA,CAAI,CAAC,WAAA,EAAa;AAChB,IAAA,uBACEA,8BAAAA,KAAC,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,6BAAAA,kCAAC,EAAA,EAAiB,SAAA,EAAU,yCAAA,CAAyC,CAAA;AAAA,sBACrEA,6BAAAA,GAAC,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,kCAAA,CAA+B;AAAA,IAAA,EAAA,CACxE,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,6BAAAA;AAAA,IAAC,kCAAA;AAAA,IAAA;AAAA,MACC,IAAA,kBAAMA,6BAAAA,kCAAC,EAAA,EAAiB,SAAA,EAAU,mBAAA,CAAmB,CAAA;AAAA,MACrD,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,kBACEA,6BAAAA;AAAA,QAAC,wBAAA;AAAA,QAAA;AAAA,UACC,OAAA,EAAQ,SAAA;AAAA,UACR,IAAA,EAAK,cAAA;AAAA,UACL,IAAA,EAAM,yDAAA,WAAqC,CAAA;AAAA,UAC3C,YAAA,EAAY,IAAA;AAAA,UACZ,QAAA,kBAAUA,6BAAAA,kCAAC,EAAA,EAAiB,SAAA,EAAU,UAAA,CAAU,CAAA;AAAA,UAChD,SAAA,kBAAWA,6BAAAA,yBAAC,EAAA,EAAa,SAAA,EAAU,UAAA,CAAU,CAAA;AAAA,UAC7C,SAAA,EAAU,kBAAA;AAAA,UACX,QAAA,EAAA;AAAA,QAAA;AAAA,MAED,CAAA;AAAA,MAEF,GAAA,EAAK,sDAAA,WAAkC,CAAA;AAAA,MACvC;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ;AFqBA;AACA;AGrEA;AAmBM;AANC,SAAS,SAAA,CAAU,EAAE,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,UAAA,EAAY,OAAO,CAAA,EAAmB;AAC1F,EAAA,MAAM,YAAA,EAAc,SAAA,GAAY,cAAA;AAGhC,EAAA,GAAA,CAAI,CAAC,GAAA,EAAK;AACR,IAAA,uBACED,8BAAAA,KAAC,EAAA,EAAI,SAAA,EAAU,6DAAA,EACb,QAAA,EAAA;AAAA,sBAAAC,6BAAAA,8BAAC,EAAA,EAAa,SAAA,EAAU,yCAAA,CAAyC,CAAA;AAAA,sBACjEA,6BAAAA,GAAC,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,QAAA,EAAA,yBAAA,CAAsB;AAAA,IAAA,EAAA,CAC/D,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACEA,6BAAAA;AAAA,IAAC,kCAAA;AAAA,IAAA;AAAA,MACC,IAAA,kBAAMA,6BAAAA,8BAAC,EAAA,EAAa,SAAA,EAAU,mBAAA,CAAmB,CAAA;AAAA,MACjD,KAAA,EAAO,WAAA;AAAA,MACP,OAAA,kBACED,8BAAAA,KAAC,EAAA,EAAI,SAAA,EAAU,0CAAA,EACb,QAAA,EAAA;AAAA,wBAAAC,6BAAAA;AAAA,UAAC,wBAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,cAAA;AAAA,YACL,IAAA,EAAM,UAAA,EAAY,KAAA,EAAA,EAAY,GAAA;AAAA,YAC9B,YAAA,EAAc,CAAC,SAAA;AAAA,YACf,OAAA,EAAS,SAAA;AAAA,YACT,QAAA,kBAAUA,6BAAAA,gBAAC,EAAA,EAAI,SAAA,EAAU,UAAA,CAAU,CAAA;AAAA,YACnC,SAAA,EAAU,wBAAA;AAAA,YACX,QAAA,EAAA;AAAA,UAAA;AAAA,QAED,CAAA;AAAA,wBACAA,6BAAAA;AAAA,UAAC,wBAAA;AAAA,UAAA;AAAA,YACC,OAAA,EAAQ,SAAA;AAAA,YACR,IAAA,EAAK,cAAA;AAAA,YACL,IAAA,EAAM,WAAA,EAAa,KAAA,EAAA,EAAY,GAAA;AAAA,YAC/B,YAAA,EAAc,CAAC,UAAA;AAAA,YACf,OAAA,EAAS,UAAA;AAAA,YACT,QAAA,kBAAUA,6BAAAA,qBAACC,EAAA,EAAS,SAAA,EAAU,UAAA,CAAU,CAAA;AAAA,YACxC,SAAA,EAAU,wBAAA;AAAA,YACX,QAAA,EAAA;AAAA,UAAA;AAAA,QAED;AAAA,MAAA,EAAA,CACF,CAAA;AAAA,MAEF,GAAA;AAAA,MACA;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ;AH0DA;AACA;AACE;AACA;AACA;AACF,4HAAC","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-P7TNZJBZ.cjs","sourcesContent":[null,"import { FileText, Download } from 'lucide-react';\nimport { formatFileSize } from '../../utils';\nimport { Button } from '../ui';\n\nexport interface FileDownloadCardProps {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n fileUrl?: string;\n}\n\n/**\n * Generic downloadable-file card for the `file` document type. Used by\n * `<DocsHubPage>`'s default `documentTypeRenderers.file`. Embedders can\n * override the default by passing their own `file` renderer.\n *\n * When `fileUrl` is missing, the Download button is omitted (the card still\n * renders the filename + type + size so the user knows what they were\n * about to download).\n */\nexport function FileDownloadCard({ fileName, mimeType, fileSize, fileUrl }: FileDownloadCardProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <div className=\"w-full max-w-md space-y-4 rounded-xl border border-ods-border bg-ods-card p-8 text-center\">\n <FileText className=\"mx-auto h-16 w-16 text-ods-text-secondary\" />\n <div>\n <h3 className=\"text-ods-text-primary text-h3\">{fileName || 'File'}</h3>\n <div className=\"mt-2 flex items-center justify-center gap-3 text-ods-text-secondary text-h6\">\n {mimeType && <span>{mimeType}</span>}\n {typeof fileSize === 'number' && <span>{formatFileSize(fileSize)}</span>}\n </div>\n </div>\n {fileUrl && (\n <Button variant=\"accent\" href={fileUrl} openInNewTab leftIcon={<Download className=\"h-4 w-4\" />}>\n Download File\n </Button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { ExternalLink } from 'lucide-react';\nimport { toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl } from '../../utils/embed-url-converters';\nimport { GoogleSheetsIcon } from '../icons-v2-generated';\nimport { Button } from '../ui';\nimport { EmbedViewerFrame } from './embed-viewer-frame';\n\nexport interface GoogleSheetsViewerProps {\n externalUrl: string;\n fileName?: string;\n height?: string;\n}\n\nexport function GoogleSheetsViewer({ externalUrl, fileName, height }: GoogleSheetsViewerProps) {\n const displayName = fileName || 'Google Sheet';\n\n // Historical shape: no URL at all → standalone empty state with NO header\n // (the frame's empty body keeps the header — that's the figma behavior).\n if (!externalUrl) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <GoogleSheetsIcon className=\"mb-4 h-16 w-16 text-ods-text-secondary\" />\n <p className=\"text-ods-text-secondary\">Google Sheet URL not configured</p>\n </div>\n );\n }\n\n return (\n <EmbedViewerFrame\n icon={<GoogleSheetsIcon className=\"h-5 w-5 shrink-0\" />}\n title={displayName}\n actions={\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={toGoogleSheetsOriginalUrl(externalUrl)}\n openInNewTab\n leftIcon={<GoogleSheetsIcon className=\"h-4 w-4\" />}\n rightIcon={<ExternalLink className=\"h-4 w-4\" />}\n className=\"w-full sm:w-auto\"\n >\n Open in Google Sheets\n </Button>\n }\n src={toGoogleSheetsEmbedUrl(externalUrl)}\n height={height}\n />\n );\n}\n","'use client';\n\nimport { Download, Eye } from 'lucide-react';\nimport { AdobePdfIcon } from '../icons-v2-generated';\nimport { Button } from '../ui';\nimport { EmbedViewerFrame } from './embed-viewer-frame';\n\nexport interface PdfViewerProps {\n src: string;\n fileName?: string;\n onPreview?: () => void;\n onDownload?: () => void;\n height?: string;\n}\n\nexport function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfViewerProps) {\n const displayName = fileName || 'PDF Document';\n\n // Historical shape: no src at all → standalone empty state with NO header.\n if (!src) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AdobePdfIcon className=\"mb-4 h-16 w-16 text-ods-text-secondary\" />\n <p className=\"text-ods-text-secondary\">PDF file not available</p>\n </div>\n );\n }\n\n return (\n <EmbedViewerFrame\n icon={<AdobePdfIcon className=\"h-5 w-5 shrink-0\" />}\n title={displayName}\n actions={\n <div className=\"flex w-full items-center gap-2 sm:w-auto\">\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={onPreview ? undefined : src}\n openInNewTab={!onPreview}\n onClick={onPreview}\n leftIcon={<Eye className=\"h-4 w-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Preview\n </Button>\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={onDownload ? undefined : src}\n openInNewTab={!onDownload}\n onClick={onDownload}\n leftIcon={<Download className=\"h-4 w-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Download\n </Button>\n </div>\n }\n src={src}\n height={height}\n />\n );\n}\n"]}
1
+ {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-SO5NWQMG.cjs","../src/components/embeds/file-download-card.tsx","../src/components/embeds/google-sheets-viewer.tsx","../src/components/embeds/pdf-viewer.tsx"],"names":["jsxs","jsx","Download"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-SO5NWQMG.cjs","sourcesContent":[null,"import { FileText, Download } from 'lucide-react';\nimport { formatFileSize } from '../../utils';\nimport { Button } from '../ui';\n\nexport interface FileDownloadCardProps {\n fileName?: string;\n mimeType?: string;\n fileSize?: number;\n fileUrl?: string;\n}\n\n/**\n * Generic downloadable-file card for the `file` document type. Used by\n * `<DocsHubPage>`'s default `documentTypeRenderers.file`. Embedders can\n * override the default by passing their own `file` renderer.\n *\n * When `fileUrl` is missing, the Download button is omitted (the card still\n * renders the filename + type + size so the user knows what they were\n * about to download).\n */\nexport function FileDownloadCard({ fileName, mimeType, fileSize, fileUrl }: FileDownloadCardProps) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16\">\n <div className=\"w-full max-w-md space-y-4 rounded-xl border border-ods-border bg-ods-card p-8 text-center\">\n <FileText className=\"mx-auto h-16 w-16 text-ods-text-secondary\" />\n <div>\n <h3 className=\"text-ods-text-primary text-h3\">{fileName || 'File'}</h3>\n <div className=\"mt-2 flex items-center justify-center gap-3 text-ods-text-secondary text-h6\">\n {mimeType && <span>{mimeType}</span>}\n {typeof fileSize === 'number' && <span>{formatFileSize(fileSize)}</span>}\n </div>\n </div>\n {fileUrl && (\n <Button variant=\"accent\" href={fileUrl} openInNewTab leftIcon={<Download className=\"h-4 w-4\" />}>\n Download File\n </Button>\n )}\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { ExternalLink } from 'lucide-react';\nimport { toGoogleSheetsEmbedUrl, toGoogleSheetsOriginalUrl } from '../../utils/embed-url-converters';\nimport { GoogleSheetsIcon } from '../icons-v2-generated';\nimport { Button } from '../ui';\nimport { EmbedViewerFrame } from './embed-viewer-frame';\n\nexport interface GoogleSheetsViewerProps {\n externalUrl: string;\n fileName?: string;\n height?: string;\n}\n\nexport function GoogleSheetsViewer({ externalUrl, fileName, height }: GoogleSheetsViewerProps) {\n const displayName = fileName || 'Google Sheet';\n\n // Historical shape: no URL at all → standalone empty state with NO header\n // (the frame's empty body keeps the header — that's the figma behavior).\n if (!externalUrl) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <GoogleSheetsIcon className=\"mb-4 h-16 w-16 text-ods-text-secondary\" />\n <p className=\"text-ods-text-secondary\">Google Sheet URL not configured</p>\n </div>\n );\n }\n\n return (\n <EmbedViewerFrame\n icon={<GoogleSheetsIcon className=\"h-5 w-5 shrink-0\" />}\n title={displayName}\n actions={\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={toGoogleSheetsOriginalUrl(externalUrl)}\n openInNewTab\n leftIcon={<GoogleSheetsIcon className=\"h-4 w-4\" />}\n rightIcon={<ExternalLink className=\"h-4 w-4\" />}\n className=\"w-full sm:w-auto\"\n >\n Open in Google Sheets\n </Button>\n }\n src={toGoogleSheetsEmbedUrl(externalUrl)}\n height={height}\n />\n );\n}\n","'use client';\n\nimport { Download, Eye } from 'lucide-react';\nimport { AdobePdfIcon } from '../icons-v2-generated';\nimport { Button } from '../ui';\nimport { EmbedViewerFrame } from './embed-viewer-frame';\n\nexport interface PdfViewerProps {\n src: string;\n fileName?: string;\n onPreview?: () => void;\n onDownload?: () => void;\n height?: string;\n}\n\nexport function PdfViewer({ src, fileName, onPreview, onDownload, height }: PdfViewerProps) {\n const displayName = fileName || 'PDF Document';\n\n // Historical shape: no src at all → standalone empty state with NO header.\n if (!src) {\n return (\n <div className=\"flex flex-col items-center justify-center py-16 text-center\">\n <AdobePdfIcon className=\"mb-4 h-16 w-16 text-ods-text-secondary\" />\n <p className=\"text-ods-text-secondary\">PDF file not available</p>\n </div>\n );\n }\n\n return (\n <EmbedViewerFrame\n icon={<AdobePdfIcon className=\"h-5 w-5 shrink-0\" />}\n title={displayName}\n actions={\n <div className=\"flex w-full items-center gap-2 sm:w-auto\">\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={onPreview ? undefined : src}\n openInNewTab={!onPreview}\n onClick={onPreview}\n leftIcon={<Eye className=\"h-4 w-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Preview\n </Button>\n <Button\n variant=\"outline\"\n size=\"small-legacy\"\n href={onDownload ? undefined : src}\n openInNewTab={!onDownload}\n onClick={onDownload}\n leftIcon={<Download className=\"h-4 w-4\" />}\n className=\"flex-1 sm:flex-initial\"\n >\n Download\n </Button>\n </div>\n }\n src={src}\n height={height}\n />\n );\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  DEFAULT_FOLDER_INDEX_FILE
4
- } from "./chunk-QMUALBRX.js";
4
+ } from "./chunk-4A5PYSPH.js";
5
5
  import {
6
6
  scrollElementIntoView
7
7
  } from "./chunk-JFM4KLOS.js";
@@ -358,4 +358,4 @@ export {
358
358
  MultiLevelNavigation,
359
359
  MobileNavigationDropdown
360
360
  };
361
- //# sourceMappingURL=chunk-B5JLPHHE.js.map
361
+ //# sourceMappingURL=chunk-THLCPUEG.js.map
@@ -3,16 +3,16 @@ import {
3
3
  FileDownloadCard,
4
4
  GoogleSheetsViewer,
5
5
  PdfViewer
6
- } from "./chunk-PUZQENGY.js";
6
+ } from "./chunk-BYG2NLD7.js";
7
7
  import {
8
8
  MobileNavigationDropdown,
9
9
  MultiLevelNavigation,
10
10
  StickySectionNav
11
- } from "./chunk-B5JLPHHE.js";
11
+ } from "./chunk-THLCPUEG.js";
12
12
  import {
13
13
  DocSearchBar,
14
14
  useDocSearch
15
- } from "./chunk-XQXIFRFQ.js";
15
+ } from "./chunk-FTPDLV7B.js";
16
16
  import {
17
17
  CategorySidebarSkeleton,
18
18
  DEFAULT_FOLDER_INDEX_FILE,
@@ -22,7 +22,7 @@ import {
22
22
  findDocNodeByPath,
23
23
  getDocAncestorNodeIds,
24
24
  stripFolderIndexFromPath
25
- } from "./chunk-QMUALBRX.js";
25
+ } from "./chunk-4A5PYSPH.js";
26
26
  import {
27
27
  contentFetch
28
28
  } from "./chunk-UAKWSR3U.js";
@@ -1098,4 +1098,4 @@ export {
1098
1098
  EmbedSkeleton,
1099
1099
  DocsHubPage
1100
1100
  };
1101
- //# sourceMappingURL=chunk-WA4O5ILG.js.map
1101
+ //# sourceMappingURL=chunk-TKRGKDNG.js.map
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import {
3
3
  PageLayout
4
- } from "./chunk-QMUALBRX.js";
4
+ } from "./chunk-4A5PYSPH.js";
5
5
  import {
6
6
  formatBioText,
7
7
  formatDateWithTimezone,
8
8
  getProxiedImageUrl
9
- } from "./chunk-T6KWNJDW.js";
9
+ } from "./chunk-22RSJ57Z.js";
10
10
  import {
11
11
  next_image_default
12
12
  } from "./chunk-MDKCTSDS.js";
@@ -137,4 +137,4 @@ export {
137
137
  DetailPageSkeleton,
138
138
  ArticleAuthorByline
139
139
  };
140
- //# sourceMappingURL=chunk-KCEACU3F.js.map
140
+ //# sourceMappingURL=chunk-URJD7BME.js.map
@@ -1,12 +1,12 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }"use client";
2
2
 
3
3
 
4
- var _chunk64MGLDCXcjs = require('./chunk-64MGLDCX.cjs');
4
+ var _chunkLSY7OGTCcjs = require('./chunk-LSY7OGTC.cjs');
5
5
 
6
6
 
7
7
 
8
8
 
9
- var _chunkDQOQ3KTPcjs = require('./chunk-DQOQ3KTP.cjs');
9
+ var _chunkQNWQQ4RTcjs = require('./chunk-QNWQQ4RT.cjs');
10
10
 
11
11
 
12
12
  var _chunkWLSFBRT5cjs = require('./chunk-WLSFBRT5.cjs');
@@ -56,14 +56,14 @@ function DetailPageSkeleton({
56
56
  ] }, section))
57
57
  ] });
58
58
  if (bare) return content;
59
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk64MGLDCXcjs.PageLayout, { showHeader: false, className: "mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10", children: content });
59
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLSY7OGTCcjs.PageLayout, { showHeader: false, className: "mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10", children: content });
60
60
  }
61
61
 
62
62
  // src/components/shared/article-author-byline.tsx
63
63
  var _lucidereact = require('lucide-react');
64
64
 
65
65
  function formatDate(value) {
66
- return _chunkDQOQ3KTPcjs.formatDateWithTimezone.call(void 0, value, null, "long");
66
+ return _chunkQNWQQ4RTcjs.formatDateWithTimezone.call(void 0, value, null, "long");
67
67
  }
68
68
  function ArticleAuthorByline({
69
69
  author,
@@ -79,7 +79,7 @@ function ArticleAuthorByline({
79
79
  }) {
80
80
  const runtime = _chunkU2YLMFJKcjs.useChatRuntime.call(void 0, );
81
81
  if (!author) return null;
82
- const proxiedAvatar = avatar ? proxyImageUrl ? proxyImageUrl(avatar) : _nullishCoalesce(_chunkDQOQ3KTPcjs.getProxiedImageUrl.call(void 0, avatar, {
82
+ const proxiedAvatar = avatar ? proxyImageUrl ? proxyImageUrl(avatar) : _nullishCoalesce(_chunkQNWQQ4RTcjs.getProxiedImageUrl.call(void 0, avatar, {
83
83
  proxyPrefix: _optionalChain([runtime, 'optionalAccess', _2 => _2.endpoints, 'access', _3 => _3.imageProxyUrlPrefix]),
84
84
  skipDomains: _optionalChain([runtime, 'optionalAccess', _4 => _4.endpoints, 'access', _5 => _5.imageProxySkipDomains]),
85
85
  directHttps: true
@@ -87,7 +87,7 @@ function ArticleAuthorByline({
87
87
  const avatarSizeClass = size === "lg" ? "w-16 h-16" : "w-14 h-14";
88
88
  const avatarIconClass = size === "lg" ? "w-8 h-8" : "w-7 h-7";
89
89
  const avatarDim = size === "lg" ? 64 : 56;
90
- const formattedBio = _chunkDQOQ3KTPcjs.formatBioText.call(void 0, _nullishCoalesce(bio, () => ( null)));
90
+ const formattedBio = _chunkQNWQQ4RTcjs.formatBioText.call(void 0, _nullishCoalesce(bio, () => ( null)));
91
91
  const dateLabel = publishedAt ? formatDate(publishedAt) : "";
92
92
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
93
93
  "div",
@@ -137,4 +137,4 @@ function ArticleAuthorByline({
137
137
 
138
138
 
139
139
  exports.DetailPageSkeleton = DetailPageSkeleton; exports.ArticleAuthorByline = ArticleAuthorByline;
140
- //# sourceMappingURL=chunk-OKXB2A2F.cjs.map
140
+ //# sourceMappingURL=chunk-UU7NOXIK.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-OKXB2A2F.cjs","../src/components/shared/detail-page-skeleton.tsx","../src/components/shared/article-author-byline.tsx"],"names":["jsxs","jsx"],"mappings":"AAAA,6rBAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACCQ,+CAAA;AATD,SAAS,kBAAA,CAAmB;AAAA,EACjC,gBAAA,EAAkB,CAAA;AAAA,EAClB,iBAAA,EAAmB,IAAA;AAAA,EACnB,KAAA,EAAO;AACT,EAAA,EAA6B,CAAC,CAAA,EAAG;AAC/B,EAAA,MAAM,QAAA,kBACJ,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,uCAAA,EAEb,QAAA,EAAA;AAAA,oBAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,4BAAA,EACb,QAAA,kBAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,oDAAA,CAAoD,EAAA,CACrE,CAAA;AAAA,oBAGA,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,6BAAA,EACb,QAAA,EAAA;AAAA,sBAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,+BAAA,CAA+B,CAAA;AAAA,sBAC9C,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,+BAAA,CAA+B,CAAA;AAAA,sBAC9C,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,+BAAA,CAA+B;AAAA,IAAA,EAAA,CAChD,CAAA;AAAA,oBAGA,6BAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,CAAA,8BAAA,EAAiC,eAAe,CAAA,2DAAA,CAAA;AAAA,QAE1D,QAAA,EAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,gBAAgB,CAAC,CAAA,CAAE,GAAA,CAAI,CAAC,CAAA,EAAG,CAAA,EAAA,mBAC/C,8BAAA,KAAC,EAAA,EAAY,SAAA,EAAU,sFAAA,EACrB,QAAA,EAAA;AAAA,0BAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,sCAAA,CAAsC,CAAA;AAAA,0BACrD,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,iCAAA,CAAiC;AAAA,QAAA,EAAA,CAAA,EAFxC,CAGV,CACD;AAAA,MAAA;AAAA,IACH,CAAA;AAAA,IAGC,iBAAA,mBACC,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,mCAAA,EACZ,QAAA,EAAA,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,EAAA,mBACnB,6BAAA,KAAC,EAAA,EAAY,SAAA,EAAU,+EAAA,CAAA,EAAb,CAA4F,CACvG,EAAA,CACH,CAAA;AAAA,IAID,CAAC,iBAAA,mBAAoB,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,mDAAA,CAAmD,CAAA;AAAA,IAGvF,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,CAAE,GAAA,CAAI,CAAA,OAAA,EAAA,mBACb,8BAAA,KAAC,EAAA,EAAkB,SAAA,EAAU,WAAA,EAC3B,QAAA,EAAA;AAAA,sBAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,gCAAA,CAAgC,CAAA;AAAA,sBAC/C,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,wBAAA,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,iCAAA,CAAiC,CAAA;AAAA,wBAChD,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,iCAAA,CAAiC,CAAA;AAAA,wBAChD,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,gCAAA,CAAgC;AAAA,MAAA,EAAA,CACjD;AAAA,IAAA,EAAA,CAAA,EANQ,OAOV,CACD;AAAA,EAAA,EAAA,CACH,CAAA;AAEF,EAAA,GAAA,CAAI,IAAA,EAAM,OAAO,OAAA;AACjB,EAAA,uBACE,6BAAA,4BAAC,EAAA,EAAW,UAAA,EAAY,KAAA,EAAO,SAAA,EAAU,8DAAA,EACtC,QAAA,EAAA,QAAA,CACH,CAAA;AAEJ;ADhBA;AACA;AEnCA,2CAA+B;AA8FrB;AAtDV,SAAS,UAAA,CAAW,KAAA,EAA8B;AAGhD,EAAA,OAAO,sDAAA,KAAuB,EAAO,IAAA,EAAM,MAAM,CAAA;AACnD;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,MAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA,EAAO,IAAA;AAAA,EACP,aAAA;AAAA,EACA;AACF,CAAA,EAA6B;AAI3B,EAAA,MAAM,QAAA,EAAU,8CAAA,CAAe;AAC/B,EAAA,GAAA,CAAI,CAAC,MAAA,EAAQ,OAAO,IAAA;AAEpB,EAAA,MAAM,cAAA,EAAgB,OAAA,EAClB,cAAA,EACE,aAAA,CAAc,MAAM,EAAA,mBACnB,kDAAA,MAAmB,EAAQ;AAAA,IAC1B,WAAA,kBAAa,OAAA,6BAAS,SAAA,qBAAU,qBAAA;AAAA,IAChC,WAAA,kBAAa,OAAA,6BAAS,SAAA,qBAAU,uBAAA;AAAA,IAChC,WAAA,EAAa;AAAA,EACf,CAAC,CAAA,UAAK,SAAA,EACR,EAAA;AAKJ,EAAA,MAAM,gBAAA,EAAkB,KAAA,IAAS,KAAA,EAAO,YAAA,EAAc,WAAA;AACtD,EAAA,MAAM,gBAAA,EAAkB,KAAA,IAAS,KAAA,EAAO,UAAA,EAAY,SAAA;AACpD,EAAA,MAAM,UAAA,EAAY,KAAA,IAAS,KAAA,EAAO,GAAA,EAAK,EAAA;AACvC,EAAA,MAAM,aAAA,EAAe,6CAAA,iBAAc,GAAA,UAAO,MAAI,CAAA;AAC9C,EAAA,MAAM,UAAA,EAAY,YAAA,EAAc,UAAA,CAAW,WAAW,EAAA,EAAI,EAAA;AAE1D,EAAA,uBACEA,8BAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,kCAAA;AAAA,QACT,qDAAA;AAAA,QACA,6CAAA;AAAA,QACA;AAAA,MACF,CAAA;AAAA,MAGA,QAAA,EAAA;AAAA,wBAAAC,6BAAAA,KAAC,EAAA,EAAI,SAAA,EAAU,eAAA,EACZ,QAAA,EAAA,OAAA,kBACCA,6BAAAA;AAAA,UAAC,oCAAA;AAAA,UAAA;AAAA,YACC,GAAA,EAAK,cAAA,GAAiB,MAAA;AAAA,YACtB,GAAA,EAAK,MAAA;AAAA,YACL,KAAA,EAAO,SAAA;AAAA,YACP,MAAA,EAAQ,SAAA;AAAA,YACR,SAAA,EAAW,kCAAA,sDAAG,EAAwD,eAAe;AAAA,UAAA;AAAA,QACvF,EAAA,kBAEAA,6BAAAA;AAAA,UAAC,KAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,kCAAA;AAAA,cACT,oFAAA;AAAA,cACA;AAAA,YACF,CAAA;AAAA,YAEA,QAAA,kBAAAA,6BAAAA,iBAAC,EAAA,EAAK,SAAA,EAAW,kCAAA,yBAAG,EAA2B,eAAe,EAAA,CAAG;AAAA,UAAA;AAAA,QACnE,EAAA,CAEJ,CAAA;AAAA,wBAGAD,8BAAAA,KAAC,EAAA,EAAI,SAAA,EAAU,gBAAA,EACb,QAAA,EAAA;AAAA,0BAAAA,8BAAAA,KAAC,EAAA,EAAI,SAAA,EAAU,+CAAA,EACb,QAAA,EAAA;AAAA,4BAAAC,6BAAAA,IAAC,EAAA,EAAG,SAAA,EAAU,+BAAA,EACX,QAAA,EAAA,KAAA,kBACCA,6BAAAA,mCAAC,EAAA,EAAK,IAAA,EAAY,SAAA,EAAU,yCAAA,EACzB,QAAA,EAAA,OAAA,CACH,EAAA,EAEA,OAAA,CAEJ,CAAA;AAAA,YACC,UAAA,mBACCD,8BAAAA,MAAC,EAAA,EAAK,SAAA,EAAU,+EAAA,EACd,QAAA,EAAA;AAAA,8BAAAC,6BAAAA,qBAAC,EAAA,EAAS,SAAA,EAAU,UAAA,CAAU,CAAA;AAAA,cAC7B;AAAA,YAAA,EAAA,CACH;AAAA,UAAA,EAAA,CAEJ,CAAA;AAAA,UACC,SAAA,mBAAYA,6BAAAA,GAAC,EAAA,EAAE,SAAA,EAAU,uDAAA,EAAyD,QAAA,EAAA,SAAA,CAAS,CAAA;AAAA,UAC3F,aAAA,kBACCA,6BAAAA,GAAC,EAAA,EAAE,SAAA,EAAU,qEAAA,EAAuE,QAAA,EAAA,aAAA,CAAa,EAAA,EAC/F,YAAA,kBACFA,6BAAAA,GAAC,EAAA,EAAE,SAAA,EAAU,4DAAA,EAA8D,QAAA,EAAA,YAAA,CAAY,EAAA,EACrF;AAAA,QAAA,EAAA,CACN;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,CAAA;AAEJ;AFjCA;AACA;AACE;AACA;AACF,mGAAC","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-OKXB2A2F.cjs","sourcesContent":[null,"'use client';\n\nimport { PageLayout } from '../layout/page-layout';\n\nexport interface DetailPageSkeletonProps {\n metadataColumns?: number; // Number of metadata grid columns (default 4)\n showImageGallery?: boolean; // Show horizontal image gallery (default true)\n /** Render only the skeleton blocks, WITHOUT the self-contained page wrapper\n * — the caller supplies its own (e.g. `<PageShell>`) so the loading state\n * matches the loaded page's width, padding, and min-height. Default false\n * (self-contained `<PageLayout>` at the hub article width). */\n bare?: boolean;\n}\n\nexport function DetailPageSkeleton({\n metadataColumns = 4,\n showImageGallery = true,\n bare = false,\n}: DetailPageSkeletonProps = {}) {\n const content = (\n <div className=\"animate-pulse space-y-6 md:space-y-10\">\n {/* Title Block */}\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"h-16 w-full max-w-3xl rounded bg-ods-card md:h-20\"></div>\n </div>\n\n {/* Category Tags Skeleton */}\n <div className=\"flex w-full flex-wrap gap-2\">\n <div className=\"h-8 w-32 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-28 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-36 rounded bg-ods-card\"></div>\n </div>\n\n {/* Metadata Grid Skeleton */}\n <div\n className={`grid grid-cols-1 md:grid-cols-${metadataColumns} w-full overflow-hidden rounded-md border border-ods-border`}\n >\n {Array.from({ length: metadataColumns }).map((_, i) => (\n <div key={i} className=\"border-b border-ods-border bg-ods-card p-4 last:border-r-0 md:border-b-0 md:border-r\">\n <div className=\"mb-2 h-6 w-24 rounded bg-ods-border\"></div>\n <div className=\"h-5 w-20 rounded bg-ods-border\"></div>\n </div>\n ))}\n </div>\n\n {/* Image Gallery Skeleton */}\n {showImageGallery && (\n <div className=\"flex w-full gap-6 overflow-x-auto\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card\"></div>\n ))}\n </div>\n )}\n\n {/* Featured Image Skeleton (for case studies) */}\n {!showImageGallery && <div className=\"aspect-[2560/1366] w-full rounded-md bg-ods-card\"></div>}\n\n {/* Content Sections Skeleton */}\n {[1, 2, 3].map(section => (\n <div key={section} className=\"space-y-6\">\n <div className=\"h-16 w-64 rounded bg-ods-card\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-4/5 rounded bg-ods-card\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n if (bare) return content;\n return (\n <PageLayout showHeader={false} className=\"mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10\">\n {content}\n </PageLayout>\n );\n}\n","'use client';\n\n/**\n * Shared \"author byline\" card used by article-shaped detail pages\n * (blog post, product release, onboarding guide, investor update).\n *\n * MOVED from the hub so any consuming app can embed it; hub call sites\n * import it directly and pass their platform-aware copy explicitly\n * (`fallbackBio={defaultAuthorFallbackBio()}` from the hub's app-config).\n *\n * Embed-readiness contract:\n * - `Link` / `Image` render through the embed-shims (plain `<a>` / `<img>`\n * in non-Next hosts; the real Next primitives once the host registers\n * them at app init).\n * - The avatar is proxied through the OPTIONAL ambient `ChatRuntime`\n * (`endpoints.imageProxyUrlPrefix`, same config `useProxiedImageUrl`\n * reads) — when no runtime is mounted the raw URL renders as-is, so the\n * component never throws outside a provider. Hosts can also inject\n * `proxyImageUrl` to bypass the runtime entirely.\n * - `fallbackBio` is a PLAIN prop (no app-config import): the lib has no\n * platform awareness; pass copy or leave it absent to render nothing.\n *\n * Render order: avatar → name + job title + date → bio (when present).\n * Returns null when `author` is empty (no card rendered).\n */\n\nimport { Calendar, User } from 'lucide-react';\nimport { useChatRuntime } from '../../contexts/chat-runtime-context';\nimport Image from '../../embed-shims/next-image';\nimport Link from '../../embed-shims/next-link';\nimport { cn } from '../../utils/cn';\nimport { formatBioText, formatDateWithTimezone } from '../../utils/format';\nimport { getProxiedImageUrl } from '../../utils/image-proxy';\n\nexport interface ArticleAuthorBylineProps {\n /** Author display name. Required — block is hidden when null/empty. */\n author: string | null;\n /** Avatar URL. Falls back to a placeholder when null. */\n avatar?: string | null;\n /** Optional bio paragraph rendered below the name. */\n bio?: string | null;\n /** Optional job title rendered immediately under the name. */\n jobTitle?: string | null;\n /** Optional published date (ISO string or Date). Rendered next to the name. */\n publishedAt?: string | Date | null;\n /** Optional link target for the author name (e.g. the author page). */\n href?: string | null;\n /**\n * Fallback paragraph when `bio` is empty. Plain copy — the lib has no\n * platform/config awareness, so hosts that want a branded default\n * (\"Contributing author on the {platform} platform\") pass it explicitly\n * (the hub wrapper derives it from `getAppConfig()`). Absent/null ⇒\n * nothing renders below the name when `bio` is empty.\n */\n fallbackBio?: string | null;\n /** Avatar size variant. `md` = 56px (default), `lg` = 64px. */\n size?: 'md' | 'lg';\n /**\n * Host-injected avatar-URL mapper. Wins over the ambient-runtime proxy\n * resolution. Use when the host proxies images outside the `ChatRuntime`\n * config (e.g. a bespoke CDN rewrite).\n */\n proxyImageUrl?: (url: string) => string;\n className?: string;\n}\n\nfunction formatDate(value: string | Date): string {\n // A published date is a content date: UTC-pinned through the one renderer, so\n // the server and every client agree on the day (React #418).\n return formatDateWithTimezone(value, null, 'long');\n}\n\nexport function ArticleAuthorByline({\n author,\n avatar,\n bio,\n jobTitle,\n publishedAt,\n href,\n fallbackBio,\n size = 'md',\n proxyImageUrl,\n className,\n}: ArticleAuthorBylineProps) {\n // Optional runtime — `useChatRuntime` returns null outside a provider, so\n // the byline works in bare embeds (raw avatar URL) and proxies whenever the\n // host mounted a runtime with `imageProxyUrlPrefix` (the hub always does).\n const runtime = useChatRuntime();\n if (!author) return null;\n\n const proxiedAvatar = avatar\n ? proxyImageUrl\n ? proxyImageUrl(avatar)\n : (getProxiedImageUrl(avatar, {\n proxyPrefix: runtime?.endpoints.imageProxyUrlPrefix,\n skipDomains: runtime?.endpoints.imageProxySkipDomains,\n directHttps: true,\n }) ?? avatar)\n : '';\n\n // Class-driven sizing (md = 56px, lg = 64px). The numeric pair feeds only\n // the Image element's intrinsic width/height attributes (required by the\n // Next image shim) — layout comes from the classes.\n const avatarSizeClass = size === 'lg' ? 'w-16 h-16' : 'w-14 h-14';\n const avatarIconClass = size === 'lg' ? 'w-8 h-8' : 'w-7 h-7';\n const avatarDim = size === 'lg' ? 64 : 56;\n const formattedBio = formatBioText(bio ?? null);\n const dateLabel = publishedAt ? formatDate(publishedAt) : '';\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-ods-border bg-ods-card p-6',\n 'flex flex-col items-start gap-4 md:flex-row',\n className,\n )}\n >\n {/* Avatar */}\n <div className=\"flex-shrink-0\">\n {avatar ? (\n <Image\n src={proxiedAvatar || avatar}\n alt={author}\n width={avatarDim}\n height={avatarDim}\n className={cn('rounded-full border-2 border-ods-border object-cover', avatarSizeClass)}\n />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center rounded-full border-2 border-ods-border bg-ods-bg',\n avatarSizeClass,\n )}\n >\n <User className={cn('text-ods-text-secondary', avatarIconClass)} />\n </div>\n )}\n </div>\n\n {/* Name + meta + bio */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1\">\n <h3 className=\"text-ods-text-primary text-h5\">\n {href ? (\n <Link href={href} className=\"transition-colors hover:text-ods-accent\">\n {author}\n </Link>\n ) : (\n author\n )}\n </h3>\n {dateLabel && (\n <span className=\"text-body-sm inline-flex items-center gap-1 font-body text-ods-text-secondary\">\n <Calendar className=\"h-3 w-3\" />\n {dateLabel}\n </span>\n )}\n </div>\n {jobTitle && <p className=\"text-body-sm mt-0.5 font-body text-ods-text-secondary\">{jobTitle}</p>}\n {formattedBio ? (\n <p className=\"text-body-md mt-2 font-body leading-relaxed text-ods-text-secondary\">{formattedBio}</p>\n ) : fallbackBio ? (\n <p className=\"text-body-md mt-2 font-body italic text-ods-text-secondary\">{fallbackBio}</p>\n ) : null}\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-UU7NOXIK.cjs","../src/components/shared/detail-page-skeleton.tsx","../src/components/shared/article-author-byline.tsx"],"names":["jsxs","jsx"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-UU7NOXIK.cjs","sourcesContent":[null,"'use client';\n\nimport { PageLayout } from '../layout/page-layout';\n\nexport interface DetailPageSkeletonProps {\n metadataColumns?: number; // Number of metadata grid columns (default 4)\n showImageGallery?: boolean; // Show horizontal image gallery (default true)\n /** Render only the skeleton blocks, WITHOUT the self-contained page wrapper\n * — the caller supplies its own (e.g. `<PageShell>`) so the loading state\n * matches the loaded page's width, padding, and min-height. Default false\n * (self-contained `<PageLayout>` at the hub article width). */\n bare?: boolean;\n}\n\nexport function DetailPageSkeleton({\n metadataColumns = 4,\n showImageGallery = true,\n bare = false,\n}: DetailPageSkeletonProps = {}) {\n const content = (\n <div className=\"animate-pulse space-y-6 md:space-y-10\">\n {/* Title Block */}\n <div className=\"flex w-full flex-col gap-6\">\n <div className=\"h-16 w-full max-w-3xl rounded bg-ods-card md:h-20\"></div>\n </div>\n\n {/* Category Tags Skeleton */}\n <div className=\"flex w-full flex-wrap gap-2\">\n <div className=\"h-8 w-32 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-28 rounded bg-ods-card\"></div>\n <div className=\"h-8 w-36 rounded bg-ods-card\"></div>\n </div>\n\n {/* Metadata Grid Skeleton */}\n <div\n className={`grid grid-cols-1 md:grid-cols-${metadataColumns} w-full overflow-hidden rounded-md border border-ods-border`}\n >\n {Array.from({ length: metadataColumns }).map((_, i) => (\n <div key={i} className=\"border-b border-ods-border bg-ods-card p-4 last:border-r-0 md:border-b-0 md:border-r\">\n <div className=\"mb-2 h-6 w-24 rounded bg-ods-border\"></div>\n <div className=\"h-5 w-20 rounded bg-ods-border\"></div>\n </div>\n ))}\n </div>\n\n {/* Image Gallery Skeleton */}\n {showImageGallery && (\n <div className=\"flex w-full gap-6 overflow-x-auto\">\n {[1, 2, 3, 4, 5].map(i => (\n <div key={i} className=\"h-[200px] w-[240px] shrink-0 rounded-md border border-ods-border bg-ods-card\"></div>\n ))}\n </div>\n )}\n\n {/* Featured Image Skeleton (for case studies) */}\n {!showImageGallery && <div className=\"aspect-[2560/1366] w-full rounded-md bg-ods-card\"></div>}\n\n {/* Content Sections Skeleton */}\n {[1, 2, 3].map(section => (\n <div key={section} className=\"space-y-6\">\n <div className=\"h-16 w-64 rounded bg-ods-card\"></div>\n <div className=\"space-y-3\">\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-full rounded bg-ods-card\"></div>\n <div className=\"h-6 w-4/5 rounded bg-ods-card\"></div>\n </div>\n </div>\n ))}\n </div>\n );\n if (bare) return content;\n return (\n <PageLayout showHeader={false} className=\"mx-auto max-w-[1280px] bg-ods-bg px-6 py-6 md:px-20 md:py-10\">\n {content}\n </PageLayout>\n );\n}\n","'use client';\n\n/**\n * Shared \"author byline\" card used by article-shaped detail pages\n * (blog post, product release, onboarding guide, investor update).\n *\n * MOVED from the hub so any consuming app can embed it; hub call sites\n * import it directly and pass their platform-aware copy explicitly\n * (`fallbackBio={defaultAuthorFallbackBio()}` from the hub's app-config).\n *\n * Embed-readiness contract:\n * - `Link` / `Image` render through the embed-shims (plain `<a>` / `<img>`\n * in non-Next hosts; the real Next primitives once the host registers\n * them at app init).\n * - The avatar is proxied through the OPTIONAL ambient `ChatRuntime`\n * (`endpoints.imageProxyUrlPrefix`, same config `useProxiedImageUrl`\n * reads) — when no runtime is mounted the raw URL renders as-is, so the\n * component never throws outside a provider. Hosts can also inject\n * `proxyImageUrl` to bypass the runtime entirely.\n * - `fallbackBio` is a PLAIN prop (no app-config import): the lib has no\n * platform awareness; pass copy or leave it absent to render nothing.\n *\n * Render order: avatar → name + job title + date → bio (when present).\n * Returns null when `author` is empty (no card rendered).\n */\n\nimport { Calendar, User } from 'lucide-react';\nimport { useChatRuntime } from '../../contexts/chat-runtime-context';\nimport Image from '../../embed-shims/next-image';\nimport Link from '../../embed-shims/next-link';\nimport { cn } from '../../utils/cn';\nimport { formatBioText, formatDateWithTimezone } from '../../utils/format';\nimport { getProxiedImageUrl } from '../../utils/image-proxy';\n\nexport interface ArticleAuthorBylineProps {\n /** Author display name. Required — block is hidden when null/empty. */\n author: string | null;\n /** Avatar URL. Falls back to a placeholder when null. */\n avatar?: string | null;\n /** Optional bio paragraph rendered below the name. */\n bio?: string | null;\n /** Optional job title rendered immediately under the name. */\n jobTitle?: string | null;\n /** Optional published date (ISO string or Date). Rendered next to the name. */\n publishedAt?: string | Date | null;\n /** Optional link target for the author name (e.g. the author page). */\n href?: string | null;\n /**\n * Fallback paragraph when `bio` is empty. Plain copy — the lib has no\n * platform/config awareness, so hosts that want a branded default\n * (\"Contributing author on the {platform} platform\") pass it explicitly\n * (the hub wrapper derives it from `getAppConfig()`). Absent/null ⇒\n * nothing renders below the name when `bio` is empty.\n */\n fallbackBio?: string | null;\n /** Avatar size variant. `md` = 56px (default), `lg` = 64px. */\n size?: 'md' | 'lg';\n /**\n * Host-injected avatar-URL mapper. Wins over the ambient-runtime proxy\n * resolution. Use when the host proxies images outside the `ChatRuntime`\n * config (e.g. a bespoke CDN rewrite).\n */\n proxyImageUrl?: (url: string) => string;\n className?: string;\n}\n\nfunction formatDate(value: string | Date): string {\n // A published date is a content date: UTC-pinned through the one renderer, so\n // the server and every client agree on the day (React #418).\n return formatDateWithTimezone(value, null, 'long');\n}\n\nexport function ArticleAuthorByline({\n author,\n avatar,\n bio,\n jobTitle,\n publishedAt,\n href,\n fallbackBio,\n size = 'md',\n proxyImageUrl,\n className,\n}: ArticleAuthorBylineProps) {\n // Optional runtime — `useChatRuntime` returns null outside a provider, so\n // the byline works in bare embeds (raw avatar URL) and proxies whenever the\n // host mounted a runtime with `imageProxyUrlPrefix` (the hub always does).\n const runtime = useChatRuntime();\n if (!author) return null;\n\n const proxiedAvatar = avatar\n ? proxyImageUrl\n ? proxyImageUrl(avatar)\n : (getProxiedImageUrl(avatar, {\n proxyPrefix: runtime?.endpoints.imageProxyUrlPrefix,\n skipDomains: runtime?.endpoints.imageProxySkipDomains,\n directHttps: true,\n }) ?? avatar)\n : '';\n\n // Class-driven sizing (md = 56px, lg = 64px). The numeric pair feeds only\n // the Image element's intrinsic width/height attributes (required by the\n // Next image shim) — layout comes from the classes.\n const avatarSizeClass = size === 'lg' ? 'w-16 h-16' : 'w-14 h-14';\n const avatarIconClass = size === 'lg' ? 'w-8 h-8' : 'w-7 h-7';\n const avatarDim = size === 'lg' ? 64 : 56;\n const formattedBio = formatBioText(bio ?? null);\n const dateLabel = publishedAt ? formatDate(publishedAt) : '';\n\n return (\n <div\n className={cn(\n 'rounded-lg border border-ods-border bg-ods-card p-6',\n 'flex flex-col items-start gap-4 md:flex-row',\n className,\n )}\n >\n {/* Avatar */}\n <div className=\"flex-shrink-0\">\n {avatar ? (\n <Image\n src={proxiedAvatar || avatar}\n alt={author}\n width={avatarDim}\n height={avatarDim}\n className={cn('rounded-full border-2 border-ods-border object-cover', avatarSizeClass)}\n />\n ) : (\n <div\n className={cn(\n 'flex items-center justify-center rounded-full border-2 border-ods-border bg-ods-bg',\n avatarSizeClass,\n )}\n >\n <User className={cn('text-ods-text-secondary', avatarIconClass)} />\n </div>\n )}\n </div>\n\n {/* Name + meta + bio */}\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex flex-wrap items-baseline gap-x-3 gap-y-1\">\n <h3 className=\"text-ods-text-primary text-h5\">\n {href ? (\n <Link href={href} className=\"transition-colors hover:text-ods-accent\">\n {author}\n </Link>\n ) : (\n author\n )}\n </h3>\n {dateLabel && (\n <span className=\"text-body-sm inline-flex items-center gap-1 font-body text-ods-text-secondary\">\n <Calendar className=\"h-3 w-3\" />\n {dateLabel}\n </span>\n )}\n </div>\n {jobTitle && <p className=\"text-body-sm mt-0.5 font-body text-ods-text-secondary\">{jobTitle}</p>}\n {formattedBio ? (\n <p className=\"text-body-md mt-2 font-body leading-relaxed text-ods-text-secondary\">{formattedBio}</p>\n ) : fallbackBio ? (\n <p className=\"text-body-md mt-2 font-body italic text-ods-text-secondary\">{fallbackBio}</p>\n ) : null}\n </div>\n </div>\n );\n}\n"]}
@@ -4,13 +4,13 @@
4
4
 
5
5
 
6
6
 
7
- var _chunk64MGLDCXcjs = require('./chunk-64MGLDCX.cjs');
7
+ var _chunkLSY7OGTCcjs = require('./chunk-LSY7OGTC.cjs');
8
8
 
9
9
 
10
10
  var _chunkP22VEIWQcjs = require('./chunk-P22VEIWQ.cjs');
11
11
 
12
12
 
13
- var _chunkUHLN2S7Jcjs = require('./chunk-UHLN2S7J.cjs');
13
+ var _chunkHTIOL44Ccjs = require('./chunk-HTIOL44C.cjs');
14
14
 
15
15
 
16
16
 
@@ -37,7 +37,7 @@ var _chunk4HHBN7STcjs = require('./chunk-4HHBN7ST.cjs');
37
37
 
38
38
 
39
39
 
40
- var _chunkDQOQ3KTPcjs = require('./chunk-DQOQ3KTP.cjs');
40
+ var _chunkQNWQQ4RTcjs = require('./chunk-QNWQQ4RT.cjs');
41
41
 
42
42
 
43
43
  var _chunkWLSFBRT5cjs = require('./chunk-WLSFBRT5.cjs');
@@ -122,7 +122,7 @@ CveLink.displayName = "CveLink";
122
122
  // src/components/platform/ToolBadge.tsx
123
123
 
124
124
  var ToolBadge = ({ toolType, className, iconClassName }) => {
125
- const label = _chunk64MGLDCXcjs.getToolLabel.call(void 0, toolType);
125
+ const label = _chunkLSY7OGTCcjs.getToolLabel.call(void 0, toolType);
126
126
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex items-center gap-1 text-ods-text-secondary", className), children: [
127
127
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkYISLYIVYcjs.ToolIcon, { toolType, className: iconClassName, size: 16 }),
128
128
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "text-ods-text-primary text-h4", children: label })
@@ -133,31 +133,31 @@ ToolBadge.displayName = "ToolBadge";
133
133
  // src/components/platform/ShellTypeBadge.tsx
134
134
 
135
135
  var shellIconMap = {
136
- [_chunk64MGLDCXcjs.ShellTypeValues.POWERSHELL]: {
136
+ [_chunkLSY7OGTCcjs.ShellTypeValues.POWERSHELL]: {
137
137
  icon: _chunk4HHBN7STcjs.PowershellLogoGreyIcon,
138
138
  props: { size: 16, className: "text-ods-text-secondary" }
139
139
  },
140
- [_chunk64MGLDCXcjs.ShellTypeValues.CMD]: {
140
+ [_chunkLSY7OGTCcjs.ShellTypeValues.CMD]: {
141
141
  icon: _chunk5R4QMTMLcjs.CmdIcon,
142
142
  props: { size: 16, color: "var(--color-text-secondary)" }
143
143
  },
144
- [_chunk64MGLDCXcjs.ShellTypeValues.BASH]: {
144
+ [_chunkLSY7OGTCcjs.ShellTypeValues.BASH]: {
145
145
  icon: _chunk5R4QMTMLcjs.BashIcon,
146
146
  props: { size: 16, color: "var(--color-text-secondary)" }
147
147
  },
148
- [_chunk64MGLDCXcjs.ShellTypeValues.PYTHON]: {
148
+ [_chunkLSY7OGTCcjs.ShellTypeValues.PYTHON]: {
149
149
  icon: _chunk4HHBN7STcjs.PythonLogoIcon,
150
150
  props: { size: 16, className: "text-ods-text-secondary" }
151
151
  },
152
- [_chunk64MGLDCXcjs.ShellTypeValues.NUSHELL]: {
152
+ [_chunkLSY7OGTCcjs.ShellTypeValues.NUSHELL]: {
153
153
  icon: _chunk5R4QMTMLcjs.NushellIcon,
154
154
  props: { size: 16, color: "var(--color-text-secondary)" }
155
155
  },
156
- [_chunk64MGLDCXcjs.ShellTypeValues.DENO]: {
156
+ [_chunkLSY7OGTCcjs.ShellTypeValues.DENO]: {
157
157
  icon: _chunk5R4QMTMLcjs.DenoIcon,
158
158
  props: { size: 16, color: "var(--color-text-secondary)" }
159
159
  },
160
- [_chunk64MGLDCXcjs.ShellTypeValues.SHELL]: {
160
+ [_chunkLSY7OGTCcjs.ShellTypeValues.SHELL]: {
161
161
  icon: _chunk5R4QMTMLcjs.ShellIcon,
162
162
  props: { size: 16, color: "var(--color-text-secondary)" }
163
163
  }
@@ -168,7 +168,7 @@ var defaultIconConfig = {
168
168
  };
169
169
  var ShellTypeBadge = ({ shellType, className, iconClassName }) => {
170
170
  const normalizedType = _optionalChain([shellType, 'optionalAccess', _ => _.toUpperCase, 'call', _2 => _2()]);
171
- const label = _chunk64MGLDCXcjs.getShellLabel.call(void 0, normalizedType);
171
+ const label = _chunkLSY7OGTCcjs.getShellLabel.call(void 0, normalizedType);
172
172
  const { icon: IconComponent, props: iconProps } = _nullishCoalesce(shellIconMap[normalizedType], () => ( defaultIconConfig));
173
173
  const defaultIconClassName = "className" in iconProps ? iconProps.className : void 0;
174
174
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex items-center gap-1", className), children: [
@@ -184,11 +184,11 @@ function formatSupportedPlatforms(platforms) {
184
184
  if (!platforms || platforms.length === 0) {
185
185
  return "All Platforms";
186
186
  }
187
- return platforms.map((platform) => _chunk64MGLDCXcjs.getOSLabel.call(void 0, platform)).join(", ");
187
+ return platforms.map((platform) => _chunkLSY7OGTCcjs.getOSLabel.call(void 0, platform)).join(", ");
188
188
  }
189
189
  function InfoCell({ label, value, avatar, className }) {
190
190
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "flex min-w-0 items-center gap-2", className), children: [
191
- avatar && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "relative size-8 shrink-0 overflow-hidden rounded-full border border-ods-border bg-ods-bg", children: avatar.photoUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWLSFBRT5cjs.next_image_default, { src: avatar.photoUrl, alt: avatar.name, className: "object-cover", fill: true, sizes: "32px", unoptimized: true }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex size-full items-center justify-center text-ods-text-secondary text-h6", children: avatar.initials || _chunkDQOQ3KTPcjs.nameInitials.call(void 0, avatar.name) }) }),
191
+ avatar && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "relative size-8 shrink-0 overflow-hidden rounded-full border border-ods-border bg-ods-bg", children: avatar.photoUrl ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkWLSFBRT5cjs.next_image_default, { src: avatar.photoUrl, alt: avatar.name, className: "object-cover", fill: true, sizes: "32px", unoptimized: true }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "flex size-full items-center justify-center text-ods-text-secondary text-h6", children: avatar.initials || _chunkQNWQQ4RTcjs.nameInitials.call(void 0, avatar.name) }) }),
192
192
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 flex-col", children: [
193
193
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate text-ods-text-primary text-h4", title: value, children: value }),
194
194
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "span", { className: "truncate text-ods-text-secondary text-h6", children: label })
@@ -204,7 +204,7 @@ var ScriptInfoSection = ({
204
204
  author,
205
205
  className
206
206
  }) => {
207
- const shellLabel = _chunk64MGLDCXcjs.getShellLabel.call(void 0, shellType);
207
+ const shellLabel = _chunkLSY7OGTCcjs.getShellLabel.call(void 0, shellType);
208
208
  const platformsLabel = formatSupportedPlatforms(supportedPlatforms);
209
209
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "overflow-hidden rounded-[6px] border border-ods-border bg-ods-card", className), children: [
210
210
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "border-b border-ods-border p-4", children: /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col gap-1", children: [
@@ -379,7 +379,7 @@ function OnboardingStepCard({
379
379
  onSkip();
380
380
  };
381
381
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
382
- _chunkDQOQ3KTPcjs.InteractiveCard,
382
+ _chunkQNWQQ4RTcjs.InteractiveCard,
383
383
  {
384
384
  clickable: false,
385
385
  className: _chunkX7CEWD6Vcjs.cn.call(void 0,
@@ -405,7 +405,7 @@ function OnboardingStepCard({
405
405
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-[32px] w-[100px] animate-pulse rounded-[6px] bg-ods-border" }),
406
406
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-[32px] w-[120px] animate-pulse rounded-[6px] bg-ods-border" })
407
407
  ] }) : isCompleted ? /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
408
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDQOQ3KTPcjs.StatusBadge, { text: "COMPLETED", variant: "card", colorScheme: "success" }),
408
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQNWQQ4RTcjs.StatusBadge, { text: "COMPLETED", variant: "card", colorScheme: "success" }),
409
409
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
410
410
  _chunkF6U2H42Lcjs.Button,
411
411
  {
@@ -416,7 +416,7 @@ function OnboardingStepCard({
416
416
  children: step.completedText
417
417
  }
418
418
  )
419
- ] }) : isSkipped ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkDQOQ3KTPcjs.StatusBadge, { text: "SKIPPED", variant: "card", colorScheme: "default" }) }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
419
+ ] }) : isSkipped ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkQNWQQ4RTcjs.StatusBadge, { text: "SKIPPED", variant: "card", colorScheme: "default" }) }) : /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment, { children: [
420
420
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "outline", onClick: handleSkip, children: "Skip Step" }),
421
421
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "accent", onClick: handleAction, disabled: isProcessing, leftIcon: step.actionIcon("black"), children: step.actionText })
422
422
  ] })
@@ -533,7 +533,7 @@ function OnboardingWalkthrough({
533
533
  const isAllComplete = allStepsComplete(steps);
534
534
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, "w-full space-y-4", className), children: [
535
535
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex flex-col items-start justify-between gap-3 md:flex-row md:items-center md:gap-0", children: [
536
- /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: _chunkUHLN2S7Jcjs.SECTION_HEADING_CLASS, children: title }),
536
+ /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: _chunkHTIOL44Ccjs.SECTION_HEADING_CLASS, children: title }),
537
537
  isLoadingCompletion ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-[48px] w-full animate-pulse rounded-[6px] bg-ods-border md:w-[160px]" }) : isAllComplete ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "accent", onClick: handleDismiss, className: "w-full md:w-auto", children: "Close Onboarding" }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkF6U2H42Lcjs.Button, { variant: "outline", onClick: handleDismiss, className: "w-full md:w-auto", children: "Skip Onboarding" })
538
538
  ] }),
539
539
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: _chunkX7CEWD6Vcjs.cn.call(void 0, spacing), children: steps.map((step) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
@@ -562,4 +562,4 @@ function OnboardingWalkthrough({
562
562
 
563
563
 
564
564
  exports.SoftwareInfo = SoftwareInfo; exports.SoftwareSourceBadge = SoftwareSourceBadge; exports.CveLink = CveLink; exports.ToolBadge = ToolBadge; exports.ShellTypeBadge = ShellTypeBadge; exports.ScriptInfoSection = ScriptInfoSection; exports.ScriptArguments = ScriptArguments; exports.OnboardingStepCard = OnboardingStepCard; exports.OnboardingWalkthrough = OnboardingWalkthrough;
565
- //# sourceMappingURL=chunk-CZUO5KVD.cjs.map
565
+ //# sourceMappingURL=chunk-XWP5E453.cjs.map