@flamingo-stack/openframe-frontend-core 0.0.285 → 0.0.286

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 (211) hide show
  1. package/dist/chunk-3MCHAFHB.js +89 -0
  2. package/dist/chunk-3MCHAFHB.js.map +1 -0
  3. package/dist/{chunk-IMNGGLKL.js → chunk-3ZXUQQL4.js} +2 -2
  4. package/dist/{chunk-44ZFLMYC.cjs → chunk-4WACBTZU.cjs} +30 -30
  5. package/dist/{chunk-44ZFLMYC.cjs.map → chunk-4WACBTZU.cjs.map} +1 -1
  6. package/dist/{chunk-23UOJUDF.js → chunk-5BTZOVDQ.js} +4 -4
  7. package/dist/chunk-5KD3S25X.cjs +312 -0
  8. package/dist/chunk-5KD3S25X.cjs.map +1 -0
  9. package/dist/chunk-6N26CURS.cjs +2417 -0
  10. package/dist/chunk-6N26CURS.cjs.map +1 -0
  11. package/dist/{chunk-XX7P4IL2.js → chunk-7NM7DEUK.js} +4 -143
  12. package/dist/chunk-7NM7DEUK.js.map +1 -0
  13. package/dist/chunk-BBZ7AX5H.cjs +290 -0
  14. package/dist/chunk-BBZ7AX5H.cjs.map +1 -0
  15. package/dist/chunk-C6SCWXDP.js +290 -0
  16. package/dist/chunk-C6SCWXDP.js.map +1 -0
  17. package/dist/{chunk-GVSTRN36.cjs → chunk-D3LEFMOA.cjs} +3 -3
  18. package/dist/{chunk-GVSTRN36.cjs.map → chunk-D3LEFMOA.cjs.map} +1 -1
  19. package/dist/{chunk-P45Q4QCU.cjs → chunk-D5YY5U6J.cjs} +19 -15
  20. package/dist/chunk-D5YY5U6J.cjs.map +1 -0
  21. package/dist/chunk-DDAT4RKX.js +2417 -0
  22. package/dist/chunk-DDAT4RKX.js.map +1 -0
  23. package/dist/{chunk-PVXCVPJD.cjs → chunk-EI4WALN2.cjs} +67 -1626
  24. package/dist/chunk-EI4WALN2.cjs.map +1 -0
  25. package/dist/{chunk-ZIODAAFY.cjs → chunk-EL5GCMPU.cjs} +20 -159
  26. package/dist/chunk-EL5GCMPU.cjs.map +1 -0
  27. package/dist/{chunk-VQW7CEGS.js → chunk-FSBDVT6R.js} +1831 -3672
  28. package/dist/chunk-FSBDVT6R.js.map +1 -0
  29. package/dist/{chunk-DPKUSBQH.cjs → chunk-GDF2R2ER.cjs} +1073 -2914
  30. package/dist/chunk-GDF2R2ER.cjs.map +1 -0
  31. package/dist/chunk-HLQW7MWJ.cjs +1594 -0
  32. package/dist/chunk-HLQW7MWJ.cjs.map +1 -0
  33. package/dist/chunk-I6ZPGKZ2.cjs +151 -0
  34. package/dist/chunk-I6ZPGKZ2.cjs.map +1 -0
  35. package/dist/{chunk-J66U3LPZ.cjs → chunk-KBKZYJRI.cjs} +33 -332
  36. package/dist/chunk-KBKZYJRI.cjs.map +1 -0
  37. package/dist/{chunk-USPATRSC.js → chunk-N6ZM5PYZ.js} +45 -344
  38. package/dist/chunk-N6ZM5PYZ.js.map +1 -0
  39. package/dist/{chunk-RGALV4UX.js → chunk-POKKCWKF.js} +3 -82
  40. package/dist/chunk-POKKCWKF.js.map +1 -0
  41. package/dist/{chunk-XDI5JSWB.cjs → chunk-QCKN37OP.cjs} +45 -41
  42. package/dist/chunk-QCKN37OP.cjs.map +1 -0
  43. package/dist/{chunk-KNCDUWY2.js → chunk-QF2X6PTD.js} +10 -6
  44. package/dist/{chunk-KNCDUWY2.js.map → chunk-QF2X6PTD.js.map} +1 -1
  45. package/dist/{chunk-Z3V2SGQZ.js → chunk-R2KT5GDD.js} +324 -1883
  46. package/dist/chunk-R2KT5GDD.js.map +1 -0
  47. package/dist/{chunk-RJUGNL2A.cjs → chunk-RQ6RTBKF.cjs} +16 -12
  48. package/dist/chunk-RQ6RTBKF.cjs.map +1 -0
  49. package/dist/chunk-TFSYSWPS.cjs +89 -0
  50. package/dist/chunk-TFSYSWPS.cjs.map +1 -0
  51. package/dist/chunk-TYZEMPPH.js +312 -0
  52. package/dist/chunk-TYZEMPPH.js.map +1 -0
  53. package/dist/{chunk-O5N57CRV.js → chunk-VCQ3CTYK.js} +12 -8
  54. package/dist/{chunk-O5N57CRV.js.map → chunk-VCQ3CTYK.js.map} +1 -1
  55. package/dist/chunk-VRSXJ5QJ.js +1599 -0
  56. package/dist/chunk-VRSXJ5QJ.js.map +1 -0
  57. package/dist/{chunk-53CFL7PH.js → chunk-XQL4WDML.js} +11 -7
  58. package/dist/{chunk-53CFL7PH.js.map → chunk-XQL4WDML.js.map} +1 -1
  59. package/dist/chunk-Y4JNA4W6.cjs +1599 -0
  60. package/dist/chunk-Y4JNA4W6.cjs.map +1 -0
  61. package/dist/{chunk-ZSUNQJRO.cjs → chunk-YETA25JW.cjs} +2 -81
  62. package/dist/chunk-YETA25JW.cjs.map +1 -0
  63. package/dist/chunk-YVB3VDIQ.js +1594 -0
  64. package/dist/chunk-YVB3VDIQ.js.map +1 -0
  65. package/dist/chunk-ZLN6SM2U.js +151 -0
  66. package/dist/chunk-ZLN6SM2U.js.map +1 -0
  67. package/dist/components/chat/chat-attachment-bar.d.ts.map +1 -1
  68. package/dist/components/chat/index.cjs +12 -6
  69. package/dist/components/chat/index.cjs.map +1 -1
  70. package/dist/components/chat/index.js +45 -39
  71. package/dist/components/contact/index.cjs +11 -7
  72. package/dist/components/contact/index.cjs.map +1 -1
  73. package/dist/components/contact/index.js +10 -6
  74. package/dist/components/docs/doc-navigation-context.d.ts +39 -0
  75. package/dist/components/docs/doc-navigation-context.d.ts.map +1 -0
  76. package/dist/components/docs/doc-viewer.d.ts +66 -0
  77. package/dist/components/docs/doc-viewer.d.ts.map +1 -0
  78. package/dist/components/docs/index.cjs +34 -0
  79. package/dist/components/docs/index.cjs.map +1 -0
  80. package/dist/components/docs/index.d.ts +8 -0
  81. package/dist/components/docs/index.d.ts.map +1 -0
  82. package/dist/components/docs/index.js +34 -0
  83. package/dist/components/docs/index.js.map +1 -0
  84. package/dist/components/docs/use-document-tree.d.ts +41 -0
  85. package/dist/components/docs/use-document-tree.d.ts.map +1 -0
  86. package/dist/components/docs/use-scroll-spy.d.ts +16 -0
  87. package/dist/components/docs/use-scroll-spy.d.ts.map +1 -0
  88. package/dist/components/embeds/embed-iframe.d.ts +29 -0
  89. package/dist/components/embeds/embed-iframe.d.ts.map +1 -0
  90. package/dist/components/embeds/figma-embed.d.ts +27 -0
  91. package/dist/components/embeds/figma-embed.d.ts.map +1 -0
  92. package/dist/components/embeds/google-sheets-viewer.d.ts +8 -0
  93. package/dist/components/embeds/google-sheets-viewer.d.ts.map +1 -0
  94. package/dist/components/embeds/index.cjs +37 -0
  95. package/dist/components/embeds/index.cjs.map +1 -0
  96. package/dist/components/embeds/index.d.ts +9 -0
  97. package/dist/components/embeds/index.d.ts.map +1 -0
  98. package/dist/components/embeds/index.js +37 -0
  99. package/dist/components/embeds/index.js.map +1 -0
  100. package/dist/components/embeds/pdf-viewer.d.ts +10 -0
  101. package/dist/components/embeds/pdf-viewer.d.ts.map +1 -0
  102. package/dist/components/faq/index.cjs +12 -8
  103. package/dist/components/faq/index.cjs.map +1 -1
  104. package/dist/components/faq/index.js +11 -7
  105. package/dist/components/features/index.cjs +10 -6
  106. package/dist/components/features/index.cjs.map +1 -1
  107. package/dist/components/features/index.js +9 -5
  108. package/dist/components/index.cjs +247 -1120
  109. package/dist/components/index.cjs.map +1 -1
  110. package/dist/components/index.d.ts +2 -0
  111. package/dist/components/index.d.ts.map +1 -1
  112. package/dist/components/index.js +645 -1518
  113. package/dist/components/index.js.map +1 -1
  114. package/dist/components/navigation/index.cjs +15 -6
  115. package/dist/components/navigation/index.cjs.map +1 -1
  116. package/dist/components/navigation/index.d.ts +2 -0
  117. package/dist/components/navigation/index.d.ts.map +1 -1
  118. package/dist/components/navigation/index.js +15 -6
  119. package/dist/components/navigation/multi-level-navigation.d.ts +28 -0
  120. package/dist/components/navigation/multi-level-navigation.d.ts.map +1 -0
  121. package/dist/components/onboarding-guides/index.cjs +34 -29
  122. package/dist/components/onboarding-guides/index.cjs.map +1 -1
  123. package/dist/components/onboarding-guides/index.js +13 -8
  124. package/dist/components/onboarding-guides/index.js.map +1 -1
  125. package/dist/components/related-content/index.cjs +12 -8
  126. package/dist/components/related-content/index.cjs.map +1 -1
  127. package/dist/components/related-content/index.js +11 -7
  128. package/dist/components/tickets/index.cjs +75 -70
  129. package/dist/components/tickets/index.cjs.map +1 -1
  130. package/dist/components/tickets/index.js +16 -11
  131. package/dist/components/tickets/index.js.map +1 -1
  132. package/dist/components/ui/index.cjs +12 -6
  133. package/dist/components/ui/index.cjs.map +1 -1
  134. package/dist/components/ui/index.js +65 -59
  135. package/dist/embed-shims/index.cjs +3 -3
  136. package/dist/embed-shims/index.cjs.map +1 -1
  137. package/dist/embed-shims/index.js +8 -8
  138. package/dist/hooks/index.cjs +6 -3
  139. package/dist/hooks/index.cjs.map +1 -1
  140. package/dist/hooks/index.js +7 -4
  141. package/dist/index.cjs +62 -6
  142. package/dist/index.cjs.map +1 -1
  143. package/dist/index.js +257 -201
  144. package/dist/types/doc-source.cjs +4 -0
  145. package/dist/types/doc-source.cjs.map +1 -0
  146. package/dist/types/doc-source.d.ts +86 -0
  147. package/dist/types/doc-source.d.ts.map +1 -0
  148. package/dist/types/doc-source.js +3 -0
  149. package/dist/types/doc-source.js.map +1 -0
  150. package/dist/types/index.d.ts +1 -0
  151. package/dist/types/index.d.ts.map +1 -1
  152. package/dist/utils/doc-path-utils.d.ts +24 -0
  153. package/dist/utils/doc-path-utils.d.ts.map +1 -0
  154. package/dist/utils/doc-tree-nav.d.ts +35 -0
  155. package/dist/utils/doc-tree-nav.d.ts.map +1 -0
  156. package/dist/utils/embed-url-converters.d.ts +16 -0
  157. package/dist/utils/embed-url-converters.d.ts.map +1 -0
  158. package/dist/utils/format.d.ts +9 -0
  159. package/dist/utils/format.d.ts.map +1 -1
  160. package/dist/utils/index.cjs +297 -0
  161. package/dist/utils/index.cjs.map +1 -1
  162. package/dist/utils/index.d.ts +7 -1
  163. package/dist/utils/index.d.ts.map +1 -1
  164. package/dist/utils/index.js +276 -1
  165. package/dist/utils/index.js.map +1 -1
  166. package/dist/utils/markdown-section-extractor.d.ts +23 -0
  167. package/dist/utils/markdown-section-extractor.d.ts.map +1 -0
  168. package/dist/utils/markdown-to-plain.d.ts +32 -0
  169. package/dist/utils/markdown-to-plain.d.ts.map +1 -0
  170. package/dist/utils/tree-builder.d.ts +30 -0
  171. package/dist/utils/tree-builder.d.ts.map +1 -0
  172. package/package.json +19 -1
  173. package/src/components/chat/chat-attachment-bar.tsx +6 -11
  174. package/src/components/docs/doc-navigation-context.tsx +123 -0
  175. package/src/components/docs/doc-viewer.tsx +345 -0
  176. package/src/components/docs/index.ts +12 -0
  177. package/src/components/docs/use-document-tree.ts +427 -0
  178. package/src/components/docs/use-scroll-spy.ts +93 -0
  179. package/src/components/embeds/embed-iframe.tsx +103 -0
  180. package/src/components/embeds/figma-embed.tsx +147 -0
  181. package/src/components/embeds/google-sheets-viewer.tsx +54 -0
  182. package/src/components/embeds/index.ts +11 -0
  183. package/src/components/embeds/pdf-viewer.tsx +64 -0
  184. package/src/components/index.ts +2 -0
  185. package/src/components/navigation/index.ts +5 -0
  186. package/src/components/navigation/multi-level-navigation.tsx +358 -0
  187. package/src/types/doc-source.ts +88 -0
  188. package/src/types/index.ts +4 -0
  189. package/src/utils/doc-path-utils.ts +47 -0
  190. package/src/utils/doc-tree-nav.ts +111 -0
  191. package/src/utils/embed-url-converters.ts +77 -0
  192. package/src/utils/format.ts +16 -0
  193. package/src/utils/index.ts +11 -0
  194. package/src/utils/markdown-section-extractor.ts +106 -0
  195. package/src/utils/markdown-to-plain.ts +69 -0
  196. package/src/utils/tree-builder.ts +114 -0
  197. package/dist/chunk-DPKUSBQH.cjs.map +0 -1
  198. package/dist/chunk-J66U3LPZ.cjs.map +0 -1
  199. package/dist/chunk-P45Q4QCU.cjs.map +0 -1
  200. package/dist/chunk-PVXCVPJD.cjs.map +0 -1
  201. package/dist/chunk-RGALV4UX.js.map +0 -1
  202. package/dist/chunk-RJUGNL2A.cjs.map +0 -1
  203. package/dist/chunk-USPATRSC.js.map +0 -1
  204. package/dist/chunk-VQW7CEGS.js.map +0 -1
  205. package/dist/chunk-XDI5JSWB.cjs.map +0 -1
  206. package/dist/chunk-XX7P4IL2.js.map +0 -1
  207. package/dist/chunk-Z3V2SGQZ.js.map +0 -1
  208. package/dist/chunk-ZIODAAFY.cjs.map +0 -1
  209. package/dist/chunk-ZSUNQJRO.cjs.map +0 -1
  210. /package/dist/{chunk-IMNGGLKL.js.map → chunk-3ZXUQQL4.js.map} +0 -0
  211. /package/dist/{chunk-23UOJUDF.js.map → chunk-5BTZOVDQ.js.map} +0 -0
@@ -1,10 +1,27 @@
1
1
  "use client";
2
2
  import {
3
- useAutoLimitTags,
4
- useDebounce,
3
+ COMPACT_CARD_IMAGE_SLOT,
4
+ COMPACT_CARD_META_ROW_BOX,
5
+ COMPACT_CARD_OUTER,
6
+ COMPACT_CARD_ROW_FILLER,
7
+ COMPACT_CARD_SKELETON_IMAGE_SLOT,
8
+ COMPACT_CARD_SKELETON_OUTER,
9
+ COMPACT_CARD_SUMMARY,
10
+ COMPACT_CARD_TEXT_COL,
11
+ COMPACT_CARD_TITLE,
12
+ COMPACT_CARD_TITLE_ROW,
13
+ SECTION_HEADING_CLASS,
14
+ decideNewTab,
15
+ fetchPriorityProp,
16
+ formatDate,
17
+ formatDurationMMSS,
18
+ getFirstLastInitials,
19
+ nameInitials
20
+ } from "./chunk-VRSXJ5QJ.js";
21
+ import {
5
22
  useNearViewport,
6
23
  useOgPlaceholder
7
- } from "./chunk-RGALV4UX.js";
24
+ } from "./chunk-3MCHAFHB.js";
8
25
  import {
9
26
  useChatRuntime
10
27
  } from "./chunk-LCNMR277.js";
@@ -23,21 +40,8 @@ import {
23
40
  init_next_link,
24
41
  next_link_default
25
42
  } from "./chunk-OHPI2HRK.js";
26
- import {
27
- ClickUpIcon,
28
- FacebookIcon,
29
- GitHubIcon,
30
- HubspotIcon,
31
- InstagramIcon,
32
- LinkedInIcon,
33
- OpenFrameLogo,
34
- SlackIcon,
35
- XLogo,
36
- YouTubeIcon
37
- } from "./chunk-V4IIBNTA.js";
38
43
  import {
39
44
  cn,
40
- getBaseUrl,
41
45
  init_cn
42
46
  } from "./chunk-XTCBRQN2.js";
43
47
  import {
@@ -46,172 +50,14 @@ import {
46
50
  Chevron02LeftIcon,
47
51
  Chevron02RightIcon,
48
52
  Ellipsis01Icon,
49
- PlayIcon,
50
- XmarkCircleIcon
53
+ PlayIcon
51
54
  } from "./chunk-J7AV6H63.js";
52
- import {
53
- SearchIcon
54
- } from "./chunk-6U3IUD57.js";
55
-
56
- // src/components/ui/hidden-tags-popup.tsx
57
- import { forwardRef } from "react";
58
- init_cn();
59
- import { jsx, jsxs } from "react/jsx-runtime";
60
- var HiddenTagsPopup = forwardRef(function HiddenTagsPopup2({ items, onRemove, disabled, className, style }, ref) {
61
- return /* @__PURE__ */ jsx(
62
- "div",
63
- {
64
- ref,
65
- style,
66
- className: cn(
67
- // Base positioning is neutral (left-anchored); consumers override via
68
- // `style.left` (search-input, tag-search-input) or `className` (autocomplete).
69
- "absolute top-full left-0 mt-1 z-50 min-w-[200px]",
70
- "bg-ods-card border border-ods-border rounded-[6px] shadow-lg",
71
- "animate-in fade-in-0 zoom-in-95 duration-150",
72
- className
73
- ),
74
- children: items.map((item) => /* @__PURE__ */ jsxs(
75
- "div",
76
- {
77
- className: cn(
78
- "flex items-center justify-between gap-3 px-3 h-11 md:h-12",
79
- "border-b border-ods-border last:border-b-0"
80
- ),
81
- children: [
82
- /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 text-h5 truncate uppercase text-ods-text-primary", title: typeof item.label === "string" ? item.label : void 0, children: item.label }),
83
- !disabled && onRemove && /* @__PURE__ */ jsx(
84
- "button",
85
- {
86
- type: "button",
87
- onClick: (e) => {
88
- e.stopPropagation();
89
- onRemove(item.value);
90
- },
91
- className: "shrink-0 text-ods-text-secondary hover:text-ods-text-primary transition-colors",
92
- "aria-label": `Remove ${String(item.label)}`,
93
- children: /* @__PURE__ */ jsx(XmarkCircleIcon, { size: 20 })
94
- }
95
- )
96
- ]
97
- },
98
- String(item.value)
99
- ))
100
- }
101
- );
102
- });
103
-
104
- // src/components/ui/tag.tsx
105
- import { cva } from "class-variance-authority";
106
- init_cn();
107
- import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
108
- var tagVariants = cva(
109
- [
110
- "text-h5 h-8 inline-flex items-center justify-center gap-[var(--spacing-system-xxs)] p-[var(--spacing-system-xsf)] rounded-md",
111
- "transition-colors duration-150"
112
- ],
113
- {
114
- variants: {
115
- variant: {
116
- primary: [
117
- "bg-[var(--ods-open-yellow-base)] text-[var(--ods-system-greys-black)]",
118
- "hover:bg-[var(--ods-open-yellow-hover)] active:bg-[var(--ods-open-yellow-action)]"
119
- ],
120
- outline: [
121
- "bg-[var(--ods-system-greys-black)] text-[var(--ods-system-greys-white)] border border-[var(--ods-system-greys-soft-grey)]",
122
- "hover:bg-[var(--ods-system-greys-black-hover)] hover:border-[var(--ods-system-greys-soft-grey-hover)]",
123
- "active:bg-[var(--ods-system-greys-black-action)] active:border-[var(--ods-system-greys-soft-grey-action)]"
124
- ],
125
- success: [
126
- "bg-[var(--ods-attention-green-success-secondary)] text-[var(--ods-attention-green-success)]",
127
- "hover:bg-[#385029] active:bg-[#425a33]"
128
- ],
129
- warning: [
130
- "bg-[var(--ods-attention-yellow-warning-secondary)] text-[var(--ods-attention-yellow-warning)]",
131
- "hover:bg-[#544729] active:bg-[#5e5133]"
132
- ],
133
- error: [
134
- "bg-[var(--ods-attention-red-error-secondary)] text-[var(--ods-attention-red-error)]",
135
- "hover:bg-[#542b2b] active:bg-[#5e3535]"
136
- ],
137
- critical: [
138
- "bg-[var(--ods-attention-red-error)] text-[var(--ods-attention-red-error-secondary)]",
139
- "hover:bg-[var(--ods-attention-red-error-hover)] active:bg-[var(--ods-attention-red-error-action)]"
140
- ],
141
- grey: [
142
- "bg-[var(--ods-system-greys-soft-grey)] text-[var(--ods-system-greys-grey)]",
143
- "hover:bg-[var(--ods-system-greys-soft-grey-hover)] active:bg-[var(--ods-system-greys-soft-grey-action)]"
144
- ],
145
- // Matches the EntityTagBadges / StatusBadge tag skin (ods-card + ods-border,
146
- // mono uppercase) so the tag-editor chips render identically to the public
147
- // tag badges. Used for FilterChipData variant 'tag' (see search-input).
148
- badge: [
149
- "bg-ods-card text-ods-text-primary border border-ods-border font-mono uppercase tracking-wide",
150
- "hover:border-ods-accent transition-colors"
151
- ]
152
- }
153
- },
154
- defaultVariants: {
155
- variant: "primary"
156
- }
157
- }
158
- );
159
- var disabledTagClasses = [
160
- "bg-[var(--ods-system-greys-soft-grey)] text-[var(--ods-system-greys-grey)]",
161
- "border-transparent",
162
- "cursor-not-allowed",
163
- "pointer-events-none"
164
- ];
165
- function Tag({
166
- label,
167
- variant,
168
- icon,
169
- onClose,
170
- className,
171
- labelClassName,
172
- disabled,
173
- ...props
174
- }) {
175
- return /* @__PURE__ */ jsxs2(
176
- "div",
177
- {
178
- className: cn(
179
- tagVariants({ variant }),
180
- disabled && disabledTagClasses,
181
- className
182
- ),
183
- "aria-disabled": disabled || void 0,
184
- ...props,
185
- children: [
186
- icon && /* @__PURE__ */ jsx2("span", { className: "flex items-center justify-center size-5 shrink-0", children: icon }),
187
- /* @__PURE__ */ jsx2("span", { className: cn("truncate", labelClassName), title: typeof label === "string" ? label : void 0, children: label }),
188
- onClose && /* @__PURE__ */ jsx2(
189
- "button",
190
- {
191
- type: "button",
192
- disabled,
193
- onClick: (e) => {
194
- e.stopPropagation();
195
- onClose();
196
- },
197
- className: cn(
198
- "flex items-center justify-center size-5 shrink-0 rounded-full opacity-70 transition-opacity",
199
- disabled ? "cursor-not-allowed" : "hover:opacity-100"
200
- ),
201
- "aria-label": "Remove",
202
- children: /* @__PURE__ */ jsx2(XmarkCircleIcon, { className: "size-4" })
203
- }
204
- )
205
- ]
206
- }
207
- );
208
- }
209
55
 
210
56
  // src/components/ui/card.tsx
211
57
  init_cn();
212
58
  import * as React from "react";
213
- import { jsx as jsx3, jsxs as jsxs3 } from "react/jsx-runtime";
214
- var Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
59
+ import { jsx, jsxs } from "react/jsx-runtime";
60
+ var Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
215
61
  "div",
216
62
  {
217
63
  ref,
@@ -223,7 +69,7 @@ var Card = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ js
223
69
  }
224
70
  ));
225
71
  Card.displayName = "Card";
226
- var CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
72
+ var CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
227
73
  "div",
228
74
  {
229
75
  ref,
@@ -232,7 +78,7 @@ var CardHeader = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
232
78
  }
233
79
  ));
234
80
  CardHeader.displayName = "CardHeader";
235
- var CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
81
+ var CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
236
82
  "div",
237
83
  {
238
84
  ref,
@@ -244,7 +90,7 @@ var CardTitle = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
244
90
  }
245
91
  ));
246
92
  CardTitle.displayName = "CardTitle";
247
- var CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
93
+ var CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
248
94
  "div",
249
95
  {
250
96
  ref,
@@ -253,9 +99,9 @@ var CardDescription = React.forwardRef(({ className, ...props }, ref) => /* @__P
253
99
  }
254
100
  ));
255
101
  CardDescription.displayName = "CardDescription";
256
- var CardContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3("div", { ref, className: cn("p-6 pt-0", className), ...props }));
102
+ var CardContent = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("p-6 pt-0", className), ...props }));
257
103
  CardContent.displayName = "CardContent";
258
- var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx3(
104
+ var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx(
259
105
  "div",
260
106
  {
261
107
  ref,
@@ -265,7 +111,7 @@ var CardFooter = React.forwardRef(({ className, ...props }, ref) => /* @__PURE__
265
111
  ));
266
112
  CardFooter.displayName = "CardFooter";
267
113
  function CardHorizontal({ icon, title, description, className = "", borderLeft = true }) {
268
- return /* @__PURE__ */ jsxs3(
114
+ return /* @__PURE__ */ jsxs(
269
115
  "div",
270
116
  {
271
117
  className: cn(
@@ -274,10 +120,10 @@ function CardHorizontal({ icon, title, description, className = "", borderLeft =
274
120
  className
275
121
  ),
276
122
  children: [
277
- /* @__PURE__ */ jsx3("div", { className: "w-5 h-5 flex-shrink-0", children: icon }),
278
- /* @__PURE__ */ jsxs3("div", { className: "flex flex-col min-w-0", children: [
279
- /* @__PURE__ */ jsx3("span", { className: "font-medium text-sm md:text-sm text-ods-text-primary leading-tight mb-0.5 text-left", children: title }),
280
- /* @__PURE__ */ jsx3("span", { className: "text-xs md:text-sm text-ods-text-secondary leading-tight text-left", children: description })
123
+ /* @__PURE__ */ jsx("div", { className: "w-5 h-5 flex-shrink-0", children: icon }),
124
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col min-w-0", children: [
125
+ /* @__PURE__ */ jsx("span", { className: "font-medium text-sm md:text-sm text-ods-text-primary leading-tight mb-0.5 text-left", children: title }),
126
+ /* @__PURE__ */ jsx("span", { className: "text-xs md:text-sm text-ods-text-secondary leading-tight text-left", children: description })
281
127
  ] })
282
128
  ]
283
129
  }
@@ -288,9 +134,9 @@ function CardHorizontal({ icon, title, description, className = "", borderLeft =
288
134
  init_cn();
289
135
  import * as React2 from "react";
290
136
  import * as TabsPrimitive from "@radix-ui/react-tabs";
291
- import { jsx as jsx4 } from "react/jsx-runtime";
137
+ import { jsx as jsx2 } from "react/jsx-runtime";
292
138
  var Tabs = TabsPrimitive.Root;
293
- var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx4(
139
+ var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
294
140
  TabsPrimitive.List,
295
141
  {
296
142
  ref,
@@ -302,7 +148,7 @@ var TabsList = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__
302
148
  }
303
149
  ));
304
150
  TabsList.displayName = TabsPrimitive.List.displayName;
305
- var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx4(
151
+ var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
306
152
  TabsPrimitive.Trigger,
307
153
  {
308
154
  ref,
@@ -314,7 +160,7 @@ var TabsTrigger = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE
314
160
  }
315
161
  ));
316
162
  TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
317
- var TabsContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx4(
163
+ var TabsContent = React2.forwardRef(({ className, ...props }, ref) => /* @__PURE__ */ jsx2(
318
164
  TabsPrimitive.Content,
319
165
  {
320
166
  ref,
@@ -329,9 +175,9 @@ TabsContent.displayName = TabsPrimitive.Content.displayName;
329
175
 
330
176
  // src/components/ui/status-badge.tsx
331
177
  init_cn();
332
- import { cva as cva2 } from "class-variance-authority";
333
- import { jsx as jsx5 } from "react/jsx-runtime";
334
- var statusBadgeVariants = cva2(
178
+ import { cva } from "class-variance-authority";
179
+ import { jsx as jsx3 } from "react/jsx-runtime";
180
+ var statusBadgeVariants = cva(
335
181
  "inline-flex items-center justify-center rounded font-mono font-medium uppercase tracking-wide",
336
182
  {
337
183
  variants: {
@@ -373,11 +219,11 @@ function StatusBadge({
373
219
  if (singleLine) return text;
374
220
  if (variant === "button" && text.includes(" ")) {
375
221
  const words = text.split(" ");
376
- return /* @__PURE__ */ jsx5("span", { className: "flex flex-col items-center justify-center text-center gap-0", children: words.map((word, index) => /* @__PURE__ */ jsx5("span", { className: "block", children: word }, index)) });
222
+ return /* @__PURE__ */ jsx3("span", { className: "flex flex-col items-center justify-center text-center gap-0", children: words.map((word, index) => /* @__PURE__ */ jsx3("span", { className: "block", children: word }, index)) });
377
223
  }
378
224
  return text;
379
225
  };
380
- return /* @__PURE__ */ jsx5(
226
+ return /* @__PURE__ */ jsx3(
381
227
  "span",
382
228
  {
383
229
  className: cn(statusBadgeVariants({ variant, colorScheme }), className),
@@ -396,7 +242,7 @@ import rehypeHighlight from "rehype-highlight";
396
242
  import rehypeRaw from "rehype-raw";
397
243
  import { visit } from "unist-util-visit";
398
244
  init_cn();
399
- import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
245
+ import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
400
246
  var EVENT_HANDLER_ATTR_RE = /^on[a-z]+$/i;
401
247
  var JAVASCRIPT_URL_RE = /^[\s\x00-\x1f]*javascript:/i;
402
248
  var DATA_URL_RE = /^[\s\x00-\x1f]*data:/i;
@@ -705,16 +551,16 @@ var MermaidDiagram = ({ chart }) => {
705
551
  }
706
552
  }, [chart, mounted]);
707
553
  if (error) {
708
- return /* @__PURE__ */ jsxs4("div", { className: "error-state bg-ods-card border border-ods-border rounded-lg p-6 my-6", children: [
709
- /* @__PURE__ */ jsx6("div", { className: "error-icon flex justify-center mb-4", children: /* @__PURE__ */ jsx6(AlertCircleIcon, { className: "w-12 h-12 text-ods-error" }) }),
710
- /* @__PURE__ */ jsx6("div", { className: "error-title text-center font-sans font-semibold text-lg text-ods-error mb-2", children: "Diagram Error" }),
711
- /* @__PURE__ */ jsx6("div", { className: "error-description text-center font-sans text-sm text-ods-text-secondary mb-4 break-words overflow-hidden max-w-full", children: /* @__PURE__ */ jsx6("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx6("pre", { className: "whitespace-pre-wrap break-words text-xs", children: error }) }) })
554
+ return /* @__PURE__ */ jsxs2("div", { className: "error-state bg-ods-card border border-ods-border rounded-lg p-6 my-6", children: [
555
+ /* @__PURE__ */ jsx4("div", { className: "error-icon flex justify-center mb-4", children: /* @__PURE__ */ jsx4(AlertCircleIcon, { className: "w-12 h-12 text-ods-error" }) }),
556
+ /* @__PURE__ */ jsx4("div", { className: "error-title text-center font-sans font-semibold text-lg text-ods-error mb-2", children: "Diagram Error" }),
557
+ /* @__PURE__ */ jsx4("div", { className: "error-description text-center font-sans text-sm text-ods-text-secondary mb-4 break-words overflow-hidden max-w-full", children: /* @__PURE__ */ jsx4("div", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx4("pre", { className: "whitespace-pre-wrap break-words text-xs", children: error }) }) })
712
558
  ] });
713
559
  }
714
560
  if (isLoading || !svg) {
715
- return /* @__PURE__ */ jsx6("div", { className: "skeleton-code bg-ods-card border border-ods-border rounded-lg p-6 min-h-[120px] flex items-center justify-center", children: /* @__PURE__ */ jsx6("div", { className: "animate-pulse text-ods-text-tertiary font-sans", children: isLoading ? "Loading diagram renderer..." : "Rendering diagram..." }) });
561
+ return /* @__PURE__ */ jsx4("div", { className: "skeleton-code bg-ods-card border border-ods-border rounded-lg p-6 min-h-[120px] flex items-center justify-center", children: /* @__PURE__ */ jsx4("div", { className: "animate-pulse text-ods-text-tertiary font-sans", children: isLoading ? "Loading diagram renderer..." : "Rendering diagram..." }) });
716
562
  }
717
- return /* @__PURE__ */ jsx6("div", { className: "mermaid-container rounded-lg p-4 md:p-6 lg:p-8 my-6 overflow-x-auto bg-ods-card border border-ods-border", children: /* @__PURE__ */ jsx6("div", { className: "flex justify-center items-center w-full min-h-[200px] md:min-h-[250px] lg:min-h-[300px]", children: /* @__PURE__ */ jsx6(
563
+ return /* @__PURE__ */ jsx4("div", { className: "mermaid-container rounded-lg p-4 md:p-6 lg:p-8 my-6 overflow-x-auto bg-ods-card border border-ods-border", children: /* @__PURE__ */ jsx4("div", { className: "flex justify-center items-center w-full min-h-[200px] md:min-h-[250px] lg:min-h-[300px]", children: /* @__PURE__ */ jsx4(
718
564
  "div",
719
565
  {
720
566
  className: "mermaid-svg-container w-full flex justify-center max-w-full",
@@ -840,12 +686,12 @@ var SimpleMarkdownRendererImpl = ({
840
686
  [preprocessContent, content]
841
687
  );
842
688
  const makeHeading = useCallback(
843
- (Tag2, level, headingClassName) => ({ children }) => {
689
+ (Tag, level, headingClassName) => ({ children }) => {
844
690
  const text = extractText(children);
845
- const effectiveLevel = Tag2 === "h1" && demoteMarkdownH1ToH2 ? 2 : level;
691
+ const effectiveLevel = Tag === "h1" && demoteMarkdownH1ToH2 ? 2 : level;
846
692
  const id = generateHeadingId(text, effectiveLevel);
847
- const EffectiveTag = Tag2 === "h1" && demoteMarkdownH1ToH2 ? "h2" : Tag2;
848
- return /* @__PURE__ */ jsx6(EffectiveTag, { id, className: headingClassName, children });
693
+ const EffectiveTag = Tag === "h1" && demoteMarkdownH1ToH2 ? "h2" : Tag;
694
+ return /* @__PURE__ */ jsx4(EffectiveTag, { id, className: headingClassName, children });
849
695
  },
850
696
  [generateHeadingId, demoteMarkdownH1ToH2]
851
697
  );
@@ -855,12 +701,12 @@ var SimpleMarkdownRendererImpl = ({
855
701
  const match = /language-(\w+)/.exec(codeClassName || "");
856
702
  const language = match ? match[1] : "";
857
703
  if (!inline && language === "mermaid") {
858
- return /* @__PURE__ */ jsx6(MermaidDiagram, { chart: String(children).replace(/\n$/, "") });
704
+ return /* @__PURE__ */ jsx4(MermaidDiagram, { chart: String(children).replace(/\n$/, "") });
859
705
  }
860
706
  if (!inline && match) {
861
- return /* @__PURE__ */ jsxs4("div", { className: "code-block-container border rounded-lg my-6 overflow-hidden bg-ods-card border-ods-border", children: [
862
- /* @__PURE__ */ jsx6("div", { className: "code-header border-b px-4 py-2 bg-ods-card border-ods-border", children: /* @__PURE__ */ jsx6("span", { className: "font-sans text-xs uppercase tracking-wide text-ods-text-tertiary", children: language || "code" }) }),
863
- /* @__PURE__ */ jsx6("div", { className: "p-4", children: /* @__PURE__ */ jsx6("pre", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx6(
707
+ return /* @__PURE__ */ jsxs2("div", { className: "code-block-container border rounded-lg my-6 overflow-hidden bg-ods-card border-ods-border", children: [
708
+ /* @__PURE__ */ jsx4("div", { className: "code-header border-b px-4 py-2 bg-ods-card border-ods-border", children: /* @__PURE__ */ jsx4("span", { className: "font-sans text-xs uppercase tracking-wide text-ods-text-tertiary", children: language || "code" }) }),
709
+ /* @__PURE__ */ jsx4("div", { className: "p-4", children: /* @__PURE__ */ jsx4("pre", { className: "overflow-x-auto", children: /* @__PURE__ */ jsx4(
864
710
  "code",
865
711
  {
866
712
  className: cn(`language-${language} hljs`, textSizes.code),
@@ -875,12 +721,12 @@ var SimpleMarkdownRendererImpl = ({
875
721
  ) }) })
876
722
  ] });
877
723
  }
878
- return /* @__PURE__ */ jsx6("code", { className: "font-mono text-[0.9em] px-1.5 py-0.5 rounded border bg-ods-card text-ods-text-primary border-ods-border", ...props, children });
724
+ return /* @__PURE__ */ jsx4("code", { className: "font-mono text-[0.9em] px-1.5 py-0.5 rounded border bg-ods-card text-ods-text-primary border-ods-border", ...props, children });
879
725
  },
880
726
  // --- div (pass-through, overridable for embeds) ---
881
- div: ({ node, className: divClassName, children, ...props }) => /* @__PURE__ */ jsx6("div", { className: divClassName, ...props, children }),
727
+ div: ({ node, className: divClassName, children, ...props }) => /* @__PURE__ */ jsx4("div", { className: divClassName, ...props, children }),
882
728
  // --- blockquote ---
883
- blockquote: ({ children }) => /* @__PURE__ */ jsx6("blockquote", { className: "border-l-4 border-ods-accent ml-0 pl-6 my-8 py-4 rounded-r-lg bg-ods-bg-secondary", children: /* @__PURE__ */ jsx6("div", { className: cn("font-sans leading-relaxed text-ods-text-secondary", textSizes.blockquote), children }) }),
729
+ blockquote: ({ children }) => /* @__PURE__ */ jsx4("blockquote", { className: "border-l-4 border-ods-accent ml-0 pl-6 my-8 py-4 rounded-r-lg bg-ods-bg-secondary", children: /* @__PURE__ */ jsx4("div", { className: cn("font-sans leading-relaxed text-ods-text-secondary", textSizes.blockquote), children }) }),
884
730
  // --- headings ---
885
731
  h1: makeHeading("h1", 1, cn("font-sans font-bold mt-8 mb-4 first:mt-0 text-ods-text-primary", textSizes.h1)),
886
732
  h2: makeHeading("h2", 2, cn("font-sans font-semibold mt-8 mb-4 pb-2 border-b text-ods-text-primary border-ods-border", textSizes.h2)),
@@ -889,20 +735,20 @@ var SimpleMarkdownRendererImpl = ({
889
735
  h5: makeHeading("h5", 5, cn("font-sans font-semibold mt-3 mb-2 text-ods-text-primary", textSizes.h5)),
890
736
  h6: makeHeading("h6", 6, cn("font-sans font-semibold mt-3 mb-1 text-ods-text-primary", textSizes.h6)),
891
737
  // --- paragraph ---
892
- p: ({ children }) => /* @__PURE__ */ jsx6("p", { className: cn("leading-relaxed mb-4 first:mt-0 last:mb-0 text-ods-text-primary", textSizes.p), children }),
738
+ p: ({ children }) => /* @__PURE__ */ jsx4("p", { className: cn("leading-relaxed mb-4 first:mt-0 last:mb-0 text-ods-text-primary", textSizes.p), children }),
893
739
  // --- links ---
894
740
  a: ({ href, children, className: linkClassName }) => {
895
741
  const isBroken = brokenLinks.includes(href);
896
742
  const isInternalDocLink = propCurrentPath !== void 0 && propCurrentPath !== null && href && !href.startsWith("http") && !href.startsWith("#");
897
743
  if (isBroken) {
898
- return /* @__PURE__ */ jsxs4("span", { className: "text-ods-accent cursor-not-allowed", children: [
744
+ return /* @__PURE__ */ jsxs2("span", { className: "text-ods-accent cursor-not-allowed", children: [
899
745
  children,
900
- /* @__PURE__ */ jsx6("sup", { className: "ml-1 text-xs font-bold text-ods-attention-red-error", children: "[BROKEN]" })
746
+ /* @__PURE__ */ jsx4("sup", { className: "ml-1 text-xs font-bold text-ods-attention-red-error", children: "[BROKEN]" })
901
747
  ] });
902
748
  }
903
749
  if (isInternalDocLink && onInternalLinkClick) {
904
750
  const currentPath = propCurrentPath ?? "";
905
- return /* @__PURE__ */ jsx6(
751
+ return /* @__PURE__ */ jsx4(
906
752
  "span",
907
753
  {
908
754
  className: "text-ods-accent no-underline relative transition-colors duration-200 hover:after:w-full after:content-[''] after:absolute after:w-0 after:h-0.5 after:-bottom-0.5 after:left-0 after:bg-ods-accent after:transition-all after:duration-300 cursor-pointer",
@@ -937,7 +783,7 @@ var SimpleMarkdownRendererImpl = ({
937
783
  }
938
784
  );
939
785
  }
940
- return /* @__PURE__ */ jsx6(
786
+ return /* @__PURE__ */ jsx4(
941
787
  "a",
942
788
  {
943
789
  href,
@@ -998,7 +844,7 @@ var SimpleMarkdownRendererImpl = ({
998
844
  // (cached re-renders pop in without a perceptible shift).
999
845
  img: ({ src, alt }) => {
1000
846
  if (!src || typeof src !== "string" || src.trim() === "") return null;
1001
- return /* @__PURE__ */ jsx6(
847
+ return /* @__PURE__ */ jsx4(
1002
848
  next_image_default,
1003
849
  {
1004
850
  src,
@@ -1012,22 +858,22 @@ var SimpleMarkdownRendererImpl = ({
1012
858
  );
1013
859
  },
1014
860
  // --- lists ---
1015
- ul: ({ children }) => /* @__PURE__ */ jsx6("ul", { className: "list-disc list-outside my-4 ml-8 space-y-2 text-ods-text-primary", children }),
1016
- ol: ({ children }) => /* @__PURE__ */ jsx6("ol", { className: "list-decimal list-outside my-4 ml-8 space-y-2 text-ods-text-primary", children }),
1017
- li: ({ children }) => /* @__PURE__ */ jsx6("li", { className: cn("leading-relaxed pl-2", textSizes.li), children }),
861
+ ul: ({ children }) => /* @__PURE__ */ jsx4("ul", { className: "list-disc list-outside my-4 ml-8 space-y-2 text-ods-text-primary", children }),
862
+ ol: ({ children }) => /* @__PURE__ */ jsx4("ol", { className: "list-decimal list-outside my-4 ml-8 space-y-2 text-ods-text-primary", children }),
863
+ li: ({ children }) => /* @__PURE__ */ jsx4("li", { className: cn("leading-relaxed pl-2", textSizes.li), children }),
1018
864
  // --- tables ---
1019
- table: ({ children }) => /* @__PURE__ */ jsx6("div", { className: "table-container my-6 overflow-x-auto", children: /* @__PURE__ */ jsx6("div", { className: "min-w-full border rounded-lg border-ods-border bg-ods-card", children: /* @__PURE__ */ jsx6("table", { className: "w-full table-fixed md:table-auto", children }) }) }),
1020
- thead: ({ children }) => /* @__PURE__ */ jsx6("thead", { className: "bg-ods-bg-secondary", children }),
1021
- th: ({ children }) => /* @__PURE__ */ jsx6("th", { className: cn("px-2 md:px-4 py-3 text-left font-semibold text-ods-accent border-r last:border-r-0 break-words border-ods-border", textSizes.th), children }),
1022
- td: ({ children }) => /* @__PURE__ */ jsx6("td", { className: cn("px-2 md:px-4 py-3 border-r last:border-r-0 border-b break-words whitespace-normal text-ods-text-primary border-ods-border", textSizes.td), children }),
865
+ table: ({ children }) => /* @__PURE__ */ jsx4("div", { className: "table-container my-6 overflow-x-auto", children: /* @__PURE__ */ jsx4("div", { className: "min-w-full border rounded-lg border-ods-border bg-ods-card", children: /* @__PURE__ */ jsx4("table", { className: "w-full table-fixed md:table-auto", children }) }) }),
866
+ thead: ({ children }) => /* @__PURE__ */ jsx4("thead", { className: "bg-ods-bg-secondary", children }),
867
+ th: ({ children }) => /* @__PURE__ */ jsx4("th", { className: cn("px-2 md:px-4 py-3 text-left font-semibold text-ods-accent border-r last:border-r-0 break-words border-ods-border", textSizes.th), children }),
868
+ td: ({ children }) => /* @__PURE__ */ jsx4("td", { className: cn("px-2 md:px-4 py-3 border-r last:border-r-0 border-b break-words whitespace-normal text-ods-text-primary border-ods-border", textSizes.td), children }),
1023
869
  // --- horizontal rule ---
1024
- hr: () => /* @__PURE__ */ jsx6("hr", { className: "border-0 border-t my-8 border-ods-border" }),
870
+ hr: () => /* @__PURE__ */ jsx4("hr", { className: "border-0 border-t my-8 border-ods-border" }),
1025
871
  // --- merge overrides ---
1026
872
  ...componentOverrides
1027
873
  }), [makeHeading, brokenLinks, propCurrentPath, onInternalLinkClick, onResolveLink, componentOverrides, textSizes]);
1028
- return /* @__PURE__ */ jsxs4("div", { className: `simple-markdown-renderer ${className}`, children: [
1029
- /* @__PURE__ */ jsx6("style", { dangerouslySetInnerHTML: { __html: mermaidStyles } }),
1030
- /* @__PURE__ */ jsx6("div", { className: "content-wrapper max-w-none break-words", children: /* @__PURE__ */ jsx6("article", { className: "prose prose-lg max-w-none", children: /* @__PURE__ */ jsx6(
874
+ return /* @__PURE__ */ jsxs2("div", { className: `simple-markdown-renderer ${className}`, children: [
875
+ /* @__PURE__ */ jsx4("style", { dangerouslySetInnerHTML: { __html: mermaidStyles } }),
876
+ /* @__PURE__ */ jsx4("div", { className: "content-wrapper max-w-none break-words", children: /* @__PURE__ */ jsx4("article", { className: "prose prose-lg max-w-none", children: /* @__PURE__ */ jsx4(
1031
877
  ReactMarkdown,
1032
878
  {
1033
879
  remarkPlugins: [remarkGfm, remarkBreaks, ...additionalRemarkPlugins ?? []],
@@ -1051,312 +897,10 @@ var SimpleMarkdownRendererImpl = ({
1051
897
  };
1052
898
  var SimpleMarkdownRenderer = memo(SimpleMarkdownRendererImpl);
1053
899
 
1054
- // src/utils/format.ts
1055
- function formatDate(date, options = {
1056
- year: "numeric",
1057
- month: "long",
1058
- day: "numeric"
1059
- }) {
1060
- const dateObj = typeof date === "string" ? new Date(date) : date;
1061
- if (isNaN(dateObj.getTime())) {
1062
- console.warn("Invalid date provided to formatDate:", date);
1063
- return "Invalid Date";
1064
- }
1065
- return dateObj.toLocaleDateString("en-US", options);
1066
- }
1067
- function formatNumber(num) {
1068
- return num.toLocaleString();
1069
- }
1070
- function formatPrice(price, currency = "USD") {
1071
- return new Intl.NumberFormat("en-US", {
1072
- style: "currency",
1073
- currency
1074
- }).format(price);
1075
- }
1076
- function formatBytes(bytes, decimals = 2) {
1077
- if (bytes === 0) return "0 Bytes";
1078
- const k = 1024;
1079
- const dm = decimals < 0 ? 0 : decimals;
1080
- const sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
1081
- const i = Math.floor(Math.log(bytes) / Math.log(k));
1082
- return Number.parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + " " + sizes[i];
1083
- }
1084
- function formatBytesShort(bytes) {
1085
- if (bytes === 0) return "0 B";
1086
- const k = 1024;
1087
- const sizes = ["B", "KB", "MB", "GB", "TB"];
1088
- const i = Math.floor(Math.log(bytes) / Math.log(k));
1089
- return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
1090
- }
1091
- function formatLargeNumber(num) {
1092
- if (num === 0) return "0";
1093
- const isNegative = num < 0;
1094
- const absNum = Math.abs(num);
1095
- let result;
1096
- if (absNum >= 1e9) {
1097
- result = `${Math.floor(absNum / 1e9)}B`;
1098
- } else if (absNum >= 1e6) {
1099
- result = `${Math.floor(absNum / 1e6)}M`;
1100
- } else if (absNum >= 1e3) {
1101
- result = `${Math.floor(absNum / 1e3)}K`;
1102
- } else {
1103
- result = Math.floor(absNum).toString();
1104
- }
1105
- return isNegative ? `-${result}` : result;
1106
- }
1107
- function formatAbbreviatedNumber(n) {
1108
- if (n >= 1e9) {
1109
- const value = n / 1e9;
1110
- return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}B`;
1111
- }
1112
- if (n >= 1e6) {
1113
- const value = n / 1e6;
1114
- return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}M`;
1115
- }
1116
- if (n >= 1e3) {
1117
- const value = n / 1e3;
1118
- return `${Number.isInteger(value) ? value.toFixed(0) : value.toFixed(1)}K`;
1119
- }
1120
- return n.toLocaleString();
1121
- }
1122
- function getFirstLastInitials(name) {
1123
- if (!name) return "";
1124
- const words = name.trim().split(/\s+/);
1125
- if (words.length === 0 || !words[0]) return "";
1126
- if (words.length === 1) return words[0].charAt(0).toUpperCase();
1127
- return (words[0].charAt(0) + words[words.length - 1].charAt(0)).toUpperCase();
1128
- }
1129
- function nameInitials(name, fallback = "E") {
1130
- const source = typeof name === "string" ? name.trim() : "";
1131
- const words = source.length > 0 ? source.split(/\s+/) : [];
1132
- const letters = words.map((w) => w[0]).filter(Boolean).slice(0, 2).join("");
1133
- return (letters || fallback).toUpperCase();
1134
- }
1135
- function formatDurationMMSS(seconds) {
1136
- if (!seconds) return "";
1137
- const hours = Math.floor(seconds / 3600);
1138
- const minutes = Math.floor(seconds % 3600 / 60);
1139
- const secs = Math.floor(seconds % 60);
1140
- if (hours > 0) {
1141
- return `${hours}:${minutes.toString().padStart(2, "0")}:${secs.toString().padStart(2, "0")}`;
1142
- }
1143
- return `${minutes}:${secs.toString().padStart(2, "0")}`;
1144
- }
1145
- function formatDurationCompact(seconds) {
1146
- if (!seconds) return "";
1147
- const hours = Math.floor(seconds / 3600);
1148
- const minutes = Math.floor(seconds % 3600 / 60);
1149
- if (hours > 0) {
1150
- return `${hours}h ${minutes}m`;
1151
- }
1152
- return `${minutes} min`;
1153
- }
1154
- function formatTimeWithTimezone(date, timezone) {
1155
- if (!date) return "";
1156
- const dateObj = typeof date === "string" ? new Date(date) : date;
1157
- const timeStr = dateObj.toLocaleTimeString("en-US", {
1158
- hour: "numeric",
1159
- minute: "2-digit",
1160
- hour12: true
1161
- });
1162
- return timezone ? `${timeStr} ${timezone}` : timeStr;
1163
- }
1164
- function formatDurationFromRange(startAt, endAt) {
1165
- if (!startAt || !endAt) return "";
1166
- const start = typeof startAt === "string" ? new Date(startAt) : startAt;
1167
- const end = typeof endAt === "string" ? new Date(endAt) : endAt;
1168
- const durationMs = end.getTime() - start.getTime();
1169
- const minutes = Math.round(durationMs / 6e4);
1170
- if (minutes >= 60) {
1171
- const hours = Math.floor(minutes / 60);
1172
- const mins = minutes % 60;
1173
- return mins > 0 ? `${hours}h ${mins}m` : `${hours}h`;
1174
- }
1175
- return `${minutes}m`;
1176
- }
1177
- function formatDateUTC(value, options = {}) {
1178
- const { fallback = "N/A", timezone = "UTC" } = options;
1179
- if (value === null || value === void 0 || value === "") return fallback;
1180
- let ms;
1181
- if (typeof value === "number") {
1182
- ms = value;
1183
- } else {
1184
- const n = Number(value);
1185
- if (Number.isFinite(n) && n > 0 && /^-?\d+(\.\d+)?$/.test(value.trim())) {
1186
- ms = n;
1187
- } else {
1188
- ms = Date.parse(value.includes("T") ? value : value + "T00:00:00Z");
1189
- }
1190
- }
1191
- if (!Number.isFinite(ms)) return fallback;
1192
- return new Date(ms).toLocaleDateString("en-US", {
1193
- year: "numeric",
1194
- month: "short",
1195
- day: "numeric",
1196
- timeZone: timezone === "local" ? void 0 : "UTC"
1197
- });
1198
- }
1199
- function formatEntryMonthUTC(entryMonth, style = "short") {
1200
- if (!entryMonth) return null;
1201
- return new Date(entryMonth).toLocaleDateString("en-US", { month: style, year: "numeric", timeZone: "UTC" });
1202
- }
1203
- function formatLegalDate(dateInput) {
1204
- return new Intl.DateTimeFormat("en-US", {
1205
- year: "numeric",
1206
- month: "2-digit",
1207
- day: "2-digit"
1208
- }).format(new Date(dateInput));
1209
- }
1210
- function formatCurrency(value) {
1211
- if (value == null) return "N/A";
1212
- return new Intl.NumberFormat("en-US", {
1213
- style: "currency",
1214
- currency: "USD",
1215
- maximumFractionDigits: 0
1216
- }).format(value);
1217
- }
1218
- function formatPercent(value) {
1219
- if (value == null) return "N/A";
1220
- return `${value.toFixed(2)}%`;
1221
- }
1222
- function formatWholeDollars(price, currency = "USD") {
1223
- return new Intl.NumberFormat("en-US", {
1224
- style: "currency",
1225
- currency,
1226
- maximumFractionDigits: 0
1227
- }).format(price);
1228
- }
1229
- function formatCompactMetric(value, format = "number", options) {
1230
- if (value === 0 || value === null || value === void 0) {
1231
- if (format === "currency") return `${options?.prefix || "$"}0`;
1232
- if (format === "percentage") return "0%";
1233
- if (format === "months") return `0 ${options?.suffix || "months"}`;
1234
- return "0";
1235
- }
1236
- const absValue = Math.abs(value);
1237
- const sign = value < 0 ? "-" : "";
1238
- if (format === "currency") {
1239
- const prefix = options?.prefix || "$";
1240
- const compact = (val, divisor, suffix) => {
1241
- const divided = val / divisor;
1242
- const formatted = divided % 1 === 0 ? divided.toFixed(0) : divided.toFixed(1);
1243
- return `${sign}${prefix}${formatted}${suffix}`;
1244
- };
1245
- if (absValue >= 1e9) return compact(absValue, 1e9, "B");
1246
- if (absValue >= 1e6) return compact(absValue, 1e6, "M");
1247
- if (absValue >= 1e3) return `${sign}${prefix}${(absValue / 1e3).toFixed(0)}K`;
1248
- return `${sign}${prefix}${absValue.toLocaleString()}`;
1249
- }
1250
- if (format === "percentage") {
1251
- return `${sign}${absValue}%`;
1252
- }
1253
- if (format === "months") {
1254
- const rounded = Math.round(value * 10) / 10;
1255
- return `${rounded} ${options?.suffix || "months"}`;
1256
- }
1257
- if (absValue >= 1e6) return `${sign}${(absValue / 1e6).toFixed(1)}M`;
1258
- if (absValue >= 1e3) return `${sign}${(absValue / 1e3).toFixed(1)}K`;
1259
- return value.toLocaleString();
1260
- }
1261
- function getTrendColors(direction, polarity = "positive") {
1262
- if (direction === "neutral" || polarity === "neutral") {
1263
- return {
1264
- textClass: "text-ods-text-secondary",
1265
- badgeClass: "bg-ods-border text-ods-text-secondary"
1266
- };
1267
- }
1268
- const isPositiveOutcome = direction === "up" && polarity === "positive" || direction === "down" && polarity === "negative";
1269
- if (isPositiveOutcome) {
1270
- return {
1271
- textClass: "text-ods-success",
1272
- badgeClass: "bg-ods-success-secondary text-ods-success"
1273
- };
1274
- }
1275
- return {
1276
- textClass: "text-ods-error",
1277
- badgeClass: "bg-ods-error-secondary text-ods-error"
1278
- };
1279
- }
1280
- function formatDateRange(start, end) {
1281
- if (!start || !end) return "";
1282
- const fmt = (s) => {
1283
- const bareMatch = /^(\d{4})-(\d{2})-(\d{2})$/.exec(s);
1284
- const d = bareMatch ? new Date(Number(bareMatch[1]), Number(bareMatch[2]) - 1, Number(bareMatch[3])) : new Date(s);
1285
- if (Number.isNaN(d.getTime())) return s;
1286
- return d.toLocaleDateString(void 0, {
1287
- month: "short",
1288
- day: "numeric",
1289
- year: "numeric"
1290
- });
1291
- };
1292
- return `${fmt(start)} \u2014 ${fmt(end)}`;
1293
- }
1294
- function formatDateTimeAt(dateString) {
1295
- const date = new Date(dateString);
1296
- const dateStr = date.toLocaleDateString("en-US", {
1297
- month: "short",
1298
- day: "numeric",
1299
- year: "numeric"
1300
- });
1301
- const timeStr = date.toLocaleTimeString("en-US", {
1302
- hour: "numeric",
1303
- minute: "2-digit",
1304
- hour12: true
1305
- });
1306
- return `${dateStr} at ${timeStr}`;
1307
- }
1308
- function formatDurationFromMs(ms) {
1309
- if (!ms || isNaN(ms) || ms < 0) return "0ms";
1310
- if (ms < 1e3) return `${ms}ms`;
1311
- if (ms < 6e4) return `${(ms / 1e3).toFixed(1)}s`;
1312
- return `${(ms / 6e4).toFixed(1)}m`;
1313
- }
1314
- function formatDuration(seconds) {
1315
- if (seconds < 60) return `${seconds} seconds`;
1316
- if (seconds < 3600) return `${Math.floor(seconds / 60)} minutes`;
1317
- const hours = Math.floor(seconds / 3600);
1318
- const minutes = Math.floor(seconds % 3600 / 60);
1319
- if (minutes === 0) return `${hours} hour${hours > 1 ? "s" : ""}`;
1320
- return `${hours} hour${hours > 1 ? "s" : ""} ${minutes} minute${minutes > 1 ? "s" : ""}`;
1321
- }
1322
- function formatUnderscoreText(text) {
1323
- return text.split("_").map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()).join(" ");
1324
- }
1325
- function stripHtml(html) {
1326
- let noTags = html;
1327
- let prev;
1328
- do {
1329
- prev = noTags;
1330
- noTags = noTags.replace(/<[^<>]*>/g, "");
1331
- } while (noTags !== prev);
1332
- return noTags.replace(/&nbsp;/g, " ").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&#x27;/g, "'").replace(/&apos;/g, "'").replace(/&amp;/g, "&").replace(/\s+/g, " ").trim();
1333
- }
1334
- function formatClassification(classification) {
1335
- const customMappings = {
1336
- openframe_selected: "OpenFrame Selected"
1337
- };
1338
- return customMappings[classification] || formatUnderscoreText(classification);
1339
- }
1340
- function formatPricingModel(pricingModel) {
1341
- const customMappings = {
1342
- one_time: "One-time Purchase",
1343
- self_hosted: "Self-hosted"
1344
- };
1345
- return customMappings[pricingModel] || formatUnderscoreText(pricingModel);
1346
- }
1347
- function formatBioText(aboutHtml, fallback = "") {
1348
- if (!aboutHtml || !aboutHtml.trim()) return fallback;
1349
- if (aboutHtml.includes("<p")) {
1350
- const paragraphs = aboutHtml.split(/<p[^<>]*>/).slice(1).map((part) => part.split("</p>")[0]).map((text) => stripHtml(text).trim()).filter((text) => text.length > 0);
1351
- if (paragraphs.length > 0) return paragraphs.join(" ");
1352
- }
1353
- return stripHtml(aboutHtml).trim() || fallback;
1354
- }
1355
-
1356
900
  // src/components/ui/square-avatar.tsx
1357
901
  import * as React4 from "react";
1358
902
  init_cn();
1359
- import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
903
+ import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
1360
904
  var SquareAvatar = React4.memo(React4.forwardRef(
1361
905
  ({ className, src, alt, size = "md", fallback, variant = "square", initialsClassName, ...props }, ref) => {
1362
906
  const sizeClasses = {
@@ -1375,7 +919,7 @@ var SquareAvatar = React4.memo(React4.forwardRef(
1375
919
  square: "rounded-md",
1376
920
  round: "rounded-full"
1377
921
  };
1378
- return /* @__PURE__ */ jsxs5(
922
+ return /* @__PURE__ */ jsxs3(
1379
923
  "div",
1380
924
  {
1381
925
  className: cn(
@@ -1387,7 +931,7 @@ var SquareAvatar = React4.memo(React4.forwardRef(
1387
931
  ref,
1388
932
  ...props,
1389
933
  children: [
1390
- /* @__PURE__ */ jsx7("div", { className: cn(
934
+ /* @__PURE__ */ jsx5("div", { className: cn(
1391
935
  // Initials default to `--color-text-primary` (the old
1392
936
  // `text-ods-text-primary` value) so they stay readable on the default
1393
937
  // `bg-ods-bg` AND on the brand accent fills (`bg-ods-flamingo-pink`
@@ -1402,7 +946,7 @@ var SquareAvatar = React4.memo(React4.forwardRef(
1402
946
  initialsClassName,
1403
947
  src && "hidden"
1404
948
  ), children: getFirstLastInitials(fallback || alt) || "?" }),
1405
- src && /* @__PURE__ */ jsx7(
949
+ src && /* @__PURE__ */ jsx5(
1406
950
  next_image_default,
1407
951
  {
1408
952
  className: "absolute inset-0 h-full w-full object-cover",
@@ -1508,7 +1052,7 @@ import { Check } from "lucide-react";
1508
1052
  import React7, { useCallback as useCallback3 } from "react";
1509
1053
  init_cn();
1510
1054
  init_button();
1511
- import { Fragment, jsx as jsx8, jsxs as jsxs6 } from "react/jsx-runtime";
1055
+ import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
1512
1056
  var ROW_CLASSES = "flex flex-1 min-w-0 items-center gap-[var(--spacing-system-xsf)] p-[var(--spacing-system-s)] cursor-pointer transition-colors bg-ods-bg outline-none";
1513
1057
  var WRAPPER_CLASSES = "relative flex items-stretch border-b border-ods-border last:border-b-0";
1514
1058
  var SECONDARY_ACTION_CLASSES = "flex p-[var(--spacing-system-s)] shrink-0 items-center justify-center self-stretch border-l border-ods-border transition-colors hover:bg-ods-bg-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ods-focus [&_svg]:w-4 [&_svg]:h-4 md:[&_svg]:w-6 md:[&_svg]:h-6";
@@ -1529,7 +1073,7 @@ var SecondaryAction = ({ action }) => {
1529
1073
  action.disabled && "cursor-not-allowed opacity-60 pointer-events-none"
1530
1074
  );
1531
1075
  if (action.href) {
1532
- return /* @__PURE__ */ jsx8(
1076
+ return /* @__PURE__ */ jsx6(
1533
1077
  next_link_default,
1534
1078
  {
1535
1079
  href: action.href,
@@ -1545,7 +1089,7 @@ var SecondaryAction = ({ action }) => {
1545
1089
  }
1546
1090
  );
1547
1091
  }
1548
- return /* @__PURE__ */ jsx8(
1092
+ return /* @__PURE__ */ jsx6(
1549
1093
  "button",
1550
1094
  {
1551
1095
  type: "button",
@@ -1599,7 +1143,7 @@ var MenuItem = ({ item, onItemClick }) => {
1599
1143
  [item, onItemClick]
1600
1144
  );
1601
1145
  if (item.type === "separator") {
1602
- return /* @__PURE__ */ jsx8("div", { className: "bg-ods-system-greys-soft-grey h-1 w-full" });
1146
+ return /* @__PURE__ */ jsx6("div", { className: "bg-ods-system-greys-soft-grey h-1 w-full" });
1603
1147
  }
1604
1148
  const itemClasses = cn(
1605
1149
  ROW_CLASSES,
@@ -1610,8 +1154,8 @@ var MenuItem = ({ item, onItemClick }) => {
1610
1154
  "data-[state=open]:bg-ods-bg-active focus:bg-ods-bg-hover"
1611
1155
  );
1612
1156
  const renderAsLink = !!item.href && item.type !== "submenu" && item.type !== "checkbox";
1613
- const rowContent = /* @__PURE__ */ jsxs6(Fragment, { children: [
1614
- item.icon && /* @__PURE__ */ jsx8(
1157
+ const rowContent = /* @__PURE__ */ jsxs4(Fragment, { children: [
1158
+ item.icon && /* @__PURE__ */ jsx6(
1615
1159
  "div",
1616
1160
  {
1617
1161
  className: cn(
@@ -1622,7 +1166,7 @@ var MenuItem = ({ item, onItemClick }) => {
1622
1166
  children: item.icon
1623
1167
  }
1624
1168
  ),
1625
- /* @__PURE__ */ jsx8(
1169
+ /* @__PURE__ */ jsx6(
1626
1170
  "span",
1627
1171
  {
1628
1172
  className: cn(
@@ -1632,21 +1176,21 @@ var MenuItem = ({ item, onItemClick }) => {
1632
1176
  children: item.label
1633
1177
  }
1634
1178
  ),
1635
- item.type === "checkbox" && /* @__PURE__ */ jsx8(
1179
+ item.type === "checkbox" && /* @__PURE__ */ jsx6(
1636
1180
  "div",
1637
1181
  {
1638
1182
  className: cn(
1639
1183
  "w-4 h-4 md:w-6 md:h-6 flex items-center justify-center rounded-md transition-colors",
1640
1184
  item.checked ? "bg-ods-accent" : "border-2 border-ods-border bg-transparent"
1641
1185
  ),
1642
- children: item.checked && /* @__PURE__ */ jsx8(Check, { className: "w-3 h-3 md:w-4 md:h-4 text-ods-text-on-accent", strokeWidth: 3 })
1186
+ children: item.checked && /* @__PURE__ */ jsx6(Check, { className: "w-3 h-3 md:w-4 md:h-4 text-ods-text-on-accent", strokeWidth: 3 })
1643
1187
  }
1644
1188
  ),
1645
- item.type === "submenu" && /* @__PURE__ */ jsx8(Chevron02RightIcon, { className: "w-4 h-4 md:w-6 md:h-6 text-ods-text-secondary" })
1189
+ item.type === "submenu" && /* @__PURE__ */ jsx6(Chevron02RightIcon, { className: "w-4 h-4 md:w-6 md:h-6 text-ods-text-secondary" })
1646
1190
  ] });
1647
1191
  if (renderAsLink && item.href) {
1648
- return /* @__PURE__ */ jsxs6("div", { className: WRAPPER_CLASSES, children: [
1649
- /* @__PURE__ */ jsx8(
1192
+ return /* @__PURE__ */ jsxs4("div", { className: WRAPPER_CLASSES, children: [
1193
+ /* @__PURE__ */ jsx6(
1650
1194
  next_link_default,
1651
1195
  {
1652
1196
  href: item.href,
@@ -1658,13 +1202,13 @@ var MenuItem = ({ item, onItemClick }) => {
1658
1202
  children: rowContent
1659
1203
  }
1660
1204
  ),
1661
- item.iconAction && /* @__PURE__ */ jsx8(SecondaryAction, { action: item.iconAction })
1205
+ item.iconAction && /* @__PURE__ */ jsx6(SecondaryAction, { action: item.iconAction })
1662
1206
  ] });
1663
1207
  }
1664
1208
  if (item.type === "submenu" && item.submenu) {
1665
- return /* @__PURE__ */ jsxs6("div", { className: WRAPPER_CLASSES, children: [
1666
- /* @__PURE__ */ jsxs6(DropdownMenuPrimitive.Sub, { children: [
1667
- /* @__PURE__ */ jsx8(
1209
+ return /* @__PURE__ */ jsxs4("div", { className: WRAPPER_CLASSES, children: [
1210
+ /* @__PURE__ */ jsxs4(DropdownMenuPrimitive.Sub, { children: [
1211
+ /* @__PURE__ */ jsx6(
1668
1212
  DropdownMenuPrimitive.SubTrigger,
1669
1213
  {
1670
1214
  disabled: item.disabled,
@@ -1672,12 +1216,12 @@ var MenuItem = ({ item, onItemClick }) => {
1672
1216
  children: rowContent
1673
1217
  }
1674
1218
  ),
1675
- /* @__PURE__ */ jsx8(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx8(
1219
+ /* @__PURE__ */ jsx6(DropdownMenuPrimitive.Portal, { children: /* @__PURE__ */ jsx6(
1676
1220
  DropdownMenuPrimitive.SubContent,
1677
1221
  {
1678
1222
  sideOffset: 4,
1679
1223
  className: "z-[1500] min-w-[256px] max-h-[var(--radix-popper-available-height)] bg-ods-bg border border-ods-border rounded-md shadow-xl overflow-y-auto p-0",
1680
- children: item.submenu.map((subItem, index) => /* @__PURE__ */ jsx8(
1224
+ children: item.submenu.map((subItem, index) => /* @__PURE__ */ jsx6(
1681
1225
  MenuItem,
1682
1226
  {
1683
1227
  item: subItem,
@@ -1688,11 +1232,11 @@ var MenuItem = ({ item, onItemClick }) => {
1688
1232
  }
1689
1233
  ) })
1690
1234
  ] }),
1691
- item.iconAction && /* @__PURE__ */ jsx8(SecondaryAction, { action: item.iconAction })
1235
+ item.iconAction && /* @__PURE__ */ jsx6(SecondaryAction, { action: item.iconAction })
1692
1236
  ] });
1693
1237
  }
1694
- return /* @__PURE__ */ jsxs6("div", { className: WRAPPER_CLASSES, children: [
1695
- /* @__PURE__ */ jsx8(
1238
+ return /* @__PURE__ */ jsxs4("div", { className: WRAPPER_CLASSES, children: [
1239
+ /* @__PURE__ */ jsx6(
1696
1240
  "div",
1697
1241
  {
1698
1242
  role: "menuitem",
@@ -1704,23 +1248,23 @@ var MenuItem = ({ item, onItemClick }) => {
1704
1248
  children: rowContent
1705
1249
  }
1706
1250
  ),
1707
- item.iconAction && /* @__PURE__ */ jsx8(SecondaryAction, { action: item.iconAction })
1251
+ item.iconAction && /* @__PURE__ */ jsx6(SecondaryAction, { action: item.iconAction })
1708
1252
  ] });
1709
1253
  };
1710
- var GroupSeparator = () => /* @__PURE__ */ jsx8("div", { className: "bg-ods-bg-surface h-[3px] w-full" });
1254
+ var GroupSeparator = () => /* @__PURE__ */ jsx6("div", { className: "bg-ods-bg-surface h-[3px] w-full" });
1711
1255
  var ActionsMenu = ({
1712
1256
  groups,
1713
1257
  className = "",
1714
1258
  onItemClick
1715
1259
  }) => {
1716
- return /* @__PURE__ */ jsx8(
1260
+ return /* @__PURE__ */ jsx6(
1717
1261
  "div",
1718
1262
  {
1719
1263
  className: `relative min-w-[256px] max-h-[var(--radix-popper-available-height)] bg-ods-bg border border-ods-border rounded-md shadow-lg overflow-y-auto ${className}`,
1720
1264
  children: groups.map((group, groupIndex) => {
1721
1265
  const groupKey = group.id || group.items.map((i) => i.id).join("|");
1722
- return /* @__PURE__ */ jsxs6(React7.Fragment, { children: [
1723
- group.items.map((item, itemIndex) => /* @__PURE__ */ jsx8(
1266
+ return /* @__PURE__ */ jsxs4(React7.Fragment, { children: [
1267
+ group.items.map((item, itemIndex) => /* @__PURE__ */ jsx6(
1724
1268
  MenuItem,
1725
1269
  {
1726
1270
  item,
@@ -1728,7 +1272,7 @@ var ActionsMenu = ({
1728
1272
  },
1729
1273
  item.id || `${groupKey}-${itemIndex}`
1730
1274
  )),
1731
- group.separator && groupIndex < groups.length - 1 && /* @__PURE__ */ jsx8(GroupSeparator, {})
1275
+ group.separator && groupIndex < groups.length - 1 && /* @__PURE__ */ jsx6(GroupSeparator, {})
1732
1276
  ] }, groupKey);
1733
1277
  })
1734
1278
  }
@@ -1764,18 +1308,18 @@ var ActionsMenuDropdown = ({
1764
1308
  },
1765
1309
  [onItemClick, setOpen]
1766
1310
  );
1767
- return /* @__PURE__ */ jsxs6(DropdownMenu, { open, onOpenChange: setOpen, modal: false, children: [
1768
- /* @__PURE__ */ jsx8(DropdownMenuTrigger, { asChild: true, children: customTrigger ?? /* @__PURE__ */ jsx8(
1311
+ return /* @__PURE__ */ jsxs4(DropdownMenu, { open, onOpenChange: setOpen, modal: false, children: [
1312
+ /* @__PURE__ */ jsx6(DropdownMenuTrigger, { asChild: true, children: customTrigger ?? /* @__PURE__ */ jsx6(
1769
1313
  Button,
1770
1314
  {
1771
1315
  variant: "outline",
1772
1316
  size: "icon",
1773
1317
  "aria-label": triggerAriaLabel,
1774
1318
  className: triggerClassName || "bg-ods-card border-ods-border hover:bg-ods-bg-hover flex items-center justify-center focus-visible:ring-0",
1775
- leftIcon: trigger ?? /* @__PURE__ */ jsx8(Ellipsis01Icon, { size: 24, className: "text-ods-text-primary" })
1319
+ leftIcon: trigger ?? /* @__PURE__ */ jsx6(Ellipsis01Icon, { size: 24, className: "text-ods-text-primary" })
1776
1320
  }
1777
1321
  ) }),
1778
- /* @__PURE__ */ jsx8(
1322
+ /* @__PURE__ */ jsx6(
1779
1323
  DropdownMenuContent,
1780
1324
  {
1781
1325
  align,
@@ -1786,7 +1330,7 @@ var ActionsMenuDropdown = ({
1786
1330
  "p-0 border-0 bg-transparent shadow-none overflow-visible",
1787
1331
  contentClassName
1788
1332
  ),
1789
- children: /* @__PURE__ */ jsx8(
1333
+ children: /* @__PURE__ */ jsx6(
1790
1334
  ActionsMenu,
1791
1335
  {
1792
1336
  groups,
@@ -1799,69 +1343,6 @@ var ActionsMenuDropdown = ({
1799
1343
  ] });
1800
1344
  };
1801
1345
 
1802
- // src/utils/image-proxy.ts
1803
- function getProxiedImageUrl(imageUrl, options) {
1804
- if (!imageUrl) return null;
1805
- const proxyPrefix = options?.proxyPrefix;
1806
- const skipDomains = options?.skipDomains ?? [];
1807
- const directHttps = options?.directHttps ?? false;
1808
- if (proxyPrefix && imageUrl.includes(proxyPrefix)) {
1809
- return imageUrl;
1810
- }
1811
- if (!imageUrl.startsWith("http://") && !imageUrl.startsWith("https://")) {
1812
- return imageUrl;
1813
- }
1814
- if (directHttps && imageUrl.startsWith("https://")) {
1815
- return imageUrl;
1816
- }
1817
- if (!proxyPrefix) {
1818
- return imageUrl;
1819
- }
1820
- for (const domain of skipDomains) {
1821
- if (imageUrl.includes(domain)) {
1822
- return imageUrl;
1823
- }
1824
- }
1825
- return `${proxyPrefix}?url=${encodeURIComponent(imageUrl)}`;
1826
- }
1827
- function urlPathLooksLikeSvg(imageUrl) {
1828
- try {
1829
- return /\.svg$/i.test(new URL(imageUrl).pathname);
1830
- } catch {
1831
- return /\.svg(\?|#|$)/i.test(imageUrl);
1832
- }
1833
- }
1834
- function shouldProxyImage(imageUrl, proxyPrefix) {
1835
- if (!imageUrl) return false;
1836
- if (!imageUrl.startsWith("http://") && !imageUrl.startsWith("https://")) return false;
1837
- if (proxyPrefix && imageUrl.includes(proxyPrefix)) return false;
1838
- return true;
1839
- }
1840
- function generateImageSizes(_url) {
1841
- return `(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw`;
1842
- }
1843
-
1844
- // src/components/chat/utils/is-cross-origin-url.ts
1845
- function isCrossOriginUrl(url) {
1846
- if (!url) return false;
1847
- if (url.startsWith("/") && !url.startsWith("//")) return false;
1848
- return true;
1849
- }
1850
-
1851
- // src/components/chat/utils/decide-new-tab.ts
1852
- function decideNewTab(input) {
1853
- const { href, targetPlatform, openIn, alwaysNewTab, runtimeMode, currentSource } = input;
1854
- if (runtimeMode === "embed") return true;
1855
- if (openIn === "new-tab") return true;
1856
- if (alwaysNewTab === true) return true;
1857
- if (openIn === "same-tab") return false;
1858
- if (targetPlatform !== void 0 && targetPlatform !== null && currentSource) {
1859
- return targetPlatform !== currentSource;
1860
- }
1861
- if (!href) return false;
1862
- return isCrossOriginUrl(href);
1863
- }
1864
-
1865
1346
  // src/components/chat/utils/nav-anchor-props.ts
1866
1347
  function computeIsNewTab(runtime, href, targetPlatform) {
1867
1348
  if (!href) return false;
@@ -1879,56 +1360,9 @@ function buildAnchorProps(href, isNewTab) {
1879
1360
  return href ? { href, ...newTabAnchorAttrs(isNewTab) } : void 0;
1880
1361
  }
1881
1362
 
1882
- // src/components/chat/utils/chat-nav-resolution.ts
1883
- var NEW_TAB_FEATURES = "noopener,noreferrer";
1884
- function isModifierClick(e) {
1885
- return e.button !== 0 || !!e.metaKey || !!e.ctrlKey || !!e.shiftKey || !!e.altKey;
1886
- }
1887
- function stripSameOriginToPath(href) {
1888
- if (!href.startsWith("http")) return href;
1889
- try {
1890
- const u = new URL(href);
1891
- return u.pathname + u.search + u.hash;
1892
- } catch {
1893
- return href;
1894
- }
1895
- }
1896
- function resolveHrefForRuntime(href, runtime) {
1897
- if (runtime.navigation.mode !== "embed") return href;
1898
- if (href.startsWith("http")) return href;
1899
- if (href.startsWith("//")) return href;
1900
- const origin = runtime.navigation.defaultContentOrigin;
1901
- if (!origin) return href;
1902
- return origin.replace(/\/+$/, "") + (href.startsWith("/") ? href : "/" + href);
1903
- }
1904
- function resolveExternalNavigation(args) {
1905
- let abs = args.href;
1906
- if (abs.startsWith("//")) abs = window.location.protocol + abs;
1907
- if (!abs.startsWith("http")) {
1908
- if (args.runtime.navigation.defaultContentOrigin) {
1909
- let origin = args.runtime.navigation.defaultContentOrigin;
1910
- while (origin.endsWith("/")) origin = origin.slice(0, -1);
1911
- abs = origin + (abs.startsWith("/") ? abs : "/" + abs);
1912
- } else if (args.runtime.navigation.mode === "embed" && process.env.NODE_ENV !== "production") {
1913
- console.warn(
1914
- "[chat-nav-resolution] relative href in embed mode with no defaultContentOrigin set on runtime.navigation \u2014 link will resolve against the embedder origin.",
1915
- { href: abs, targetPlatform: args.targetPlatform }
1916
- );
1917
- }
1918
- }
1919
- const open = () => {
1920
- if (args.runtime.navigation.openExternal) {
1921
- args.runtime.navigation.openExternal(abs);
1922
- } else {
1923
- window.open(abs, "_blank", NEW_TAB_FEATURES);
1924
- }
1925
- };
1926
- return { href: abs, open };
1927
- }
1928
-
1929
1363
  // src/components/chat/entity-cards/entity-author-card.tsx
1930
1364
  init_next_link();
1931
- import { jsx as jsx9, jsxs as jsxs7 } from "react/jsx-runtime";
1365
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
1932
1366
  var EMPTY_AUTHOR_PLACEHOLDER = {
1933
1367
  full_name: "\u2014",
1934
1368
  avatar_url: null,
@@ -1940,9 +1374,9 @@ function EntityMetadataValueCell({
1940
1374
  className,
1941
1375
  uppercase = true
1942
1376
  }) {
1943
- return /* @__PURE__ */ jsx9("div", { className: `bg-ods-card p-4 flex flex-col gap-3 ${className ?? ""}`, children: /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-0", children: [
1944
- /* @__PURE__ */ jsx9("p", { className: "text-h4 text-ods-text-primary", children: uppercase ? value.toLocaleUpperCase() : value }),
1945
- /* @__PURE__ */ jsx9("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: label })
1377
+ return /* @__PURE__ */ jsx7("div", { className: `bg-ods-card p-4 flex flex-col gap-3 ${className ?? ""}`, children: /* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-0", children: [
1378
+ /* @__PURE__ */ jsx7("p", { className: "text-h4 text-ods-text-primary", children: uppercase ? value.toLocaleUpperCase() : value }),
1379
+ /* @__PURE__ */ jsx7("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: label })
1946
1380
  ] }) });
1947
1381
  }
1948
1382
  function EntityMetadataAuthorCell({
@@ -1953,8 +1387,8 @@ function EntityMetadataAuthorCell({
1953
1387
  }) {
1954
1388
  const trimmedName = typeof author.full_name === "string" ? author.full_name.trim() : "";
1955
1389
  const fullName = trimmedName || "Unknown Author";
1956
- return /* @__PURE__ */ jsxs7("div", { className: `bg-ods-card p-4 flex items-center gap-3 ${className ?? ""}`, children: [
1957
- /* @__PURE__ */ jsx9(
1390
+ return /* @__PURE__ */ jsxs5("div", { className: `bg-ods-card p-4 flex items-center gap-3 ${className ?? ""}`, children: [
1391
+ /* @__PURE__ */ jsx7(
1958
1392
  SquareAvatar,
1959
1393
  {
1960
1394
  src: author.avatar_url || "",
@@ -1964,9 +1398,9 @@ function EntityMetadataAuthorCell({
1964
1398
  variant: "round"
1965
1399
  }
1966
1400
  ),
1967
- /* @__PURE__ */ jsxs7("div", { className: "flex flex-col gap-0 flex-1 min-w-0", children: [
1968
- /* @__PURE__ */ jsx9("p", { className: "text-h3 tracking-[-0.36px] text-ods-text-primary truncate", title: fullName, children: authorHref && trimmedName ? /* @__PURE__ */ jsx9(next_link_default, { href: authorHref, className: "hover:text-ods-accent transition-colors", children: fullName }) : fullName }),
1969
- /* @__PURE__ */ jsx9("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: author.job_title || roleLabel })
1401
+ /* @__PURE__ */ jsxs5("div", { className: "flex flex-col gap-0 flex-1 min-w-0", children: [
1402
+ /* @__PURE__ */ jsx7("p", { className: "text-h3 tracking-[-0.36px] text-ods-text-primary truncate", title: fullName, children: authorHref && trimmedName ? /* @__PURE__ */ jsx7(next_link_default, { href: authorHref, className: "hover:text-ods-accent transition-colors", children: fullName }) : fullName }),
1403
+ /* @__PURE__ */ jsx7("p", { className: "font-['DM_Sans'] font-medium text-[14px] leading-[20px] text-ods-text-secondary", children: author.job_title || roleLabel })
1970
1404
  ] })
1971
1405
  ] });
1972
1406
  }
@@ -1990,12 +1424,12 @@ function EntityAuthorCard({
1990
1424
  const totalCells = extras.length + (showDateCell ? 1 : 0) + 1;
1991
1425
  const gridColsClass = totalCells >= 4 ? "md:grid-cols-4" : totalCells === 3 ? "md:grid-cols-3" : totalCells === 2 ? "md:grid-cols-2" : "md:grid-cols-1";
1992
1426
  const dividerClass = "border-b md:border-b-0 md:border-r border-ods-border";
1993
- return /* @__PURE__ */ jsxs7(
1427
+ return /* @__PURE__ */ jsxs5(
1994
1428
  "div",
1995
1429
  {
1996
1430
  className: `grid grid-cols-1 ${gridColsClass} border border-ods-border rounded-md overflow-hidden w-full ${className ?? ""}`,
1997
1431
  children: [
1998
- extras.map((cell, i) => /* @__PURE__ */ jsx9(
1432
+ extras.map((cell, i) => /* @__PURE__ */ jsx7(
1999
1433
  EntityMetadataValueCell,
2000
1434
  {
2001
1435
  value: cell.value,
@@ -2005,7 +1439,7 @@ function EntityAuthorCard({
2005
1439
  },
2006
1440
  `${cell.label}-${i}`
2007
1441
  )),
2008
- showDateCell && /* @__PURE__ */ jsx9(
1442
+ showDateCell && /* @__PURE__ */ jsx7(
2009
1443
  EntityMetadataValueCell,
2010
1444
  {
2011
1445
  value: dateLabel,
@@ -2014,21 +1448,21 @@ function EntityAuthorCard({
2014
1448
  className: dividerClass
2015
1449
  }
2016
1450
  ),
2017
- /* @__PURE__ */ jsx9(EntityMetadataAuthorCell, { author: effectiveAuthor, roleLabel, authorHref })
1451
+ /* @__PURE__ */ jsx7(EntityMetadataAuthorCell, { author: effectiveAuthor, roleLabel, authorHref })
2018
1452
  ]
2019
1453
  }
2020
1454
  );
2021
1455
  }
2022
1456
 
2023
1457
  // src/components/chat/entity-cards/blog-image-placeholder.tsx
2024
- import { jsx as jsx10 } from "react/jsx-runtime";
1458
+ import { jsx as jsx8 } from "react/jsx-runtime";
2025
1459
  function BlogImagePlaceholder({
2026
1460
  imageUrl,
2027
1461
  title,
2028
1462
  className = ""
2029
1463
  }) {
2030
1464
  if (!imageUrl) return null;
2031
- return /* @__PURE__ */ jsx10("span", { className: `relative block w-full h-full overflow-hidden bg-ods-bg ${className}`, children: /* @__PURE__ */ jsx10(
1465
+ return /* @__PURE__ */ jsx8("span", { className: `relative block w-full h-full overflow-hidden bg-ods-bg ${className}`, children: /* @__PURE__ */ jsx8(
2032
1466
  "img",
2033
1467
  {
2034
1468
  src: imageUrl,
@@ -2042,19 +1476,10 @@ function BlogImagePlaceholder({
2042
1476
  ) });
2043
1477
  }
2044
1478
 
2045
- // src/utils/fetch-priority.ts
2046
- import React8 from "react";
2047
- var REACT_MAJOR = parseInt((React8.version || "0").split(".")[0], 10);
2048
- var USE_CAMEL_CASE_FETCH_PRIORITY = REACT_MAJOR >= 19;
2049
- function fetchPriorityProp(priority) {
2050
- const value = priority === void 0 ? "auto" : typeof priority === "boolean" ? priority ? "high" : "low" : priority;
2051
- return USE_CAMEL_CASE_FETCH_PRIORITY ? { fetchPriority: value } : { fetchpriority: value };
2052
- }
2053
-
2054
1479
  // src/components/features/video.tsx
2055
1480
  import { useEffect as useEffect4, useMemo as useMemo3, useRef as useRef4, useState as useState3 } from "react";
2056
1481
  import MuxPlayer from "@mux/mux-player-react";
2057
- import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
1482
+ import { jsx as jsx9, jsxs as jsxs6 } from "react/jsx-runtime";
2058
1483
  if (typeof window !== "undefined") {
2059
1484
  const w = window;
2060
1485
  if (!w.chrome?.cast) {
@@ -2115,7 +1540,7 @@ function Video(props) {
2115
1540
  if (!url) return null;
2116
1541
  const effectiveKind = resolveKind(props, url);
2117
1542
  const layout = props.layout ?? "native";
2118
- const inner = effectiveKind === "youtube" ? /* @__PURE__ */ jsx11(
1543
+ const inner = effectiveKind === "youtube" ? /* @__PURE__ */ jsx9(
2119
1544
  YouTubeFacade,
2120
1545
  {
2121
1546
  url,
@@ -2124,7 +1549,7 @@ function Video(props) {
2124
1549
  className: props.className,
2125
1550
  minimalControls: props.minimalControls
2126
1551
  }
2127
- ) : /* @__PURE__ */ jsx11(
1552
+ ) : /* @__PURE__ */ jsx9(
2128
1553
  FilePlayer,
2129
1554
  {
2130
1555
  url,
@@ -2148,9 +1573,9 @@ function resolveKind(props, url) {
2148
1573
  function wrapWithLayout(inner, layout) {
2149
1574
  switch (layout) {
2150
1575
  case "centered":
2151
- return /* @__PURE__ */ jsx11("div", { className: "flex justify-center w-full", children: /* @__PURE__ */ jsx11("div", { className: "w-full max-w-3xl aspect-video rounded-lg overflow-hidden border border-ods-border", children: inner }) });
1576
+ return /* @__PURE__ */ jsx9("div", { className: "flex justify-center w-full", children: /* @__PURE__ */ jsx9("div", { className: "w-full max-w-3xl aspect-video rounded-lg overflow-hidden border border-ods-border", children: inner }) });
2152
1577
  case "fill":
2153
- return /* @__PURE__ */ jsx11("div", { className: "absolute inset-0 w-full h-full", children: inner });
1578
+ return /* @__PURE__ */ jsx9("div", { className: "absolute inset-0 w-full h-full", children: inner });
2154
1579
  case "native":
2155
1580
  default:
2156
1581
  return inner;
@@ -2169,7 +1594,7 @@ function FilePlayer({
2169
1594
  "[Video] srtContent supplied without captionsUrl \u2014 captions will not render. Pass captionsUrl (the VTT URL) instead; raw SRT text overlays are no longer supported."
2170
1595
  );
2171
1596
  }
2172
- return /* @__PURE__ */ jsx11(
1597
+ return /* @__PURE__ */ jsx9(
2173
1598
  MuxPlayer,
2174
1599
  {
2175
1600
  src: url,
@@ -2181,7 +1606,7 @@ function FilePlayer({
2181
1606
  accentColor: "var(--ods-accent, var(--color-accent-primary))",
2182
1607
  className,
2183
1608
  style: { width: "100%", height: "100%" },
2184
- children: captionsUrl ? /* @__PURE__ */ jsx11(
1609
+ children: captionsUrl ? /* @__PURE__ */ jsx9(
2185
1610
  "track",
2186
1611
  {
2187
1612
  kind: "captions",
@@ -2203,7 +1628,7 @@ function YouTubeFacade({
2203
1628
  }) {
2204
1629
  const videoId = extractYouTubeId(url);
2205
1630
  if (!videoId) return null;
2206
- return /* @__PURE__ */ jsx11(YouTubeFacadeInner, { videoId, title, priority, className, minimalControls });
1631
+ return /* @__PURE__ */ jsx9(YouTubeFacadeInner, { videoId, title, priority, className, minimalControls });
2207
1632
  }
2208
1633
  var YT_NOCOOKIE_ORIGIN = "https://www.youtube-nocookie.com";
2209
1634
  var YT_STATE_ENDED = 0;
@@ -2289,7 +1714,7 @@ function YouTubeFacadeInner({
2289
1714
  const wrapperClass = `relative w-full ${className ?? ""}`;
2290
1715
  const wrapperStyle = { paddingBottom: "56.25%" };
2291
1716
  if (activated) {
2292
- return /* @__PURE__ */ jsx11("div", { className: wrapperClass, style: wrapperStyle, children: /* @__PURE__ */ jsx11(
1717
+ return /* @__PURE__ */ jsx9("div", { className: wrapperClass, style: wrapperStyle, children: /* @__PURE__ */ jsx9(
2293
1718
  "iframe",
2294
1719
  {
2295
1720
  ref: iframeRef,
@@ -2301,7 +1726,7 @@ function YouTubeFacadeInner({
2301
1726
  }
2302
1727
  ) });
2303
1728
  }
2304
- return /* @__PURE__ */ jsx11("div", { className: wrapperClass, style: wrapperStyle, children: /* @__PURE__ */ jsxs8(
1729
+ return /* @__PURE__ */ jsx9("div", { className: wrapperClass, style: wrapperStyle, children: /* @__PURE__ */ jsxs6(
2305
1730
  "button",
2306
1731
  {
2307
1732
  type: "button",
@@ -2309,9 +1734,9 @@ function YouTubeFacadeInner({
2309
1734
  onClick: () => setActivated(true),
2310
1735
  className: "group absolute inset-0 p-0 m-0 border border-ods-border rounded-lg overflow-hidden bg-ods-card cursor-pointer",
2311
1736
  children: [
2312
- /* @__PURE__ */ jsxs8("picture", { children: [
2313
- /* @__PURE__ */ jsx11("source", { type: "image/webp", srcSet: posterWebp }),
2314
- /* @__PURE__ */ jsx11(
1737
+ /* @__PURE__ */ jsxs6("picture", { children: [
1738
+ /* @__PURE__ */ jsx9("source", { type: "image/webp", srcSet: posterWebp }),
1739
+ /* @__PURE__ */ jsx9(
2315
1740
  "img",
2316
1741
  {
2317
1742
  src: posterJpg,
@@ -2323,35 +1748,14 @@ function YouTubeFacadeInner({
2323
1748
  }
2324
1749
  )
2325
1750
  ] }),
2326
- /* @__PURE__ */ jsx11("div", { className: "absolute inset-0 flex items-center justify-center bg-ods-bg-inverse bg-opacity-20 transition-opacity duration-200 group-hover:bg-opacity-30", children: /* @__PURE__ */ jsx11("span", { className: "flex items-center justify-center w-16 h-16 rounded-full bg-ods-accent text-ods-text-on-accent shadow-lg transition-transform duration-200 group-hover:scale-110", children: /* @__PURE__ */ jsx11(PlayIcon, { size: 24, color: "currentColor", className: "ml-1" }) }) })
1751
+ /* @__PURE__ */ jsx9("div", { className: "absolute inset-0 flex items-center justify-center bg-ods-bg-inverse bg-opacity-20 transition-opacity duration-200 group-hover:bg-opacity-30", children: /* @__PURE__ */ jsx9("span", { className: "flex items-center justify-center w-16 h-16 rounded-full bg-ods-accent text-ods-text-on-accent shadow-lg transition-transform duration-200 group-hover:scale-110", children: /* @__PURE__ */ jsx9(PlayIcon, { size: 24, color: "currentColor", className: "ml-1" }) }) })
2327
1752
  ]
2328
1753
  }
2329
1754
  ) });
2330
1755
  }
2331
1756
 
2332
- // src/components/layout/page-heading.tsx
2333
- import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2334
- var PAGE_HEADING_CLASS = "text-h1 text-ods-text-primary";
2335
- var SECTION_HEADING_CLASS = "text-h2 text-ods-text-primary";
2336
- var DESCRIPTION_CLASS = "mt-6 max-w-[640px] font-['DM_Sans'] text-[16px] md:text-[18px] leading-[24px] md:leading-[28px] text-ods-text-secondary";
2337
- function PageHeading({
2338
- children,
2339
- as: Tag2 = "h1",
2340
- description,
2341
- className,
2342
- descriptionClassName
2343
- }) {
2344
- const headingClass = className ? `${PAGE_HEADING_CLASS} ${className}` : PAGE_HEADING_CLASS;
2345
- const descClass = descriptionClassName ? `${DESCRIPTION_CLASS} ${descriptionClassName}` : DESCRIPTION_CLASS;
2346
- const hasDescription = description != null && description !== "" && typeof description !== "boolean";
2347
- return /* @__PURE__ */ jsxs9(Fragment2, { children: [
2348
- /* @__PURE__ */ jsx12(Tag2, { className: headingClass, children }),
2349
- hasDescription && /* @__PURE__ */ jsx12("p", { className: descClass, children: description })
2350
- ] });
2351
- }
2352
-
2353
1757
  // src/components/features/video-ratio-tabs.tsx
2354
- import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
1758
+ import { Fragment as Fragment2, jsx as jsx10, jsxs as jsxs7 } from "react/jsx-runtime";
2355
1759
  var TAB_TRIGGER_CLASS = "rounded-none border-b-2 border-transparent data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:shadow-none px-4 py-2 text-sm text-ods-text-secondary data-[state=active]:text-ods-text-primary";
2356
1760
  var RATIO_GRID_CLASS = {
2357
1761
  portrait: "grid grid-cols-2 md:grid-cols-3 gap-4",
@@ -2376,17 +1780,17 @@ function RatioTabs({
2376
1780
  const activeTabs = RATIO_TAB_CONFIG.filter((t) => groups[t.key].count > 0);
2377
1781
  if (activeTabs.length <= 1) {
2378
1782
  const active = activeTabs[0];
2379
- return active ? /* @__PURE__ */ jsx13(Fragment3, { children: groups[active.key].render() }) : null;
1783
+ return active ? /* @__PURE__ */ jsx10(Fragment2, { children: groups[active.key].render() }) : null;
2380
1784
  }
2381
1785
  const firstTab = defaultTab && groups[defaultTab].count > 0 ? defaultTab : activeTabs[0].key;
2382
- return /* @__PURE__ */ jsxs10(Tabs, { defaultValue: firstTab, className: `w-full ${className}`, children: [
2383
- /* @__PURE__ */ jsx13(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0 mb-2", children: activeTabs.map((t) => /* @__PURE__ */ jsxs10(TabsTrigger, { value: t.key, className: TAB_TRIGGER_CLASS, children: [
1786
+ return /* @__PURE__ */ jsxs7(Tabs, { defaultValue: firstTab, className: `w-full ${className}`, children: [
1787
+ /* @__PURE__ */ jsx10(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0 mb-2", children: activeTabs.map((t) => /* @__PURE__ */ jsxs7(TabsTrigger, { value: t.key, className: TAB_TRIGGER_CLASS, children: [
2384
1788
  t.label,
2385
1789
  " (",
2386
1790
  groups[t.key].count,
2387
1791
  ")"
2388
1792
  ] }, t.key)) }),
2389
- activeTabs.map((t) => /* @__PURE__ */ jsx13(
1793
+ activeTabs.map((t) => /* @__PURE__ */ jsx10(
2390
1794
  TabsContent,
2391
1795
  {
2392
1796
  value: t.key,
@@ -2429,7 +1833,7 @@ function groupByAspectRatio(items, getAspectRatio) {
2429
1833
 
2430
1834
  // src/components/features/video-bites-display.tsx
2431
1835
  import { useMemo as useMemo4 } from "react";
2432
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
1836
+ import { jsx as jsx11, jsxs as jsxs8 } from "react/jsx-runtime";
2433
1837
  var RATIO_TO_CSS_ASPECT = {
2434
1838
  portrait: "9 / 16",
2435
1839
  square: "1 / 1",
@@ -2437,7 +1841,7 @@ var RATIO_TO_CSS_ASPECT = {
2437
1841
  };
2438
1842
  function LazyBite({ ratio, children }) {
2439
1843
  const { ref, isNear } = useNearViewport("500px");
2440
- return /* @__PURE__ */ jsx14("div", { ref, style: { aspectRatio: RATIO_TO_CSS_ASPECT[ratio] }, children: isNear ? children : /* @__PURE__ */ jsx14("div", { className: "w-full h-full bg-ods-card rounded-md" }) });
1844
+ return /* @__PURE__ */ jsx11("div", { ref, style: { aspectRatio: RATIO_TO_CSS_ASPECT[ratio] }, children: isNear ? children : /* @__PURE__ */ jsx11("div", { className: "w-full h-full bg-ods-card rounded-md" }) });
2441
1845
  }
2442
1846
  function VideoBitesDisplay({
2443
1847
  bites,
@@ -2460,27 +1864,27 @@ function VideoBitesDisplay({
2460
1864
  }, [bites, filterPublished]);
2461
1865
  const totalCount = grouped.portrait.length + grouped.square.length + grouped.landscape.length;
2462
1866
  if (totalCount === 0) return null;
2463
- return /* @__PURE__ */ jsxs11("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
2464
- showTitle && /* @__PURE__ */ jsx14("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: title }),
2465
- grouped.hasMultiple ? /* @__PURE__ */ jsx14(
1867
+ return /* @__PURE__ */ jsxs8("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
1868
+ showTitle && /* @__PURE__ */ jsx11("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: title }),
1869
+ grouped.hasMultiple ? /* @__PURE__ */ jsx11(
2466
1870
  RatioTabs,
2467
1871
  {
2468
1872
  groups: {
2469
1873
  portrait: {
2470
1874
  count: grouped.portrait.length,
2471
- render: () => /* @__PURE__ */ jsx14(BiteGrid, { bites: grouped.portrait, ratio: "portrait" })
1875
+ render: () => /* @__PURE__ */ jsx11(BiteGrid, { bites: grouped.portrait, ratio: "portrait" })
2472
1876
  },
2473
1877
  square: {
2474
1878
  count: grouped.square.length,
2475
- render: () => /* @__PURE__ */ jsx14(BiteGrid, { bites: grouped.square, ratio: "square" })
1879
+ render: () => /* @__PURE__ */ jsx11(BiteGrid, { bites: grouped.square, ratio: "square" })
2476
1880
  },
2477
1881
  landscape: {
2478
1882
  count: grouped.landscape.length,
2479
- render: () => /* @__PURE__ */ jsx14(BiteGrid, { bites: grouped.landscape, ratio: "landscape" })
1883
+ render: () => /* @__PURE__ */ jsx11(BiteGrid, { bites: grouped.landscape, ratio: "landscape" })
2480
1884
  }
2481
1885
  }
2482
1886
  }
2483
- ) : /* @__PURE__ */ jsx14(
1887
+ ) : /* @__PURE__ */ jsx11(
2484
1888
  BiteGrid,
2485
1889
  {
2486
1890
  bites: grouped.portrait.length > 0 ? grouped.portrait : grouped.square.length > 0 ? grouped.square : grouped.landscape,
@@ -2490,17 +1894,17 @@ function VideoBitesDisplay({
2490
1894
  ] });
2491
1895
  }
2492
1896
  function BiteGrid({ bites, ratio }) {
2493
- return /* @__PURE__ */ jsx14("div", { className: RATIO_DISPLAY_GRID_CLASS[ratio], children: bites.map((bite, index) => /* @__PURE__ */ jsx14(LazyBite, { ratio, children: /* @__PURE__ */ jsx14(VideoBiteCard, { url: bite.url, title: bite.title, thumbnailUrl: bite.thumbnail_url }) }, bite.url || index)) });
1897
+ return /* @__PURE__ */ jsx11("div", { className: RATIO_DISPLAY_GRID_CLASS[ratio], children: bites.map((bite, index) => /* @__PURE__ */ jsx11(LazyBite, { ratio, children: /* @__PURE__ */ jsx11(VideoBiteCard, { url: bite.url, title: bite.title, thumbnailUrl: bite.thumbnail_url }) }, bite.url || index)) });
2494
1898
  }
2495
1899
  function VideoBiteCard({ url, title, thumbnailUrl }) {
2496
- return /* @__PURE__ */ jsxs11(Card, { className: "overflow-hidden border border-ods-border bg-ods-card hover:border-ods-accent transition-colors flex flex-col h-full", children: [
2497
- /* @__PURE__ */ jsx14("div", { className: "relative flex-1 min-h-0", children: /* @__PURE__ */ jsx14(Video, { url, poster: thumbnailUrl || void 0, layout: "fill" }) }),
2498
- title && /* @__PURE__ */ jsx14("div", { className: "p-4", children: /* @__PURE__ */ jsx14("p", { className: "text-h4 text-ods-text-primary line-clamp-2", title, children: title }) })
1900
+ return /* @__PURE__ */ jsxs8(Card, { className: "overflow-hidden border border-ods-border bg-ods-card hover:border-ods-accent transition-colors flex flex-col h-full", children: [
1901
+ /* @__PURE__ */ jsx11("div", { className: "relative flex-1 min-h-0", children: /* @__PURE__ */ jsx11(Video, { url, poster: thumbnailUrl || void 0, layout: "fill" }) }),
1902
+ title && /* @__PURE__ */ jsx11("div", { className: "p-4", children: /* @__PURE__ */ jsx11("p", { className: "text-h4 text-ods-text-primary line-clamp-2", title, children: title }) })
2499
1903
  ] });
2500
1904
  }
2501
1905
 
2502
1906
  // src/components/features/entity-video-section.tsx
2503
- import { Fragment as Fragment4, jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
1907
+ import { Fragment as Fragment3, jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2504
1908
  function EntityVideoSection({
2505
1909
  mainVideoUrl,
2506
1910
  youtubeUrl,
@@ -2525,10 +1929,10 @@ function EntityVideoSection({
2525
1929
  }
2526
1930
  const fullVideoUrl = youtubeUrl || mainVideoUrl || null;
2527
1931
  const fullVideoKind = youtubeUrl ? "youtube" : "auto";
2528
- return /* @__PURE__ */ jsxs12(Fragment4, { children: [
2529
- hasVideo && (hasFullVideo && hasHighlight ? /* @__PURE__ */ jsxs12(Tabs, { defaultValue: "full-video", className: "w-full", children: [
2530
- /* @__PURE__ */ jsxs12(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0", children: [
2531
- /* @__PURE__ */ jsx15(
1932
+ return /* @__PURE__ */ jsxs9(Fragment3, { children: [
1933
+ hasVideo && (hasFullVideo && hasHighlight ? /* @__PURE__ */ jsxs9(Tabs, { defaultValue: "full-video", className: "w-full", children: [
1934
+ /* @__PURE__ */ jsxs9(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0", children: [
1935
+ /* @__PURE__ */ jsx12(
2532
1936
  TabsTrigger,
2533
1937
  {
2534
1938
  value: "full-video",
@@ -2536,7 +1940,7 @@ function EntityVideoSection({
2536
1940
  children: "Full Video"
2537
1941
  }
2538
1942
  ),
2539
- /* @__PURE__ */ jsx15(
1943
+ /* @__PURE__ */ jsx12(
2540
1944
  TabsTrigger,
2541
1945
  {
2542
1946
  value: "highlights",
@@ -2545,7 +1949,7 @@ function EntityVideoSection({
2545
1949
  }
2546
1950
  )
2547
1951
  ] }),
2548
- /* @__PURE__ */ jsx15(TabsContent, { value: "full-video", className: "mt-4", children: /* @__PURE__ */ jsx15(
1952
+ /* @__PURE__ */ jsx12(TabsContent, { value: "full-video", className: "mt-4", children: /* @__PURE__ */ jsx12(
2549
1953
  Video,
2550
1954
  {
2551
1955
  kind: fullVideoKind,
@@ -2558,7 +1962,7 @@ function EntityVideoSection({
2558
1962
  priority
2559
1963
  }
2560
1964
  ) }),
2561
- /* @__PURE__ */ jsx15(TabsContent, { value: "highlights", className: "mt-4", children: /* @__PURE__ */ jsx15(
1965
+ /* @__PURE__ */ jsx12(TabsContent, { value: "highlights", className: "mt-4", children: /* @__PURE__ */ jsx12(
2562
1966
  Video,
2563
1967
  {
2564
1968
  url: highlightVideoUrl,
@@ -2566,7 +1970,7 @@ function EntityVideoSection({
2566
1970
  layout: "centered"
2567
1971
  }
2568
1972
  ) })
2569
- ] }) : hasFullVideo ? /* @__PURE__ */ jsx15(
1973
+ ] }) : hasFullVideo ? /* @__PURE__ */ jsx12(
2570
1974
  Video,
2571
1975
  {
2572
1976
  kind: fullVideoKind,
@@ -2578,7 +1982,7 @@ function EntityVideoSection({
2578
1982
  layout: "centered",
2579
1983
  priority
2580
1984
  }
2581
- ) : /* @__PURE__ */ jsx15(
1985
+ ) : /* @__PURE__ */ jsx12(
2582
1986
  Video,
2583
1987
  {
2584
1988
  url: highlightVideoUrl,
@@ -2587,11 +1991,11 @@ function EntityVideoSection({
2587
1991
  priority
2588
1992
  }
2589
1993
  )),
2590
- videoSummary && MarkdownRenderer && /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
2591
- /* @__PURE__ */ jsx15("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: "Summary" }),
2592
- /* @__PURE__ */ jsx15("div", { className: "text-h4 text-ods-text-primary break-words overflow-hidden", children: /* @__PURE__ */ jsx15(MarkdownRenderer, { content: videoSummary }) })
1994
+ videoSummary && MarkdownRenderer && /* @__PURE__ */ jsxs9("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
1995
+ /* @__PURE__ */ jsx12("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: "Summary" }),
1996
+ /* @__PURE__ */ jsx12("div", { className: "text-h4 text-ods-text-primary break-words overflow-hidden", children: /* @__PURE__ */ jsx12(MarkdownRenderer, { content: videoSummary }) })
2593
1997
  ] }),
2594
- videoBites && videoBites.length > 0 && /* @__PURE__ */ jsx15(
1998
+ videoBites && videoBites.length > 0 && /* @__PURE__ */ jsx12(
2595
1999
  VideoBitesDisplay,
2596
2000
  {
2597
2001
  bites: videoBites,
@@ -2602,40 +2006,6 @@ function EntityVideoSection({
2602
2006
  ] });
2603
2007
  }
2604
2008
 
2605
- // src/components/chat/utils/compact-card-classes.ts
2606
- var COMPACT_CARD_OUTER = "my-1.5 flex items-start gap-3 w-full p-2 rounded-lg border border-ods-border bg-ods-card no-underline transition-colors hover:border-ods-text-secondary/40";
2607
- var COMPACT_CARD_OUTER_STATIC = "my-1.5 flex items-start gap-3 w-full p-2 rounded-lg border border-ods-border bg-ods-card no-underline cursor-default";
2608
- var COMPACT_CARD_SKELETON_OUTER = "my-1.5 flex w-full animate-pulse items-start gap-3 rounded-lg border border-ods-border bg-ods-card p-2";
2609
- var COMPACT_CARD_IMAGE_SLOT = "relative block shrink-0 self-start w-14 h-14 aspect-square overflow-hidden rounded-md bg-ods-bg";
2610
- var COMPACT_CARD_SKELETON_IMAGE_SLOT = "block h-14 w-14 aspect-square shrink-0 self-start rounded-md bg-ods-bg";
2611
- var COMPACT_CARD_ICON_SLOT = "flex h-14 w-14 aspect-square shrink-0 self-start items-center justify-center rounded-md bg-ods-bg text-ods-accent";
2612
- var COMPACT_CARD_TEXT_COL = "flex min-w-0 flex-1 flex-col gap-0.5 min-h-14";
2613
- var COMPACT_CARD_TITLE_ROW = "flex items-center min-w-0 h-5";
2614
- var COMPACT_CARD_META_ROW_BOX = "flex items-center min-w-0 h-4";
2615
- var COMPACT_CARD_TITLE = "truncate text-sm font-semibold leading-5 text-ods-text-primary";
2616
- var COMPACT_CARD_SUBTITLE = "truncate text-[11px] leading-4 text-ods-text-secondary";
2617
- var COMPACT_CARD_SUMMARY = "truncate text-[11px] leading-4 text-ods-text-secondary/80";
2618
- var COMPACT_CARD_META_ROW = "flex items-center gap-1.5 min-w-0 text-[11px] leading-4 text-ods-text-secondary";
2619
- var COMPACT_CARD_ROW_FILLER = "\xA0";
2620
- var SAFE_URL_SCHEMES = ["http:", "https:", "mailto:"];
2621
- function safeHref(url) {
2622
- if (!url) return null;
2623
- if (/[\u0000-\u001f\u007f\u200b-\u200d\u2028\u2029\ufeff]/.test(url)) return null;
2624
- const trimmed = url.trim();
2625
- if (!trimmed) return null;
2626
- if (trimmed.startsWith("/") && !trimmed.startsWith("//")) return trimmed;
2627
- if (trimmed.startsWith("#")) return trimmed;
2628
- if (/^[a-z][a-z0-9+.-]*:$/i.test(trimmed)) return null;
2629
- try {
2630
- const parsed = new URL(trimmed, "https://_safehref_base.invalid");
2631
- if (!SAFE_URL_SCHEMES.includes(parsed.protocol)) return null;
2632
- if ((parsed.protocol === "https:" || parsed.protocol === "http:") && !parsed.hostname) return null;
2633
- return trimmed;
2634
- } catch {
2635
- return null;
2636
- }
2637
- }
2638
-
2639
2009
  // src/components/chat/entity-cards/onboarding-guide-card.tsx
2640
2010
  init_next_link();
2641
2011
  init_cn();
@@ -2676,7 +2046,7 @@ function useEntityCardPlaceholder({
2676
2046
  }
2677
2047
 
2678
2048
  // src/components/chat/entity-cards/onboarding-guide-card.tsx
2679
- import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
2049
+ import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
2680
2050
  function stripMarkdownPreview(text) {
2681
2051
  return text.replace(/```[\s\S]*?```/g, " ").replace(/^#{1,6}\s+/gm, "").replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/[*_~`>]/g, "").replace(/^\s*[-+]\s+/gm, "").replace(/-{3,}/g, " ").replace(/\s+/g, " ").trim().replace(/^([\s\S]{240})[\s\S]+$/, "$1\u2026");
2682
2052
  }
@@ -2690,64 +2060,64 @@ var HORIZONTAL_SIZE_TOKENS = {
2690
2060
  };
2691
2061
  function OnboardingGuideCardSkeleton({ size = "default" }) {
2692
2062
  if (size === "catalog") {
2693
- return /* @__PURE__ */ jsxs13("div", { className: "bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse", children: [
2694
- /* @__PURE__ */ jsxs13("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2695
- /* @__PURE__ */ jsx16("div", { className: "w-full md:w-[256px] aspect-[1200/630] bg-ods-border rounded-lg flex-shrink-0" }),
2696
- /* @__PURE__ */ jsxs13("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2697
- /* @__PURE__ */ jsxs13("div", { className: "min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3", children: [
2698
- /* @__PURE__ */ jsx16("div", { className: "h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" }),
2699
- /* @__PURE__ */ jsx16("div", { className: "h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" })
2063
+ return /* @__PURE__ */ jsxs10("div", { className: "bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse", children: [
2064
+ /* @__PURE__ */ jsxs10("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2065
+ /* @__PURE__ */ jsx13("div", { className: "w-full md:w-[256px] aspect-[1200/630] bg-ods-border rounded-lg flex-shrink-0" }),
2066
+ /* @__PURE__ */ jsxs10("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2067
+ /* @__PURE__ */ jsxs10("div", { className: "min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3", children: [
2068
+ /* @__PURE__ */ jsx13("div", { className: "h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" }),
2069
+ /* @__PURE__ */ jsx13("div", { className: "h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" })
2700
2070
  ] }),
2701
- /* @__PURE__ */ jsxs13("div", { className: "min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start", children: [
2702
- /* @__PURE__ */ jsx16("div", { className: "h-3 w-full bg-ods-border/70 rounded" }),
2703
- /* @__PURE__ */ jsx16("div", { className: "h-3 w-5/6 bg-ods-border/70 rounded" })
2071
+ /* @__PURE__ */ jsxs10("div", { className: "min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start", children: [
2072
+ /* @__PURE__ */ jsx13("div", { className: "h-3 w-full bg-ods-border/70 rounded" }),
2073
+ /* @__PURE__ */ jsx13("div", { className: "h-3 w-5/6 bg-ods-border/70 rounded" })
2704
2074
  ] })
2705
2075
  ] })
2706
2076
  ] }),
2707
- /* @__PURE__ */ jsxs13("div", { className: "grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full", children: [
2708
- [0, 1].map((i) => /* @__PURE__ */ jsx16(
2077
+ /* @__PURE__ */ jsxs10("div", { className: "grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full", children: [
2078
+ [0, 1].map((i) => /* @__PURE__ */ jsx13(
2709
2079
  "div",
2710
2080
  {
2711
2081
  className: "bg-ods-card p-4 flex flex-col gap-3 border-b md:border-b-0 md:border-r border-ods-border",
2712
- children: /* @__PURE__ */ jsxs13("div", { className: "flex flex-col gap-2", children: [
2713
- /* @__PURE__ */ jsx16("div", { className: "h-6 w-32 bg-ods-bg rounded" }),
2714
- /* @__PURE__ */ jsx16("div", { className: "h-3 w-20 bg-ods-bg/60 rounded" })
2082
+ children: /* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-2", children: [
2083
+ /* @__PURE__ */ jsx13("div", { className: "h-6 w-32 bg-ods-bg rounded" }),
2084
+ /* @__PURE__ */ jsx13("div", { className: "h-3 w-20 bg-ods-bg/60 rounded" })
2715
2085
  ] })
2716
2086
  },
2717
2087
  `cell-${i}`
2718
2088
  )),
2719
- /* @__PURE__ */ jsxs13("div", { className: "bg-ods-card p-4 flex items-center gap-3", children: [
2720
- /* @__PURE__ */ jsx16("div", { className: "h-10 w-10 rounded-full bg-ods-bg shrink-0" }),
2721
- /* @__PURE__ */ jsxs13("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2722
- /* @__PURE__ */ jsx16("div", { className: "h-4 w-3/4 bg-ods-bg rounded" }),
2723
- /* @__PURE__ */ jsx16("div", { className: "h-3 w-1/2 bg-ods-bg/60 rounded" })
2089
+ /* @__PURE__ */ jsxs10("div", { className: "bg-ods-card p-4 flex items-center gap-3", children: [
2090
+ /* @__PURE__ */ jsx13("div", { className: "h-10 w-10 rounded-full bg-ods-bg shrink-0" }),
2091
+ /* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2092
+ /* @__PURE__ */ jsx13("div", { className: "h-4 w-3/4 bg-ods-bg rounded" }),
2093
+ /* @__PURE__ */ jsx13("div", { className: "h-3 w-1/2 bg-ods-bg/60 rounded" })
2724
2094
  ] })
2725
2095
  ] })
2726
2096
  ] })
2727
2097
  ] });
2728
2098
  }
2729
2099
  if (size === "sm") {
2730
- return /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_SKELETON_OUTER, children: [
2731
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_SKELETON_IMAGE_SLOT }),
2732
- /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_TEXT_COL, children: [
2733
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx16("span", { className: "h-3.5 w-3/5 rounded bg-ods-bg" }) }),
2734
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: "h-3 w-2/5 rounded bg-ods-bg/70" }) }),
2735
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: "h-3 w-11/12 rounded bg-ods-bg/40" }) })
2100
+ return /* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_SKELETON_OUTER, children: [
2101
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_SKELETON_IMAGE_SLOT }),
2102
+ /* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_TEXT_COL, children: [
2103
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx13("span", { className: "h-3.5 w-3/5 rounded bg-ods-bg" }) }),
2104
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: "h-3 w-2/5 rounded bg-ods-bg/70" }) }),
2105
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: "h-3 w-11/12 rounded bg-ods-bg/40" }) })
2736
2106
  ] }),
2737
- /* @__PURE__ */ jsx16("span", { className: "flex shrink-0 items-center self-start h-5", children: /* @__PURE__ */ jsx16("span", { className: "h-3.5 w-3.5 rounded bg-ods-bg" }) })
2107
+ /* @__PURE__ */ jsx13("span", { className: "flex shrink-0 items-center self-start h-5", children: /* @__PURE__ */ jsx13("span", { className: "h-3.5 w-3.5 rounded bg-ods-bg" }) })
2738
2108
  ] });
2739
2109
  }
2740
2110
  const t = HORIZONTAL_SIZE_TOKENS.default;
2741
- return /* @__PURE__ */ jsxs13(
2111
+ return /* @__PURE__ */ jsxs10(
2742
2112
  "span",
2743
2113
  {
2744
2114
  className: `flex items-start gap-3 rounded-md border border-ods-border bg-ods-card ${t.padding} animate-pulse`,
2745
2115
  children: [
2746
- /* @__PURE__ */ jsx16("span", { className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}` }),
2747
- /* @__PURE__ */ jsxs13("span", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2748
- /* @__PURE__ */ jsx16("span", { className: "block h-4 w-2/3 rounded bg-ods-bg" }),
2749
- /* @__PURE__ */ jsx16("span", { className: "block h-3 w-1/3 rounded bg-ods-bg/70" }),
2750
- /* @__PURE__ */ jsx16("span", { className: "block h-3 w-full rounded bg-ods-bg/40" })
2116
+ /* @__PURE__ */ jsx13("span", { className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}` }),
2117
+ /* @__PURE__ */ jsxs10("span", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2118
+ /* @__PURE__ */ jsx13("span", { className: "block h-4 w-2/3 rounded bg-ods-bg" }),
2119
+ /* @__PURE__ */ jsx13("span", { className: "block h-3 w-1/3 rounded bg-ods-bg/70" }),
2120
+ /* @__PURE__ */ jsx13("span", { className: "block h-3 w-full rounded bg-ods-bg/40" })
2751
2121
  ] })
2752
2122
  ]
2753
2123
  }
@@ -2779,7 +2149,7 @@ function OnboardingGuideCard({
2779
2149
  const hasVideoCover = !!(guide.main_video_thumbnail || guide.highlight_video_thumbnail);
2780
2150
  const stepLabel = typeof guide.step_order === "number" ? String(guide.step_order).padStart(2, "0") : "\u2014";
2781
2151
  const durationLabel = typeof guide.highlight_video_duration_ms === "number" && guide.highlight_video_duration_ms > 0 ? formatDurationMMSS(Math.floor(guide.highlight_video_duration_ms / 1e3)) : "";
2782
- return /* @__PURE__ */ jsx16(
2152
+ return /* @__PURE__ */ jsx13(
2783
2153
  next_link_default,
2784
2154
  {
2785
2155
  href,
@@ -2795,10 +2165,10 @@ function OnboardingGuideCard({
2795
2165
  className
2796
2166
  ),
2797
2167
  "aria-label": `Open ${guide.title}`,
2798
- children: /* @__PURE__ */ jsxs13("div", { className: "flex flex-col p-6 gap-4", children: [
2799
- /* @__PURE__ */ jsxs13("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2800
- /* @__PURE__ */ jsx16("div", { className: "w-full md:w-[256px] flex-shrink-0", children: /* @__PURE__ */ jsxs13("div", { className: "relative rounded-lg overflow-hidden w-full aspect-[1200/630] bg-ods-bg", children: [
2801
- coverImage ? /* @__PURE__ */ jsx16(
2168
+ children: /* @__PURE__ */ jsxs10("div", { className: "flex flex-col p-6 gap-4", children: [
2169
+ /* @__PURE__ */ jsxs10("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2170
+ /* @__PURE__ */ jsx13("div", { className: "w-full md:w-[256px] flex-shrink-0", children: /* @__PURE__ */ jsxs10("div", { className: "relative rounded-lg overflow-hidden w-full aspect-[1200/630] bg-ods-bg", children: [
2171
+ coverImage ? /* @__PURE__ */ jsx13(
2802
2172
  next_image_default,
2803
2173
  {
2804
2174
  src: coverImage,
@@ -2808,7 +2178,7 @@ function OnboardingGuideCard({
2808
2178
  className: "object-cover",
2809
2179
  unoptimized: true
2810
2180
  }
2811
- ) : /* @__PURE__ */ jsx16(
2181
+ ) : /* @__PURE__ */ jsx13(
2812
2182
  BlogImagePlaceholder,
2813
2183
  {
2814
2184
  title: guide.title,
@@ -2816,18 +2186,18 @@ function OnboardingGuideCard({
2816
2186
  className: "absolute inset-0"
2817
2187
  }
2818
2188
  ),
2819
- hasVideoCover && coverImage && /* @__PURE__ */ jsx16("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx16(Play, { className: "w-10 h-10 text-white", fill: "white" }) }),
2820
- durationLabel && /* @__PURE__ */ jsxs13("span", { className: "absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono", children: [
2821
- /* @__PURE__ */ jsx16(Clock, { className: "w-3 h-3" }),
2189
+ hasVideoCover && coverImage && /* @__PURE__ */ jsx13("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx13(Play, { className: "w-10 h-10 text-white", fill: "white" }) }),
2190
+ durationLabel && /* @__PURE__ */ jsxs10("span", { className: "absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono", children: [
2191
+ /* @__PURE__ */ jsx13(Clock, { className: "w-3 h-3" }),
2822
2192
  durationLabel
2823
2193
  ] })
2824
2194
  ] }) }),
2825
- /* @__PURE__ */ jsxs13("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2826
- /* @__PURE__ */ jsx16("div", { className: "min-h-[60px] md:min-h-[72px] flex items-start mb-3", children: /* @__PURE__ */ jsx16("h3", { className: "font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2", children: guide.title }) }),
2827
- /* @__PURE__ */ jsx16("div", { className: "min-h-[46px] md:min-h-[52px]", children: /* @__PURE__ */ jsx16("p", { className: "font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2", children: stripMarkdownPreview(guide.video_summary || guide.content || "") }) })
2195
+ /* @__PURE__ */ jsxs10("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2196
+ /* @__PURE__ */ jsx13("div", { className: "min-h-[60px] md:min-h-[72px] flex items-start mb-3", children: /* @__PURE__ */ jsx13("h3", { className: "font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2", children: guide.title }) }),
2197
+ /* @__PURE__ */ jsx13("div", { className: "min-h-[46px] md:min-h-[52px]", children: /* @__PURE__ */ jsx13("p", { className: "font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2", children: stripMarkdownPreview(guide.video_summary || guide.content || "") }) })
2828
2198
  ] })
2829
2199
  ] }),
2830
- /* @__PURE__ */ jsx16(
2200
+ /* @__PURE__ */ jsx13(
2831
2201
  EntityAuthorCard,
2832
2202
  {
2833
2203
  author: guide.author,
@@ -2857,9 +2227,9 @@ function OnboardingGuideCard({
2857
2227
  guide.section,
2858
2228
  author
2859
2229
  ].filter((s) => typeof s === "string" && s.length > 0);
2860
- return /* @__PURE__ */ jsxs13(next_link_default, { href, target, rel, prefetch: false, className: cn(COMPACT_CARD_OUTER, className), children: [
2861
- /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_IMAGE_SLOT, children: [
2862
- compactCover ? /* @__PURE__ */ jsx16(
2230
+ return /* @__PURE__ */ jsxs10(next_link_default, { href, target, rel, prefetch: false, className: cn(COMPACT_CARD_OUTER, className), children: [
2231
+ /* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_IMAGE_SLOT, children: [
2232
+ compactCover ? /* @__PURE__ */ jsx13(
2863
2233
  next_image_default,
2864
2234
  {
2865
2235
  src: compactCover,
@@ -2869,20 +2239,20 @@ function OnboardingGuideCard({
2869
2239
  className: "object-contain",
2870
2240
  unoptimized: true
2871
2241
  }
2872
- ) : /* @__PURE__ */ jsx16("span", { className: "flex h-full w-full items-center justify-center text-ods-accent", children: /* @__PURE__ */ jsx16(GraduationCap, { className: "w-4 h-4" }) }),
2873
- hasVideoCover && compactCover && /* @__PURE__ */ jsx16("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx16(Play, { className: "h-4 w-4 text-white", fill: "white" }) })
2242
+ ) : /* @__PURE__ */ jsx13("span", { className: "flex h-full w-full items-center justify-center text-ods-accent", children: /* @__PURE__ */ jsx13(GraduationCap, { className: "w-4 h-4" }) }),
2243
+ hasVideoCover && compactCover && /* @__PURE__ */ jsx13("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx13(Play, { className: "h-4 w-4 text-white", fill: "white" }) })
2874
2244
  ] }),
2875
- /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_TEXT_COL, children: [
2876
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx16("span", { className: cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']"), children: guide.title }) }),
2877
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: "truncate text-[11px] leading-4 text-[var(--color-accent-primary)]", children: subtitleParts.join(" \xB7 ") }) }),
2878
- /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_SUMMARY, children: summary2 || COMPACT_CARD_ROW_FILLER }) })
2245
+ /* @__PURE__ */ jsxs10("span", { className: COMPACT_CARD_TEXT_COL, children: [
2246
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx13("span", { className: cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']"), children: guide.title }) }),
2247
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: "truncate text-[11px] leading-4 text-[var(--color-accent-primary)]", children: subtitleParts.join(" \xB7 ") }) }),
2248
+ /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx13("span", { className: COMPACT_CARD_SUMMARY, children: summary2 || COMPACT_CARD_ROW_FILLER }) })
2879
2249
  ] }),
2880
- /* @__PURE__ */ jsx16("span", { className: "flex shrink-0 items-center self-start h-5 text-ods-text-secondary", children: /* @__PURE__ */ jsx16(ExternalLink, { className: "w-3.5 h-3.5" }) })
2250
+ /* @__PURE__ */ jsx13("span", { className: "flex shrink-0 items-center self-start h-5 text-ods-text-secondary", children: /* @__PURE__ */ jsx13(ExternalLink, { className: "w-3.5 h-3.5" }) })
2881
2251
  ] });
2882
2252
  }
2883
2253
  const t = HORIZONTAL_SIZE_TOKENS.default;
2884
2254
  const summary = stripMarkdownPreview(guide.video_summary || guide.content || "");
2885
- return /* @__PURE__ */ jsxs13(
2255
+ return /* @__PURE__ */ jsxs10(
2886
2256
  next_link_default,
2887
2257
  {
2888
2258
  href,
@@ -2894,7 +2264,7 @@ function OnboardingGuideCard({
2894
2264
  className
2895
2265
  ),
2896
2266
  children: [
2897
- /* @__PURE__ */ jsx16(
2267
+ /* @__PURE__ */ jsx13(
2898
2268
  "span",
2899
2269
  {
2900
2270
  className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-accent/10 text-ods-accent font-semibold ${t.step}`,
@@ -2902,432 +2272,24 @@ function OnboardingGuideCard({
2902
2272
  children: guide.step_order
2903
2273
  }
2904
2274
  ),
2905
- /* @__PURE__ */ jsxs13("span", { className: "flex flex-col gap-0.5 flex-1 min-w-0", children: [
2906
- /* @__PURE__ */ jsx16("span", { className: `block ${t.title} text-ods-text-primary truncate`, children: guide.title }),
2907
- /* @__PURE__ */ jsxs13("span", { className: "inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary", children: [
2908
- /* @__PURE__ */ jsx16(GraduationCap, { className: "h-3 w-3 shrink-0" }),
2909
- /* @__PURE__ */ jsx16("span", { className: "truncate", children: guide.section })
2275
+ /* @__PURE__ */ jsxs10("span", { className: "flex flex-col gap-0.5 flex-1 min-w-0", children: [
2276
+ /* @__PURE__ */ jsx13("span", { className: `block ${t.title} text-ods-text-primary truncate`, children: guide.title }),
2277
+ /* @__PURE__ */ jsxs10("span", { className: "inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary", children: [
2278
+ /* @__PURE__ */ jsx13(GraduationCap, { className: "h-3 w-3 shrink-0" }),
2279
+ /* @__PURE__ */ jsx13("span", { className: "truncate", children: guide.section })
2910
2280
  ] }),
2911
- summary && /* @__PURE__ */ jsx16("span", { className: `font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`, children: summary })
2281
+ summary && /* @__PURE__ */ jsx13("span", { className: `font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`, children: summary })
2912
2282
  ] })
2913
2283
  ]
2914
2284
  }
2915
2285
  );
2916
2286
  }
2917
2287
 
2918
- // src/utils/source-icons.ts
2919
- var SOURCE_ICON_NAMES = {
2920
- // Doc tables
2921
- "openframe-docs": "openframe",
2922
- "data-room-docs": "shield",
2923
- // CMS / programs
2924
- "blog-posts": "newspaper",
2925
- "product-releases": "rocket",
2926
- "case-studies": "briefcase",
2927
- "onboarding-guides": "graduation-cap",
2928
- webinars: "video",
2929
- events: "calendar",
2930
- podcasts: "headphones",
2931
- "customer-interviews": "users",
2932
- // Financials
2933
- "investor-updates": "mail",
2934
- "financial-kpis": "activity",
2935
- "financial-cap-table": "table",
2936
- "financial-pnl": "trending-up",
2937
- "financial-balance-sheet": "dollar-sign",
2938
- "financial-cash-flow": "banknote",
2939
- // ClickUp
2940
- "clickup-roadmap": "clickup",
2941
- "clickup-delivery": "clickup",
2942
- "clickup-tasks-internal": "clickup",
2943
- // GitHub
2944
- "github-commits": "github",
2945
- "github-pull-requests": "github",
2946
- "github-pr-reviews": "github",
2947
- "github-commits-public": "github",
2948
- "github-pull-requests-public": "github",
2949
- "github-pr-reviews-public": "github",
2950
- // HubSpot
2951
- "hubspot-tickets": "hubspot",
2952
- "hubspot-tickets-anon": "hubspot",
2953
- "hubspot-tickets-self": "hubspot",
2954
- // Communications
2955
- "slack-messages": "slack"
2956
- };
2957
- function getSourceIconName(tableId) {
2958
- if (!tableId) return void 0;
2959
- return SOURCE_ICON_NAMES[tableId];
2960
- }
2961
- var SOURCE_LABELS_BY_TABLE = {
2962
- // Doc tables
2963
- "openframe-docs": "OpenFrame Docs",
2964
- "data-room-docs": "Data Room",
2965
- // CMS / programs
2966
- "blog-posts": "Blog Posts",
2967
- "product-releases": "Product Releases",
2968
- "case-studies": "Case Studies",
2969
- "onboarding-guides": "Onboarding Guides",
2970
- webinars: "Webinars",
2971
- events: "Events",
2972
- podcasts: "Podcasts",
2973
- "customer-interviews": "Customer Interviews",
2974
- // Financials
2975
- "investor-updates": "Investor Updates",
2976
- "financial-kpis": "Financial KPIs",
2977
- "financial-cap-table": "Cap Table",
2978
- "financial-pnl": "Profit & Loss",
2979
- "financial-balance-sheet": "Balance Sheet",
2980
- "financial-cash-flow": "Cash Flow",
2981
- // ClickUp
2982
- "clickup-roadmap": "ClickUp Roadmap",
2983
- "clickup-delivery": "ClickUp Delivery",
2984
- "clickup-tasks-internal": "ClickUp Tasks",
2985
- // GitHub
2986
- "github-commits": "GitHub Commits",
2987
- "github-pull-requests": "GitHub Pull Requests",
2988
- "github-pr-reviews": "GitHub PR Reviews",
2989
- "github-commits-public": "OpenFrame Commits",
2990
- "github-pull-requests-public": "OpenFrame Pull Requests",
2991
- "github-pr-reviews-public": "OpenFrame PR Reviews",
2992
- // HubSpot
2993
- "hubspot-tickets": "HubSpot Tickets",
2994
- "hubspot-tickets-anon": "Known Issues",
2995
- "hubspot-tickets-self": "My Tickets",
2996
- // Communications
2997
- "slack-messages": "OpenMSP Community"
2998
- };
2999
- function getSourceLabel(tableId) {
3000
- return SOURCE_LABELS_BY_TABLE[tableId] ?? tableId;
3001
- }
3002
- var DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID = {
3003
- // Doc tables
3004
- markdown: "openframe-docs",
3005
- data_room_doc: "data-room-docs",
3006
- // CMS / programs
3007
- blog_post: "blog-posts",
3008
- product_release: "product-releases",
3009
- case_study: "case-studies",
3010
- onboarding_guide: "onboarding-guides",
3011
- webinar: "webinars",
3012
- event: "events",
3013
- podcast: "podcasts",
3014
- customer_interview: "customer-interviews",
3015
- // Financials
3016
- investor_update: "investor-updates",
3017
- financial_kpi: "financial-kpis",
3018
- cap_table: "financial-cap-table",
3019
- profit_loss: "financial-pnl",
3020
- balance_sheet: "financial-balance-sheet",
3021
- cash_flow: "financial-cash-flow",
3022
- // ClickUp
3023
- roadmap_item: "clickup-roadmap",
3024
- delivery_item: "clickup-delivery",
3025
- internal_task: "clickup-tasks-internal",
3026
- // GitHub
3027
- github_commit: "github-commits",
3028
- github_pull_request: "github-pull-requests",
3029
- github_pr_review: "github-pr-reviews",
3030
- github_commit_public: "github-commits-public",
3031
- github_pull_request_public: "github-pull-requests-public",
3032
- github_pr_review_public: "github-pr-reviews-public",
3033
- // HubSpot
3034
- hubspot_ticket: "hubspot-tickets",
3035
- hubspot_ticket_anon: "hubspot-tickets-anon",
3036
- hubspot_ticket_self: "hubspot-tickets-self",
3037
- // Communications
3038
- slack_message: "slack-messages"
3039
- };
3040
- function defaultTableIdForDocumentType(documentType) {
3041
- return DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID[documentType] ?? null;
3042
- }
3043
-
3044
- // src/components/chat/utils/icon-registry.ts
3045
- import { createElement } from "react";
3046
- import {
3047
- Activity,
3048
- Banknote,
3049
- Bell,
3050
- BookOpen,
3051
- Box,
3052
- Briefcase,
3053
- Calendar,
3054
- CheckSquare,
3055
- DollarSign,
3056
- Facebook,
3057
- FileText,
3058
- Github,
3059
- Globe,
3060
- GraduationCap as GraduationCap2,
3061
- Headphones,
3062
- Info,
3063
- Instagram,
3064
- Mail,
3065
- Megaphone,
3066
- MessageCircle,
3067
- MessageSquare,
3068
- Newspaper,
3069
- Package,
3070
- PenSquare,
3071
- Rocket,
3072
- Search,
3073
- Send,
3074
- Shield,
3075
- Star,
3076
- TableProperties,
3077
- TrendingUp,
3078
- Twitter,
3079
- Users,
3080
- Video as Video2,
3081
- Youtube
3082
- } from "lucide-react";
3083
- var OpenFrameLogoIcon = ({ className }) => createElement(OpenFrameLogo, { className, upperPathColor: "currentColor" });
3084
- var ICON_REGISTRY = {
3085
- // lucide-react (kebab-case)
3086
- activity: Activity,
3087
- banknote: Banknote,
3088
- bell: Bell,
3089
- "book-open": BookOpen,
3090
- box: Box,
3091
- briefcase: Briefcase,
3092
- calendar: Calendar,
3093
- "check-square": CheckSquare,
3094
- "dollar-sign": DollarSign,
3095
- // For brand-vs-lucide variants the kebab key is the BRAND (most-common
3096
- // social-platform intent); `'<name>-lucide'` carries the lucide outline.
3097
- facebook: FacebookIcon,
3098
- "facebook-lucide": Facebook,
3099
- "file-text": FileText,
3100
- // `'github-lucide'` is the lucide outline glyph (used by
3101
- // `social_platforms.icon_name='Github'`); `'github'` is the brand icon
3102
- // (used by `chat_admin_slash_commands.icon_name='github'`). The PascalCase
3103
- // alias `'Github' → 'github-lucide'` routes the lucide glyph for
3104
- // social-platform DB rows; `'GitHubIcon' → 'github'` keeps brand routing
3105
- // consistent for callers that store the PascalCase component name.
3106
- github: GitHubIcon,
3107
- "github-lucide": Github,
3108
- globe: Globe,
3109
- "graduation-cap": GraduationCap2,
3110
- headphones: Headphones,
3111
- info: Info,
3112
- instagram: InstagramIcon,
3113
- "instagram-lucide": Instagram,
3114
- mail: Mail,
3115
- megaphone: Megaphone,
3116
- "message-circle": MessageCircle,
3117
- "message-square": MessageSquare,
3118
- newspaper: Newspaper,
3119
- package: Package,
3120
- "pen-square": PenSquare,
3121
- rocket: Rocket,
3122
- search: Search,
3123
- send: Send,
3124
- shield: Shield,
3125
- star: Star,
3126
- table: TableProperties,
3127
- "trending-up": TrendingUp,
3128
- twitter: Twitter,
3129
- users: Users,
3130
- video: Video2,
3131
- youtube: YouTubeIcon,
3132
- "youtube-lucide": Youtube,
3133
- // brand-only icons (no lucide variant in current use)
3134
- slack: SlackIcon,
3135
- clickup: ClickUpIcon,
3136
- hubspot: HubspotIcon,
3137
- linkedin: LinkedInIcon,
3138
- x: XLogo,
3139
- openframe: OpenFrameLogoIcon
3140
- };
3141
- var PASCAL_TO_KEBAB_ALIASES = {
3142
- // Lucide PascalCase names → kebab equivalents
3143
- Activity: "activity",
3144
- Banknote: "banknote",
3145
- Bell: "bell",
3146
- BookOpen: "book-open",
3147
- Box: "box",
3148
- Briefcase: "briefcase",
3149
- Calendar: "calendar",
3150
- CheckSquare: "check-square",
3151
- DollarSign: "dollar-sign",
3152
- // Lucide PascalCase → the `-lucide` kebab variant (kebab default is the
3153
- // brand icon for the social-platform names below).
3154
- Facebook: "facebook-lucide",
3155
- FileText: "file-text",
3156
- Github: "github-lucide",
3157
- Globe: "globe",
3158
- GraduationCap: "graduation-cap",
3159
- Headphones: "headphones",
3160
- Info: "info",
3161
- Instagram: "instagram-lucide",
3162
- Mail: "mail",
3163
- Megaphone: "megaphone",
3164
- MessageCircle: "message-circle",
3165
- MessageSquare: "message-square",
3166
- Newspaper: "newspaper",
3167
- Package: "package",
3168
- PenSquare: "pen-square",
3169
- Rocket: "rocket",
3170
- Search: "search",
3171
- Send: "send",
3172
- Shield: "shield",
3173
- Star: "star",
3174
- TableProperties: "table",
3175
- TrendingUp: "trending-up",
3176
- Twitter: "twitter",
3177
- Users: "users",
3178
- Video: "video",
3179
- Youtube: "youtube-lucide",
3180
- // Brand-icon PascalCase exports → kebab (kebab default is the brand)
3181
- SlackIcon: "slack",
3182
- GitHubIcon: "github",
3183
- ClickUpIcon: "clickup",
3184
- HubspotIcon: "hubspot",
3185
- LinkedInIcon: "linkedin",
3186
- FacebookIcon: "facebook",
3187
- InstagramIcon: "instagram",
3188
- YouTubeIcon: "youtube",
3189
- XLogo: "x",
3190
- OpenFrameLogo: "openframe"
3191
- };
3192
- function normalizeIconKey(key) {
3193
- return PASCAL_TO_KEBAB_ALIASES[key] ?? key;
3194
- }
3195
- function getIconComponent(iconName) {
3196
- if (!iconName) return FileText;
3197
- return ICON_REGISTRY[normalizeIconKey(iconName)] ?? FileText;
3198
- }
3199
- var SIZE_CLASSES = {
3200
- xs: "w-3 h-3",
3201
- // 12px
3202
- sm: "w-4 h-4",
3203
- // 16px
3204
- md: "w-6 h-6",
3205
- // 24px
3206
- lg: "w-8 h-8",
3207
- // 32px
3208
- xl: "w-12 h-12"
3209
- // 48px
3210
- };
3211
- var ICON_COLORS = {
3212
- linkedin: { color: "#0A66C2" },
3213
- facebook: { color: "#1877F2" },
3214
- youtube: { color: "#FF0000" }
3215
- };
3216
- function getDynamicIcon(iconName, size = "md", className) {
3217
- if (!iconName) {
3218
- console.warn("[getDynamicIcon] No iconName provided, using Globe fallback");
3219
- return createElement(Globe, { className: SIZE_CLASSES[size] });
3220
- }
3221
- const sizeClass = SIZE_CLASSES[size];
3222
- const finalClassName = className ? `${sizeClass} ${className}` : sizeClass;
3223
- const canonicalKey = normalizeIconKey(iconName);
3224
- const IconComponent = ICON_REGISTRY[canonicalKey];
3225
- if (IconComponent) {
3226
- const colorConfig = ICON_COLORS[canonicalKey] || {};
3227
- return createElement(IconComponent, { className: finalClassName, ...colorConfig });
3228
- }
3229
- console.error(
3230
- `[getDynamicIcon] Icon NOT found in registry: "${iconName}" (normalized to "${canonicalKey}"). Available icons:`,
3231
- Object.keys(ICON_REGISTRY)
3232
- );
3233
- return createElement(Globe, { className: finalClassName });
3234
- }
3235
-
3236
- // src/components/chat/utils/source-row-cta.ts
3237
- import { FileText as FileText2 } from "lucide-react";
3238
- init_cn();
3239
- function sanitizePath(path) {
3240
- return (path || "").replace(/[^a-zA-Z0-9/_\-.]/g, "");
3241
- }
3242
- function sourceRowCtxFromRuntime(runtime, surface = {}) {
3243
- return {
3244
- currentPlatform: runtime.source ?? null,
3245
- composeContentUrl: runtime.composeContentUrl,
3246
- docPlatformTargets: runtime.docPlatformTargets,
3247
- baseRoute: surface.baseRoute,
3248
- chipBasePlatform: surface.chipBasePlatform
3249
- };
3250
- }
3251
- function pickSourceIcon(sourceRepo, documentType) {
3252
- const iconName = sourceRepo ? getSourceIconName(sourceRepo) : void 0;
3253
- const icon = iconName ? getIconComponent(iconName) : FileText2;
3254
- const iconLabel = documentType ?? "Source";
3255
- return { icon, iconLabel };
3256
- }
3257
- var DOC_TABLE_TYPES = ["markdown", "data_room_doc"];
3258
- function shouldFallbackToPathNav(row) {
3259
- return !!row.documentType && DOC_TABLE_TYPES.includes(row.documentType);
3260
- }
3261
- function resolveSourceRowCTA(row, ctx = {}) {
3262
- const sourceRepo = row.sourceRepo ?? (row.documentType && ctx.tableIdForDocumentType ? ctx.tableIdForDocumentType(row.documentType) : null) ?? null;
3263
- const { icon, iconLabel } = pickSourceIcon(sourceRepo, row.documentType);
3264
- let href = null;
3265
- let targetPlatform = null;
3266
- const idValue = (row.id ?? "").trim();
3267
- if (row.path && shouldFallbackToPathNav(row) && !row.externalUrl) {
3268
- const safePath = sanitizePath(row.path);
3269
- if (safePath) {
3270
- const docTarget = row.documentType ? ctx.docPlatformTargets?.[row.documentType] : void 0;
3271
- if (docTarget) {
3272
- const seg = docTarget.basePath.split("/").filter(Boolean).join("/");
3273
- const base = `${getBaseUrl(docTarget.platform)}${seg ? `/${seg}` : ""}/`;
3274
- href = safeHref(new URL(safePath, base).toString()) ?? null;
3275
- targetPlatform = docTarget.platform;
3276
- } else if (ctx.chipBasePlatform) {
3277
- const base = `${getBaseUrl(ctx.chipBasePlatform)}/knowledge-base/`;
3278
- href = safeHref(new URL(safePath, base).toString()) ?? null;
3279
- targetPlatform = ctx.chipBasePlatform;
3280
- } else if (ctx.baseRoute) {
3281
- const synthetic = `https://_internal_.local${ctx.baseRoute.startsWith("/") ? ctx.baseRoute : "/" + ctx.baseRoute}/`;
3282
- const absolute = new URL(safePath, synthetic).toString();
3283
- href = safeHref(absolute.replace("https://_internal_.local", "")) ?? null;
3284
- targetPlatform = ctx.currentPlatform ?? null;
3285
- }
3286
- }
3287
- } else if (ctx.composeContentUrl && row.documentType && row.externalUrl) {
3288
- const composed = ctx.composeContentUrl({
3289
- type: row.documentType,
3290
- identifier: idValue,
3291
- externalUrl: row.externalUrl,
3292
- targetPlatform: row.targetPlatform ?? null
3293
- });
3294
- href = composed.href ? safeHref(composed.href) ?? null : null;
3295
- targetPlatform = composed.targetPlatform;
3296
- } else if (row.externalUrl) {
3297
- href = safeHref(row.externalUrl) ?? null;
3298
- targetPlatform = row.targetPlatform ?? null;
3299
- }
3300
- const askable = !!(idValue && row.documentType);
3301
- const chatRef = askable ? {
3302
- type: row.documentType,
3303
- ...sourceRepo ? { sourceRepo } : {},
3304
- id: idValue,
3305
- title: row.title,
3306
- url: href,
3307
- targetPlatform,
3308
- // Carry `path` so a downstream inline card (rendered from this
3309
- // chatRef on a subsequent turn) gets the same doc-tree-swap
3310
- // routing the chip already used. Without it, the Ask drill-in
3311
- // would resolve to a same-tab full-page nav even when an in-app
3312
- // path is available.
3313
- ...row.path ? { metadata: { path: row.path } } : {}
3314
- } : null;
3315
- return { icon, iconLabel, href, targetPlatform, askable, chatRef };
3316
- }
3317
- function resolveSourceIcon(input, ctx = {}) {
3318
- if (!input) return { Icon: FileText2, label: "Source" };
3319
- const { sourceRepo, documentType } = typeof input === "string" ? { sourceRepo: null, documentType: input } : input;
3320
- if (!sourceRepo && !documentType) return { Icon: FileText2, label: "Source" };
3321
- const resolvedRepo = sourceRepo ?? (documentType && ctx.tableIdForDocumentType ? ctx.tableIdForDocumentType(documentType) : null) ?? null;
3322
- const { icon, iconLabel } = pickSourceIcon(resolvedRepo, documentType);
3323
- return { Icon: icon, label: iconLabel };
3324
- }
3325
-
3326
2288
  // src/components/ui/page-actions.tsx
3327
2289
  init_cn();
3328
- import React11 from "react";
2290
+ import React10 from "react";
3329
2291
  init_button();
3330
- import { Fragment as Fragment5, jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
2292
+ import { Fragment as Fragment4, jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
3331
2293
  function actionKey(action, idx) {
3332
2294
  return `${action.label ?? action.ariaLabel ?? "action"}-${idx}`;
3333
2295
  }
@@ -3359,7 +2321,7 @@ function actionToMenuItems(action, idx) {
3359
2321
  }
3360
2322
  function renderActionButton(action, opts = {}) {
3361
2323
  if (action.iconAction) {
3362
- return /* @__PURE__ */ jsx17(
2324
+ return /* @__PURE__ */ jsx14(
3363
2325
  SplitButton,
3364
2326
  {
3365
2327
  variant: action.variant ?? void 0,
@@ -3377,18 +2339,18 @@ function renderActionButton(action, opts = {}) {
3377
2339
  );
3378
2340
  }
3379
2341
  if (action.submenu && action.submenu.length > 0) {
3380
- return /* @__PURE__ */ jsx17(
2342
+ return /* @__PURE__ */ jsx14(
3381
2343
  ActionsMenuDropdown,
3382
2344
  {
3383
2345
  groups: [{ items: action.submenu }],
3384
- customTrigger: /* @__PURE__ */ jsx17(
2346
+ customTrigger: /* @__PURE__ */ jsx14(
3385
2347
  Button,
3386
2348
  {
3387
2349
  variant: "outline",
3388
2350
  disabled: action.disabled,
3389
2351
  loading: action.loading,
3390
2352
  leftIcon: action.icon,
3391
- splitIcon: /* @__PURE__ */ jsx17(Chevron02DownIcon, { className: "h-4 w-4" }),
2353
+ splitIcon: /* @__PURE__ */ jsx14(Chevron02DownIcon, { className: "h-4 w-4" }),
3392
2354
  className: opts.fullWidth ? "flex-1" : void 0,
3393
2355
  children: action.label
3394
2356
  }
@@ -3398,8 +2360,8 @@ function renderActionButton(action, opts = {}) {
3398
2360
  }
3399
2361
  const isIconOnly = opts.iconOnly || !action.label || action.iconOnlyOnDesktop;
3400
2362
  if (isIconOnly) {
3401
- const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */ jsx17("span", { className: "inline-flex [&_svg]:!text-ods-text-primary", children: action.icon }) : action.icon;
3402
- return /* @__PURE__ */ jsx17(
2363
+ const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */ jsx14("span", { className: "inline-flex [&_svg]:!text-ods-text-primary", children: action.icon }) : action.icon;
2364
+ return /* @__PURE__ */ jsx14(
3403
2365
  Button,
3404
2366
  {
3405
2367
  variant: action.variant,
@@ -3415,7 +2377,7 @@ function renderActionButton(action, opts = {}) {
3415
2377
  }
3416
2378
  );
3417
2379
  }
3418
- return /* @__PURE__ */ jsx17(
2380
+ return /* @__PURE__ */ jsx14(
3419
2381
  Button,
3420
2382
  {
3421
2383
  variant: action.variant,
@@ -3440,12 +2402,12 @@ function PageActions({
3440
2402
  className
3441
2403
  }) {
3442
2404
  if (variant === "icon-buttons") {
3443
- return /* @__PURE__ */ jsx17(IconButtonsVariant, { actions, menuActions, selector, className });
2405
+ return /* @__PURE__ */ jsx14(IconButtonsVariant, { actions, menuActions, selector, className });
3444
2406
  }
3445
2407
  if (variant === "menu-primary") {
3446
- return /* @__PURE__ */ jsx17(MenuPrimaryVariant, { actions, menuActions: menuActions || [], selector, className });
2408
+ return /* @__PURE__ */ jsx14(MenuPrimaryVariant, { actions, menuActions: menuActions || [], selector, className });
3447
2409
  }
3448
- return /* @__PURE__ */ jsx17(PrimaryButtonsVariant, { actions, className });
2410
+ return /* @__PURE__ */ jsx14(PrimaryButtonsVariant, { actions, className });
3449
2411
  }
3450
2412
  function IconButtonsVariant({
3451
2413
  actions,
@@ -3458,13 +2420,13 @@ function IconButtonsVariant({
3458
2420
  const isSingleAction = actions.length === 1 && !actions[0].submenu?.length;
3459
2421
  const singleAction = isSingleAction ? actions[0] : null;
3460
2422
  const useSingleActionMobile = isSingleAction && !hasMenuActions;
3461
- return /* @__PURE__ */ jsxs14(Fragment5, { children: [
3462
- /* @__PURE__ */ jsxs14("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
2423
+ return /* @__PURE__ */ jsxs11(Fragment4, { children: [
2424
+ /* @__PURE__ */ jsxs11("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
3463
2425
  selector,
3464
- desktopActions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton(action) }, actionKey(action, idx))),
3465
- hasMenuActions && /* @__PURE__ */ jsx17(ActionsMenuDropdown, { groups: menuActions })
2426
+ desktopActions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton(action) }, actionKey(action, idx))),
2427
+ hasMenuActions && /* @__PURE__ */ jsx14(ActionsMenuDropdown, { groups: menuActions })
3466
2428
  ] }),
3467
- /* @__PURE__ */ jsx17("div", { className: cn("flex md:hidden", className), children: useSingleActionMobile && singleAction ? renderActionButton(singleAction, { iconOnly: true }) : /* @__PURE__ */ jsx17(
2429
+ /* @__PURE__ */ jsx14("div", { className: cn("flex md:hidden", className), children: useSingleActionMobile && singleAction ? renderActionButton(singleAction, { iconOnly: true }) : /* @__PURE__ */ jsx14(
3468
2430
  ActionsMenuDropdown,
3469
2431
  {
3470
2432
  groups: [
@@ -3485,9 +2447,9 @@ function PrimaryButtonsVariant({
3485
2447
  return 0;
3486
2448
  });
3487
2449
  const desktopActions = sortedActions.filter((a) => !a.showOnlyMobile);
3488
- return /* @__PURE__ */ jsxs14(Fragment5, { children: [
3489
- /* @__PURE__ */ jsx17("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: desktopActions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton(action) }, `desktop-${actionKey(action, idx)}`)) }),
3490
- /* @__PURE__ */ jsx17(MobileBottomActions, { actions: sortedActions })
2450
+ return /* @__PURE__ */ jsxs11(Fragment4, { children: [
2451
+ /* @__PURE__ */ jsx14("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: desktopActions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton(action) }, `desktop-${actionKey(action, idx)}`)) }),
2452
+ /* @__PURE__ */ jsx14(MobileBottomActions, { actions: sortedActions })
3491
2453
  ] });
3492
2454
  }
3493
2455
  function MenuPrimaryVariant({
@@ -3498,13 +2460,13 @@ function MenuPrimaryVariant({
3498
2460
  }) {
3499
2461
  const desktopActions = actions.filter((a) => !a.showOnlyMobile);
3500
2462
  const hasMenuActions = menuActions.some((g) => g.items.length > 0);
3501
- return /* @__PURE__ */ jsxs14(Fragment5, { children: [
3502
- /* @__PURE__ */ jsxs14("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
2463
+ return /* @__PURE__ */ jsxs11(Fragment4, { children: [
2464
+ /* @__PURE__ */ jsxs11("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
3503
2465
  selector,
3504
- hasMenuActions && /* @__PURE__ */ jsx17(ActionsMenuDropdown, { groups: menuActions }),
3505
- desktopActions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton({ ...action, variant: action.variant || "accent" }) }, `desktop-${actionKey(action, idx)}`))
2466
+ hasMenuActions && /* @__PURE__ */ jsx14(ActionsMenuDropdown, { groups: menuActions }),
2467
+ desktopActions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton({ ...action, variant: action.variant || "accent" }) }, `desktop-${actionKey(action, idx)}`))
3506
2468
  ] }),
3507
- /* @__PURE__ */ jsx17("div", { className: cn("flex md:hidden", className), children: /* @__PURE__ */ jsx17(
2469
+ /* @__PURE__ */ jsx14("div", { className: cn("flex md:hidden", className), children: /* @__PURE__ */ jsx14(
3508
2470
  ActionsMenuDropdown,
3509
2471
  {
3510
2472
  groups: [
@@ -3516,12 +2478,12 @@ function MenuPrimaryVariant({
3516
2478
  ] });
3517
2479
  }
3518
2480
  function MobileBottomActions({ actions }) {
3519
- return /* @__PURE__ */ jsx17("div", { className: cn(
2481
+ return /* @__PURE__ */ jsx14("div", { className: cn(
3520
2482
  "fixed md:hidden bottom-0 left-0 right-0 z-50",
3521
2483
  "bg-ods-card border-t border-ods-border",
3522
2484
  "flex items-start pt-6 pb-6 px-6",
3523
2485
  ACTIONS_GAP
3524
- ), children: actions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton(action, { fullWidth: !!action.label }) }, `mobile-${actionKey(action, idx)}`)) });
2486
+ ), children: actions.map((action, idx) => /* @__PURE__ */ jsx14(React10.Fragment, { children: renderActionButton(action, { fullWidth: !!action.label }) }, `mobile-${actionKey(action, idx)}`)) });
3525
2487
  }
3526
2488
  function usePageActionsBottomPadding(variant) {
3527
2489
  return variant === "primary-buttons" || variant === "menu-primary" ? "pb-40 md:pb-0" : "";
@@ -3529,17 +2491,17 @@ function usePageActionsBottomPadding(variant) {
3529
2491
 
3530
2492
  // src/components/ui/entity-image.tsx
3531
2493
  init_cn();
3532
- import React12 from "react";
3533
- import { jsx as jsx18 } from "react/jsx-runtime";
2494
+ import React11 from "react";
2495
+ import { jsx as jsx15 } from "react/jsx-runtime";
3534
2496
  function EntityImage({ src, alt, fallbackText, className }) {
3535
- const [imageFailed, setImageFailed] = React12.useState(false);
3536
- React12.useEffect(() => {
2497
+ const [imageFailed, setImageFailed] = React11.useState(false);
2498
+ React11.useEffect(() => {
3537
2499
  setImageFailed(false);
3538
2500
  }, [src]);
3539
2501
  const showFallback = imageFailed || !src;
3540
2502
  const initials = getFirstLastInitials(fallbackText ?? alt);
3541
2503
  if (showFallback) {
3542
- return /* @__PURE__ */ jsx18(
2504
+ return /* @__PURE__ */ jsx15(
3543
2505
  "div",
3544
2506
  {
3545
2507
  "aria-label": alt,
@@ -3551,7 +2513,7 @@ function EntityImage({ src, alt, fallbackText, className }) {
3551
2513
  }
3552
2514
  );
3553
2515
  }
3554
- return /* @__PURE__ */ jsx18(
2516
+ return /* @__PURE__ */ jsx15(
3555
2517
  "img",
3556
2518
  {
3557
2519
  src: src ?? void 0,
@@ -3570,9 +2532,9 @@ init_cn();
3570
2532
 
3571
2533
  // src/components/layout/back-button.tsx
3572
2534
  init_cn();
3573
- import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
2535
+ import { jsx as jsx16, jsxs as jsxs12 } from "react/jsx-runtime";
3574
2536
  function BackButton({ label = "Back", className, type = "button", ...props }) {
3575
- return /* @__PURE__ */ jsxs15(
2537
+ return /* @__PURE__ */ jsxs12(
3576
2538
  "button",
3577
2539
  {
3578
2540
  type,
@@ -3586,15 +2548,15 @@ function BackButton({ label = "Back", className, type = "button", ...props }) {
3586
2548
  ),
3587
2549
  ...props,
3588
2550
  children: [
3589
- /* @__PURE__ */ jsx19(Chevron02LeftIcon, { className: "size-6 shrink-0" }),
3590
- /* @__PURE__ */ jsx19("span", { className: "text-h4", children: label })
2551
+ /* @__PURE__ */ jsx16(Chevron02LeftIcon, { className: "size-6 shrink-0" }),
2552
+ /* @__PURE__ */ jsx16("span", { className: "text-h4", children: label })
3591
2553
  ]
3592
2554
  }
3593
2555
  );
3594
2556
  }
3595
2557
 
3596
2558
  // src/components/layout/title-block.tsx
3597
- import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
2559
+ import { jsx as jsx17, jsxs as jsxs13 } from "react/jsx-runtime";
3598
2560
  function TitleBlock({
3599
2561
  title,
3600
2562
  subtitle,
@@ -3609,7 +2571,7 @@ function TitleBlock({
3609
2571
  }) {
3610
2572
  const hasActions = actions && actions.length > 0;
3611
2573
  const hasMenuActions = !!menuActions && menuActions.some((g) => g.items.length > 0);
3612
- return /* @__PURE__ */ jsxs16(
2574
+ return /* @__PURE__ */ jsxs13(
3613
2575
  "div",
3614
2576
  {
3615
2577
  className: cn(
@@ -3626,8 +2588,8 @@ function TitleBlock({
3626
2588
  className
3627
2589
  ),
3628
2590
  children: [
3629
- /* @__PURE__ */ jsxs16("div", { className: "flex flex-col gap-[var(--spacing-system-xs)] flex-1 min-w-0", children: [
3630
- backButton && /* @__PURE__ */ jsx20(
2591
+ /* @__PURE__ */ jsxs13("div", { className: "flex flex-col gap-[var(--spacing-system-xs)] flex-1 min-w-0", children: [
2592
+ backButton && /* @__PURE__ */ jsx17(
3631
2593
  BackButton,
3632
2594
  {
3633
2595
  onClick: backButton.onClick,
@@ -3635,8 +2597,8 @@ function TitleBlock({
3635
2597
  className: "hidden md:inline-flex"
3636
2598
  }
3637
2599
  ),
3638
- image || subtitle ? /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-[var(--spacing-system-m)] min-w-0 w-full", children: [
3639
- image && /* @__PURE__ */ jsx20(
2600
+ image || subtitle ? /* @__PURE__ */ jsxs13("div", { className: "flex items-center gap-[var(--spacing-system-m)] min-w-0 w-full", children: [
2601
+ image && /* @__PURE__ */ jsx17(
3640
2602
  EntityImage,
3641
2603
  {
3642
2604
  src: image.src,
@@ -3644,13 +2606,13 @@ function TitleBlock({
3644
2606
  fallbackText: image.alt || title
3645
2607
  }
3646
2608
  ),
3647
- /* @__PURE__ */ jsxs16("div", { className: "flex flex-col justify-center min-w-0 flex-1", children: [
3648
- title && /* @__PURE__ */ jsx20("h1", { className: "text-h2 text-ods-text-primary truncate", title, children: title }),
3649
- subtitle && /* @__PURE__ */ jsx20("p", { className: "text-h6 text-ods-text-secondary truncate", title: subtitle, children: subtitle })
2609
+ /* @__PURE__ */ jsxs13("div", { className: "flex flex-col justify-center min-w-0 flex-1", children: [
2610
+ title && /* @__PURE__ */ jsx17("h1", { className: "text-h2 text-ods-text-primary truncate", title, children: title }),
2611
+ subtitle && /* @__PURE__ */ jsx17("p", { className: "text-h6 text-ods-text-secondary truncate", title: subtitle, children: subtitle })
3650
2612
  ] })
3651
- ] }) : title && /* @__PURE__ */ jsx20("h1", { className: "text-h2 text-ods-text-primary", children: title })
2613
+ ] }) : title && /* @__PURE__ */ jsx17("h1", { className: "text-h2 text-ods-text-primary", children: title })
3652
2614
  ] }),
3653
- (hasActions || hasMenuActions || selector) && /* @__PURE__ */ jsx20("div", { className: "flex gap-2 items-center shrink-0", children: /* @__PURE__ */ jsx20(
2615
+ (hasActions || hasMenuActions || selector) && /* @__PURE__ */ jsx17("div", { className: "flex gap-2 items-center shrink-0", children: /* @__PURE__ */ jsx17(
3654
2616
  PageActions,
3655
2617
  {
3656
2618
  variant: actionsVariant,
@@ -3666,7 +2628,7 @@ function TitleBlock({
3666
2628
 
3667
2629
  // src/components/layout/page-layout.tsx
3668
2630
  init_cn();
3669
- import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
2631
+ import { jsx as jsx18, jsxs as jsxs14 } from "react/jsx-runtime";
3670
2632
  function PageLayout({
3671
2633
  children,
3672
2634
  title,
@@ -3685,8 +2647,8 @@ function PageLayout({
3685
2647
  const hasActions = actions && actions.length > 0;
3686
2648
  const needsBottomPadding = hasActions && actionsVariant === "primary-buttons";
3687
2649
  const hasHeader = showHeader && (title || subtitle || image || backButton || hasActions || selector);
3688
- return /* @__PURE__ */ jsxs17("div", { className: cn("flex flex-col w-full", className), children: [
3689
- hasHeader && /* @__PURE__ */ jsx21(
2650
+ return /* @__PURE__ */ jsxs14("div", { className: cn("flex flex-col w-full", className), children: [
2651
+ hasHeader && /* @__PURE__ */ jsx18(
3690
2652
  TitleBlock,
3691
2653
  {
3692
2654
  title,
@@ -3700,78 +2662,31 @@ function PageLayout({
3700
2662
  variant: headerVariant
3701
2663
  }
3702
2664
  ),
3703
- /* @__PURE__ */ jsx21("div", { className: cn("flex flex-col flex-1 gap-[var(--spacing-system-l)]", needsBottomPadding && "pb-28 md:pb-0", contentClassName), children })
2665
+ /* @__PURE__ */ jsx18("div", { className: cn("flex flex-col flex-1 gap-[var(--spacing-system-l)]", needsBottomPadding && "pb-28 md:pb-0", contentClassName), children })
3704
2666
  ] });
3705
2667
  }
3706
2668
 
3707
2669
  // src/components/layout/article-detail-layout.tsx
3708
2670
  init_cn();
3709
- import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
2671
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
3710
2672
  function PageShell({ children, schemas, contentClassName }) {
3711
- return /* @__PURE__ */ jsxs18("main", { className: "bg-ods-bg min-h-screen", children: [
2673
+ return /* @__PURE__ */ jsxs15("main", { className: "bg-ods-bg min-h-screen", children: [
3712
2674
  schemas,
3713
- /* @__PURE__ */ jsx22("div", { className: cn("page-shell-content max-w-[1920px] mx-auto", contentClassName), children })
2675
+ /* @__PURE__ */ jsx19("div", { className: cn("page-shell-content max-w-[1920px] mx-auto", contentClassName), children })
3714
2676
  ] });
3715
2677
  }
3716
2678
  function ArticleDetailLayout({ children, schemas, contentClassName }) {
3717
- return /* @__PURE__ */ jsxs18("main", { className: "bg-ods-bg min-h-screen", children: [
2679
+ return /* @__PURE__ */ jsxs15("main", { className: "bg-ods-bg min-h-screen", children: [
3718
2680
  schemas,
3719
- /* @__PURE__ */ jsx22("div", { className: cn("max-w-[1280px] mx-auto px-6 md:px-20 py-6 md:py-10", contentClassName), children })
2681
+ /* @__PURE__ */ jsx19("div", { className: cn("max-w-[1280px] mx-auto px-6 md:px-20 py-6 md:py-10", contentClassName), children })
3720
2682
  ] });
3721
2683
  }
3722
2684
 
3723
- // src/utils/content-href.ts
3724
- var DEFAULT_CONTENT_SUFFIXES = {
3725
- onboarding_guide: "onboarding-guides",
3726
- product_release: "releases",
3727
- blog_post: "blog",
3728
- case_study: "case-studies",
3729
- customer_interview: "interviews",
3730
- investor_update: "investor-updates",
3731
- webinar: "webinars",
3732
- podcast: "podcasts",
3733
- event: "events",
3734
- // Author profile pages (`/authors/<slug>`) — identified by the profile
3735
- // slug. Mirrors the hub's `PUBLIC_URL_PATHS.author`, which derives from
3736
- // `AUTHORS_PATH` in the hub's `lib/utils/breadcrumbs.ts` (the hub-side
3737
- // SSOT for the segment).
3738
- author: "authors"
3739
- };
3740
- function lastPathSegment(url) {
3741
- try {
3742
- const pathname = new URL(url, "https://_.local").pathname;
3743
- const segs = pathname.split("/").filter(Boolean);
3744
- return segs.length > 0 ? segs[segs.length - 1] : null;
3745
- } catch {
3746
- return null;
3747
- }
3748
- }
3749
- function makeComposeContentUrl(opts) {
3750
- const suffixes = opts.suffixes ?? DEFAULT_CONTENT_SUFFIXES;
3751
- return ({ type, identifier, externalUrl, targetPlatform }) => {
3752
- const override = opts.overrides && Object.prototype.hasOwnProperty.call(opts.overrides, type) ? opts.overrides[type] : void 0;
3753
- if (override) return override(identifier);
3754
- const seg = (Object.prototype.hasOwnProperty.call(suffixes, type) ? suffixes[type] : void 0) ?? type;
3755
- if (opts.hostedTypes.has(type)) {
3756
- const recovered = externalUrl ? lastPathSegment(externalUrl) : null;
3757
- const slug = recovered && recovered !== seg ? recovered : identifier;
3758
- return { href: `/${seg}/${slug}`, targetPlatform: null };
3759
- }
3760
- return externalUrl ? { href: externalUrl, targetPlatform: targetPlatform ?? null } : { href: `${opts.contentOrigin}/${seg}/${identifier}`, targetPlatform: null };
3761
- };
3762
- }
3763
- function buildDefaultHref(basePath, slug) {
3764
- return { href: `${basePath}/${slug}`, targetPlatform: null };
3765
- }
3766
- function resolveContentHref(composeContentUrl, args) {
3767
- return composeContentUrl ? composeContentUrl({ type: args.type, identifier: args.slug, platforms: args.platforms }) : buildDefaultHref(args.basePath, args.slug);
3768
- }
3769
-
3770
2685
  // src/components/ui/error-state.tsx
3771
2686
  init_button();
3772
2687
  init_cn();
3773
2688
  import { AlertTriangle, RefreshCw, Home } from "lucide-react";
3774
- import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
2689
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
3775
2690
  function ErrorState({
3776
2691
  title = "Error",
3777
2692
  message,
@@ -3810,36 +2725,36 @@ function ErrorState({
3810
2725
  }
3811
2726
  };
3812
2727
  const styles = getVariantStyles();
3813
- return /* @__PURE__ */ jsx23("div", { className: cn("p-6", containerClassName), children: /* @__PURE__ */ jsx23("div", { className: cn(
2728
+ return /* @__PURE__ */ jsx20("div", { className: cn("p-6", containerClassName), children: /* @__PURE__ */ jsx20("div", { className: cn(
3814
2729
  "rounded-lg p-4 border",
3815
2730
  styles.bg,
3816
2731
  styles.border,
3817
2732
  className
3818
- ), children: /* @__PURE__ */ jsxs19("div", { className: "flex items-start gap-3", children: [
3819
- showIcon && /* @__PURE__ */ jsx23(AlertTriangle, { className: cn("h-5 w-5 mt-0.5 flex-shrink-0", styles.icon) }),
3820
- /* @__PURE__ */ jsxs19("div", { className: "flex-1", children: [
3821
- /* @__PURE__ */ jsx23("h3", { className: cn("font-semibold mb-1", styles.text), children: title }),
3822
- /* @__PURE__ */ jsx23("p", { className: cn("text-sm", styles.text), children: message }),
3823
- (showRetry || showHome) && /* @__PURE__ */ jsxs19("div", { className: "flex gap-2 mt-3", children: [
3824
- showRetry && onRetry && /* @__PURE__ */ jsx23(
2733
+ ), children: /* @__PURE__ */ jsxs16("div", { className: "flex items-start gap-3", children: [
2734
+ showIcon && /* @__PURE__ */ jsx20(AlertTriangle, { className: cn("h-5 w-5 mt-0.5 flex-shrink-0", styles.icon) }),
2735
+ /* @__PURE__ */ jsxs16("div", { className: "flex-1", children: [
2736
+ /* @__PURE__ */ jsx20("h3", { className: cn("font-semibold mb-1", styles.text), children: title }),
2737
+ /* @__PURE__ */ jsx20("p", { className: cn("text-sm", styles.text), children: message }),
2738
+ (showRetry || showHome) && /* @__PURE__ */ jsxs16("div", { className: "flex gap-2 mt-3", children: [
2739
+ showRetry && onRetry && /* @__PURE__ */ jsx20(
3825
2740
  Button,
3826
2741
  {
3827
2742
  onClick: onRetry,
3828
2743
  variant: "outline",
3829
2744
  size: "small-legacy",
3830
2745
  className: "h-8",
3831
- leftIcon: /* @__PURE__ */ jsx23(RefreshCw, { className: "h-4 w-4" }),
2746
+ leftIcon: /* @__PURE__ */ jsx20(RefreshCw, { className: "h-4 w-4" }),
3832
2747
  children: "Try Again"
3833
2748
  }
3834
2749
  ),
3835
- showHome && onHome && /* @__PURE__ */ jsx23(
2750
+ showHome && onHome && /* @__PURE__ */ jsx20(
3836
2751
  Button,
3837
2752
  {
3838
2753
  onClick: onHome,
3839
2754
  variant: "outline",
3840
2755
  size: "small-legacy",
3841
2756
  className: "h-8",
3842
- leftIcon: /* @__PURE__ */ jsx23(Home, { className: "h-4 w-4" }),
2757
+ leftIcon: /* @__PURE__ */ jsx20(Home, { className: "h-4 w-4" }),
3843
2758
  children: "Go Home"
3844
2759
  }
3845
2760
  )
@@ -3848,7 +2763,7 @@ function ErrorState({
3848
2763
  ] }) }) });
3849
2764
  }
3850
2765
  function PageError({ message, onRetry, onHome }) {
3851
- return /* @__PURE__ */ jsx23(
2766
+ return /* @__PURE__ */ jsx20(
3852
2767
  ErrorState,
3853
2768
  {
3854
2769
  title: "Page Error",
@@ -3862,7 +2777,7 @@ function PageError({ message, onRetry, onHome }) {
3862
2777
  );
3863
2778
  }
3864
2779
  function LoadError({ message, onRetry }) {
3865
- return /* @__PURE__ */ jsx23(
2780
+ return /* @__PURE__ */ jsx20(
3866
2781
  ErrorState,
3867
2782
  {
3868
2783
  title: "Loading Error",
@@ -3874,7 +2789,7 @@ function LoadError({ message, onRetry }) {
3874
2789
  );
3875
2790
  }
3876
2791
  function NotFoundError({ message = "The requested item was not found", onHome }) {
3877
- return /* @__PURE__ */ jsx23(
2792
+ return /* @__PURE__ */ jsx20(
3878
2793
  ErrorState,
3879
2794
  {
3880
2795
  title: "Not Found",
@@ -3888,7 +2803,7 @@ function NotFoundError({ message = "The requested item was not found", onHome })
3888
2803
 
3889
2804
  // src/components/features/entity-tag-badges.tsx
3890
2805
  import Link from "next/link";
3891
- import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
2806
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
3892
2807
  var TAG_BADGE_CLASS = "bg-ods-card border border-ods-border";
3893
2808
  var BADGE_CLASS = TAG_BADGE_CLASS;
3894
2809
  function EntityTagBadges({ tags, basePath, max, className }) {
@@ -3897,12 +2812,12 @@ function EntityTagBadges({ tags, basePath, max, className }) {
3897
2812
  const visibleLimit = max == null ? items.length : Math.max(0, max);
3898
2813
  const shown = items.slice(0, visibleLimit);
3899
2814
  const overflow = items.length - shown.length;
3900
- return /* @__PURE__ */ jsxs20("div", { className: `flex flex-wrap items-center gap-2 w-full ${className || ""}`, children: [
2815
+ return /* @__PURE__ */ jsxs17("div", { className: `flex flex-wrap items-center gap-2 w-full ${className || ""}`, children: [
3901
2816
  shown.map((tag) => {
3902
2817
  const key = tag.tag_id ?? tag.id ?? tag.slug ?? tag.name;
3903
2818
  const label = (tag.name || "").toUpperCase();
3904
2819
  if (basePath && tag.slug) {
3905
- return /* @__PURE__ */ jsx24(Link, { href: `${basePath}?tags=${tag.slug}`, className: "inline-flex", children: /* @__PURE__ */ jsx24(
2820
+ return /* @__PURE__ */ jsx21(Link, { href: `${basePath}?tags=${tag.slug}`, className: "inline-flex", children: /* @__PURE__ */ jsx21(
3906
2821
  StatusBadge,
3907
2822
  {
3908
2823
  text: label,
@@ -3911,9 +2826,9 @@ function EntityTagBadges({ tags, basePath, max, className }) {
3911
2826
  }
3912
2827
  ) }, key);
3913
2828
  }
3914
- return /* @__PURE__ */ jsx24(StatusBadge, { text: label, variant: "card", className: BADGE_CLASS }, key);
2829
+ return /* @__PURE__ */ jsx21(StatusBadge, { text: label, variant: "card", className: BADGE_CLASS }, key);
3915
2830
  }),
3916
- overflow > 0 && /* @__PURE__ */ jsx24(StatusBadge, { text: `+${overflow}`, variant: "card", className: `${BADGE_CLASS} text-ods-text-secondary` })
2831
+ overflow > 0 && /* @__PURE__ */ jsx21(StatusBadge, { text: `+${overflow}`, variant: "card", className: `${BADGE_CLASS} text-ods-text-secondary` })
3917
2832
  ] });
3918
2833
  }
3919
2834
 
@@ -3985,403 +2900,10 @@ function getCaptionsUrl(entityType, entityId, srtContent) {
3985
2900
  return `/api/captions/${entityType}/${entityId}?v=${hash}`;
3986
2901
  }
3987
2902
 
3988
- // src/components/ui/search-input.tsx
3989
- init_cn();
3990
- import * as PopoverPrimitive from "@radix-ui/react-popover";
3991
- import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
3992
- import * as React13 from "react";
3993
- import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
3994
- var containerStyles = cn(
3995
- // Layout & spacing — matches lib Input component
3996
- "flex items-center gap-2 rounded-[6px] border px-3 h-11 md:h-12 cursor-text",
3997
- "has-[:focus-visible]:outline-none",
3998
- "group",
3999
- "transition-colors duration-200",
4000
- // Theme palette — matches lib Input component
4001
- "bg-ods-card border-ods-border has-[:focus]:border-ods-accent"
4002
- );
4003
- var innerInputStyles = cn(
4004
- "flex-1 min-w-[60px] bg-transparent border-none outline-none",
4005
- "text-h4",
4006
- "text-ods-text-primary placeholder:text-ods-text-secondary",
4007
- "disabled:cursor-not-allowed",
4008
- "touch-manipulation"
4009
- );
4010
- function chipVariantToTagVariant(variant) {
4011
- switch (variant) {
4012
- case "selected":
4013
- return "primary";
4014
- // Content tags render with the unified badge skin (ods-card + ods-border,
4015
- // mono uppercase) — identical to the public EntityTagBadges display.
4016
- case "tag":
4017
- return "badge";
4018
- case "category":
4019
- case "subcategory":
4020
- default:
4021
- return "outline";
4022
- }
4023
- }
4024
- function SearchInput({
4025
- placeholder = "Search...",
4026
- value,
4027
- defaultValue = "",
4028
- onChange,
4029
- onSubmit,
4030
- results = [],
4031
- isLoading = false,
4032
- onResultSelect,
4033
- debounceMs = 300,
4034
- renderResult,
4035
- groupBy,
4036
- emptyResultsText = "No results found",
4037
- showDropdown: showDropdownProp,
4038
- filterChips = [],
4039
- onFilterRemove,
4040
- startAdornment,
4041
- endAdornment,
4042
- className,
4043
- dropdownClassName,
4044
- minQueryLength = 2,
4045
- limitTags = "auto",
4046
- getLimitTagsText = (more) => `+${more}`
4047
- }) {
4048
- const [internalValue, setInternalValue] = React13.useState(defaultValue);
4049
- const currentValue = onChange ? value ?? "" : internalValue;
4050
- const debouncedValue = useDebounce(currentValue, debounceMs);
4051
- const [isOpen, setIsOpen] = React13.useState(false);
4052
- const [highlightedIndex, setHighlightedIndex] = React13.useState(-1);
4053
- const containerRef = React13.useRef(null);
4054
- const currentPlaceholder = filterChips.length > 0 ? "Add filter..." : placeholder;
4055
- const {
4056
- visibleCount: rawVisibleCount,
4057
- middleRef,
4058
- measureRef,
4059
- textMeasureRef,
4060
- badgeRef,
4061
- inputRef
4062
- } = useAutoLimitTags({
4063
- count: filterChips.length,
4064
- limitTags,
4065
- // When chips exist, pass empty placeholder so the hook only reserves input minWidth,
4066
- // not the full placeholder text width — gives more room for chips on narrow screens
4067
- placeholder: filterChips.length > 0 ? "" : placeholder
4068
- });
4069
- const visibleCount = filterChips.length > 0 ? Math.max(1, rawVisibleCount) : rawVisibleCount;
4070
- const hiddenTagsRef = React13.useRef(null);
4071
- const hiddenTagsPopupRef = React13.useRef(null);
4072
- const [showHiddenTags, setShowHiddenTags] = React13.useState(false);
4073
- React13.useEffect(() => {
4074
- if (!showHiddenTags) return;
4075
- const handleClick = (e) => {
4076
- const target = e.target;
4077
- if (!hiddenTagsRef.current?.contains(target) && !hiddenTagsPopupRef.current?.contains(target)) {
4078
- setShowHiddenTags(false);
4079
- }
4080
- };
4081
- document.addEventListener("mousedown", handleClick);
4082
- return () => document.removeEventListener("mousedown", handleClick);
4083
- }, [showHiddenTags]);
4084
- const hiddenCount = filterChips.length - visibleCount;
4085
- const visibleChips = filterChips.slice(0, visibleCount);
4086
- const hiddenChips = filterChips.slice(visibleCount);
4087
- const { flatResults, groups } = React13.useMemo(() => {
4088
- if (!groupBy) return { flatResults: results, groups: null };
4089
- const grouped = /* @__PURE__ */ new Map();
4090
- for (const r of results) {
4091
- const key = groupBy(r);
4092
- const arr = grouped.get(key);
4093
- if (arr) {
4094
- arr.push(r);
4095
- } else {
4096
- grouped.set(key, [r]);
4097
- }
4098
- }
4099
- return { flatResults: results, groups: grouped };
4100
- }, [results, groupBy]);
4101
- const meetsMinQuery = debouncedValue.length >= minQueryLength;
4102
- const autoShow = meetsMinQuery;
4103
- const dropdownVisible = showDropdownProp ?? (isOpen && autoShow);
4104
- React13.useEffect(() => {
4105
- setHighlightedIndex(-1);
4106
- }, [flatResults.length]);
4107
- const handleChange = (e) => {
4108
- const newVal = e.target.value;
4109
- if (onChange) {
4110
- onChange(newVal);
4111
- } else {
4112
- setInternalValue(newVal);
4113
- }
4114
- if (!isOpen) setIsOpen(true);
4115
- setHighlightedIndex(-1);
4116
- };
4117
- const handleClear = (e) => {
4118
- e.stopPropagation();
4119
- e.preventDefault();
4120
- if (onChange) {
4121
- onChange("");
4122
- } else {
4123
- setInternalValue("");
4124
- }
4125
- inputRef.current?.focus();
4126
- };
4127
- const handleResultClick = (result, e) => {
4128
- onResultSelect?.(
4129
- result,
4130
- e ? {
4131
- metaKey: e.metaKey,
4132
- ctrlKey: e.ctrlKey,
4133
- shiftKey: e.shiftKey,
4134
- altKey: e.altKey,
4135
- button: e.button
4136
- } : void 0
4137
- );
4138
- setIsOpen(false);
4139
- };
4140
- const handleKeyDown = (e) => {
4141
- switch (e.key) {
4142
- case "ArrowDown":
4143
- e.preventDefault();
4144
- if (!isOpen) setIsOpen(true);
4145
- setHighlightedIndex(
4146
- (prev) => prev < flatResults.length - 1 ? prev + 1 : 0
4147
- );
4148
- break;
4149
- case "ArrowUp":
4150
- e.preventDefault();
4151
- setHighlightedIndex(
4152
- (prev) => prev > 0 ? prev - 1 : flatResults.length - 1
4153
- );
4154
- break;
4155
- case "Enter":
4156
- e.preventDefault();
4157
- if (highlightedIndex >= 0 && flatResults[highlightedIndex]) {
4158
- handleResultClick(flatResults[highlightedIndex]);
4159
- } else {
4160
- onSubmit?.(currentValue);
4161
- }
4162
- break;
4163
- case "Escape":
4164
- setIsOpen(false);
4165
- setHighlightedIndex(-1);
4166
- break;
4167
- case "Backspace":
4168
- if (!currentValue && filterChips.length > 0 && onFilterRemove) {
4169
- onFilterRemove(filterChips[filterChips.length - 1].id);
4170
- }
4171
- break;
4172
- }
4173
- };
4174
- const handleOpenChange = (open) => {
4175
- setIsOpen(open);
4176
- };
4177
- const defaultRenderResult = (result, isHighlighted) => /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-3 w-full min-w-0", children: [
4178
- result.icon && /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-ods-text-secondary [&_svg]:size-4", children: result.icon }),
4179
- /* @__PURE__ */ jsxs21("div", { className: "min-w-0 flex-1", children: [
4180
- /* @__PURE__ */ jsx25("div", { className: cn(
4181
- "text-sm font-medium leading-5 truncate",
4182
- isHighlighted ? "text-ods-accent" : "text-ods-text-primary"
4183
- ), title: result.title, children: result.title }),
4184
- result.description && /* @__PURE__ */ jsx25("div", { className: "text-xs leading-4 text-ods-text-secondary truncate mt-0.5", title: result.description, children: result.description })
4185
- ] }),
4186
- result.type && /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-[11px] font-medium text-ods-text-muted uppercase tracking-wider", children: result.type })
4187
- ] });
4188
- const renderRow = (result, index) => {
4189
- const isHighlighted = index === highlightedIndex;
4190
- return /* @__PURE__ */ jsx25(
4191
- "div",
4192
- {
4193
- role: "option",
4194
- "aria-selected": isHighlighted,
4195
- className: cn(
4196
- "flex items-center min-h-10 px-3 cursor-pointer transition-colors border-b border-ods-border last:border-b-0",
4197
- isHighlighted && "bg-ods-bg-hover",
4198
- !isHighlighted && "hover:bg-ods-bg-hover"
4199
- ),
4200
- onClick: (e) => handleResultClick(result, e),
4201
- onMouseEnter: () => setHighlightedIndex(index),
4202
- children: renderResult ? renderResult(result, isHighlighted) : defaultRenderResult(result, isHighlighted)
4203
- },
4204
- result.id
4205
- );
4206
- };
4207
- const renderDropdownContent = () => {
4208
- if (isLoading) {
4209
- return /* @__PURE__ */ jsx25("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: "Loading..." });
4210
- }
4211
- if (flatResults.length === 0) {
4212
- return /* @__PURE__ */ jsx25("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: emptyResultsText });
4213
- }
4214
- if (groups) {
4215
- let globalIndex = 0;
4216
- return Array.from(groups.entries()).map(([groupLabel, groupResults]) => /* @__PURE__ */ jsxs21("div", { children: [
4217
- /* @__PURE__ */ jsx25("div", { className: "px-4 py-2 text-[12px] font-semibold text-ods-text-secondary uppercase tracking-wide bg-ods-bg", children: groupLabel }),
4218
- groupResults.map((result) => {
4219
- const idx = globalIndex++;
4220
- return renderRow(result, idx);
4221
- })
4222
- ] }, groupLabel));
4223
- }
4224
- return flatResults.map((result, index) => renderRow(result, index));
4225
- };
4226
- const hasValue = currentValue.length > 0;
4227
- return /* @__PURE__ */ jsxs21("div", { className: cn("relative", className), ref: containerRef, children: [
4228
- /* @__PURE__ */ jsxs21(PopoverPrimitive.Root, { open: dropdownVisible, onOpenChange: handleOpenChange, modal: false, children: [
4229
- /* @__PURE__ */ jsx25(PopoverPrimitive.Anchor, { asChild: true, children: /* @__PURE__ */ jsxs21(
4230
- "div",
4231
- {
4232
- className: cn(
4233
- containerStyles,
4234
- "hover:bg-ods-bg-hover hover:border-ods-border-hover active:bg-ods-bg-active active:border-ods-border-active",
4235
- dropdownVisible && "!border-ods-accent"
4236
- ),
4237
- onClick: () => {
4238
- inputRef.current?.focus();
4239
- setIsOpen(true);
4240
- },
4241
- children: [
4242
- /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-ods-text-secondary transition-colors duration-200 group-has-[:focus]:text-ods-accent [&_svg]:size-4 md:[&_svg]:size-6", children: startAdornment !== void 0 ? startAdornment : /* @__PURE__ */ jsx25(SearchIcon, {}) }),
4243
- /* @__PURE__ */ jsxs21("div", { ref: middleRef, className: "flex-1 flex items-center gap-2 min-w-0 overflow-hidden", children: [
4244
- visibleChips.map((chip) => /* @__PURE__ */ jsx25(
4245
- Tag,
4246
- {
4247
- variant: chipVariantToTagVariant(chip.variant),
4248
- label: chip.label,
4249
- labelClassName: "truncate max-w-[120px]",
4250
- onClose: onFilterRemove ? () => onFilterRemove(chip.id) : void 0
4251
- },
4252
- chip.id
4253
- )),
4254
- hiddenCount > 0 && /* @__PURE__ */ jsx25("div", { ref: hiddenTagsRef, className: "shrink-0", children: /* @__PURE__ */ jsx25(
4255
- "button",
4256
- {
4257
- ref: badgeRef,
4258
- type: "button",
4259
- onClick: (e) => {
4260
- e.stopPropagation();
4261
- setShowHiddenTags((prev) => !prev);
4262
- },
4263
- className: cn(
4264
- "flex items-center h-8 px-2",
4265
- "bg-ods-card border border-ods-border rounded-[6px]",
4266
- "font-mono text-[14px] font-medium leading-5 text-ods-text-secondary uppercase tracking-[-0.28px]",
4267
- "hover:bg-ods-bg-hover transition-colors cursor-pointer"
4268
- ),
4269
- "aria-label": `${hiddenCount} more selected filters`,
4270
- children: getLimitTagsText(hiddenCount)
4271
- }
4272
- ) }),
4273
- /* @__PURE__ */ jsx25(
4274
- "input",
4275
- {
4276
- ref: inputRef,
4277
- type: "text",
4278
- value: currentValue,
4279
- onChange: handleChange,
4280
- onKeyDown: handleKeyDown,
4281
- onFocus: () => {
4282
- setIsOpen(true);
4283
- setShowHiddenTags(false);
4284
- },
4285
- placeholder: currentPlaceholder,
4286
- className: innerInputStyles
4287
- }
4288
- )
4289
- ] }),
4290
- /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-1 shrink-0 ml-auto", children: [
4291
- hasValue && /* @__PURE__ */ jsx25(
4292
- "button",
4293
- {
4294
- type: "button",
4295
- onClick: handleClear,
4296
- className: "flex items-center justify-center hover:opacity-70 transition-opacity",
4297
- "aria-label": "Clear search",
4298
- children: /* @__PURE__ */ jsx25(XmarkCircleIcon, { className: "text-ods-text-secondary", size: 24 })
4299
- }
4300
- ),
4301
- endAdornment
4302
- ] })
4303
- ]
4304
- }
4305
- ) }),
4306
- /* @__PURE__ */ jsx25(
4307
- PopoverPrimitive.Content,
4308
- {
4309
- className: cn(
4310
- "z-50 w-[var(--radix-popover-trigger-width)] mt-1",
4311
- "bg-ods-card border border-ods-border rounded-[6px] overflow-hidden shadow-lg",
4312
- "data-[state=open]:animate-in data-[state=closed]:animate-out",
4313
- "data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
4314
- "data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95",
4315
- "data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2",
4316
- dropdownClassName
4317
- ),
4318
- sideOffset: 4,
4319
- align: "start",
4320
- onOpenAutoFocus: (e) => {
4321
- e.preventDefault();
4322
- inputRef.current?.focus();
4323
- },
4324
- onInteractOutside: (e) => {
4325
- if (containerRef.current?.contains(e.target)) {
4326
- e.preventDefault();
4327
- }
4328
- },
4329
- children: /* @__PURE__ */ jsxs21(ScrollAreaPrimitive.Root, { className: "overflow-hidden", children: [
4330
- /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Viewport, { className: "max-h-[320px] w-full", children: /* @__PURE__ */ jsx25("div", { role: "listbox", children: renderDropdownContent() }) }),
4331
- /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Scrollbar, { className: "hidden", orientation: "vertical", children: /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Thumb, {}) })
4332
- ] })
4333
- }
4334
- )
4335
- ] }),
4336
- showHiddenTags && hiddenCount > 0 && /* @__PURE__ */ jsx25(
4337
- HiddenTagsPopup,
4338
- {
4339
- ref: hiddenTagsPopupRef,
4340
- items: hiddenChips.map((chip) => ({ label: chip.label, value: chip.id })),
4341
- style: {
4342
- left: badgeRef.current ? badgeRef.current.getBoundingClientRect().left - (containerRef.current?.getBoundingClientRect().left ?? 0) : 0
4343
- },
4344
- onRemove: (value2) => {
4345
- onFilterRemove?.(value2);
4346
- if (hiddenCount <= 1) setShowHiddenTags(false);
4347
- }
4348
- }
4349
- ),
4350
- /* @__PURE__ */ jsx25(
4351
- "span",
4352
- {
4353
- ref: textMeasureRef,
4354
- "aria-hidden": "true",
4355
- className: "fixed -left-[9999px] top-0 pointer-events-none whitespace-nowrap text-ods-text-primary",
4356
- children: currentPlaceholder
4357
- }
4358
- ),
4359
- /* @__PURE__ */ jsx25(
4360
- "div",
4361
- {
4362
- ref: measureRef,
4363
- "aria-hidden": "true",
4364
- className: "fixed -left-[9999px] top-0 flex gap-2 pointer-events-none",
4365
- children: filterChips.map((chip) => /* @__PURE__ */ jsx25(
4366
- Tag,
4367
- {
4368
- variant: chipVariantToTagVariant(chip.variant),
4369
- label: chip.label,
4370
- labelClassName: "truncate max-w-[120px]",
4371
- onClose: () => {
4372
- }
4373
- },
4374
- `m-${chip.id}`
4375
- ))
4376
- }
4377
- )
4378
- ] });
4379
- }
4380
-
4381
2903
  // src/components/ui/filter-pill-row.tsx
4382
2904
  init_button();
4383
2905
  import { Filter } from "lucide-react";
4384
- import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
2906
+ import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
4385
2907
  function FilterPillRow({
4386
2908
  label,
4387
2909
  selectedValue,
@@ -4390,12 +2912,12 @@ function FilterPillRow({
4390
2912
  countLabel,
4391
2913
  children
4392
2914
  }) {
4393
- return /* @__PURE__ */ jsxs22("div", { className: "flex flex-wrap items-center gap-3 p-4 bg-ods-card border border-ods-border rounded-lg", children: [
4394
- /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
4395
- /* @__PURE__ */ jsx26(Filter, { className: "h-4 w-4 text-ods-accent" }),
4396
- /* @__PURE__ */ jsx26("span", { className: "text-h5 text-ods-text-secondary", children: label })
2915
+ return /* @__PURE__ */ jsxs18("div", { className: "flex flex-wrap items-center gap-3 p-4 bg-ods-card border border-ods-border rounded-lg", children: [
2916
+ /* @__PURE__ */ jsxs18("div", { className: "flex items-center gap-2", children: [
2917
+ /* @__PURE__ */ jsx22(Filter, { className: "h-4 w-4 text-ods-accent" }),
2918
+ /* @__PURE__ */ jsx22("span", { className: "text-h5 text-ods-text-secondary", children: label })
4397
2919
  ] }),
4398
- children || options.map((opt) => /* @__PURE__ */ jsx26(
2920
+ children || options.map((opt) => /* @__PURE__ */ jsx22(
4399
2921
  Button,
4400
2922
  {
4401
2923
  type: "button",
@@ -4407,14 +2929,11 @@ function FilterPillRow({
4407
2929
  },
4408
2930
  opt.value
4409
2931
  )),
4410
- countLabel && /* @__PURE__ */ jsx26("div", { className: "ml-auto text-[12px] font-['DM_Sans'] text-ods-text-secondary shrink-0", children: countLabel })
2932
+ countLabel && /* @__PURE__ */ jsx22("div", { className: "ml-auto text-[12px] font-['DM_Sans'] text-ods-text-secondary shrink-0", children: countLabel })
4411
2933
  ] });
4412
2934
  }
4413
2935
 
4414
2936
  export {
4415
- HiddenTagsPopup,
4416
- tagVariants,
4417
- Tag,
4418
2937
  Card,
4419
2938
  CardHeader,
4420
2939
  CardTitle,
@@ -4429,65 +2948,20 @@ export {
4429
2948
  statusBadgeVariants,
4430
2949
  StatusBadge,
4431
2950
  SimpleMarkdownRenderer,
4432
- formatDate,
4433
- formatNumber,
4434
- formatPrice,
4435
- formatBytes,
4436
- formatBytesShort,
4437
- formatLargeNumber,
4438
- formatAbbreviatedNumber,
4439
- getFirstLastInitials,
4440
- nameInitials,
4441
- formatDurationMMSS,
4442
- formatDurationCompact,
4443
- formatTimeWithTimezone,
4444
- formatDurationFromRange,
4445
- formatDateUTC,
4446
- formatEntryMonthUTC,
4447
- formatLegalDate,
4448
- formatCurrency,
4449
- formatPercent,
4450
- formatWholeDollars,
4451
- formatCompactMetric,
4452
- getTrendColors,
4453
- formatDateRange,
4454
- formatDateTimeAt,
4455
- formatDurationFromMs,
4456
- formatDuration,
4457
- formatUnderscoreText,
4458
- stripHtml,
4459
- formatClassification,
4460
- formatPricingModel,
4461
- formatBioText,
4462
2951
  SquareAvatar,
4463
2952
  useControllableState,
4464
2953
  ActionsMenu,
4465
2954
  ActionsMenuDropdown,
4466
- getProxiedImageUrl,
4467
- urlPathLooksLikeSvg,
4468
- shouldProxyImage,
4469
- generateImageSizes,
4470
- isCrossOriginUrl,
4471
- decideNewTab,
4472
2955
  computeIsNewTab,
4473
2956
  newTabAnchorAttrs,
4474
2957
  buildAnchorProps,
4475
- NEW_TAB_FEATURES,
4476
- isModifierClick,
4477
- stripSameOriginToPath,
4478
- resolveHrefForRuntime,
4479
- resolveExternalNavigation,
4480
2958
  EMPTY_AUTHOR_PLACEHOLDER,
4481
2959
  EntityMetadataValueCell,
4482
2960
  EntityMetadataAuthorCell,
4483
2961
  EntityAuthorCard,
4484
2962
  BlogImagePlaceholder,
4485
- fetchPriorityProp,
4486
2963
  extractYouTubeId,
4487
2964
  Video,
4488
- PAGE_HEADING_CLASS,
4489
- SECTION_HEADING_CLASS,
4490
- PageHeading,
4491
2965
  RATIO_GRID_CLASS,
4492
2966
  RATIO_DISPLAY_GRID_CLASS,
4493
2967
  RatioTabs,
@@ -4499,36 +2973,8 @@ export {
4499
2973
  EntityVideoSection,
4500
2974
  useEntityCardLink,
4501
2975
  useEntityCardPlaceholder,
4502
- COMPACT_CARD_OUTER,
4503
- COMPACT_CARD_OUTER_STATIC,
4504
- COMPACT_CARD_SKELETON_OUTER,
4505
- COMPACT_CARD_IMAGE_SLOT,
4506
- COMPACT_CARD_SKELETON_IMAGE_SLOT,
4507
- COMPACT_CARD_ICON_SLOT,
4508
- COMPACT_CARD_TEXT_COL,
4509
- COMPACT_CARD_TITLE_ROW,
4510
- COMPACT_CARD_META_ROW_BOX,
4511
- COMPACT_CARD_TITLE,
4512
- COMPACT_CARD_SUBTITLE,
4513
- COMPACT_CARD_SUMMARY,
4514
- COMPACT_CARD_META_ROW,
4515
- COMPACT_CARD_ROW_FILLER,
4516
- safeHref,
4517
2976
  OnboardingGuideCardSkeleton,
4518
2977
  OnboardingGuideCard,
4519
- SOURCE_ICON_NAMES,
4520
- getSourceIconName,
4521
- SOURCE_LABELS_BY_TABLE,
4522
- getSourceLabel,
4523
- DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID,
4524
- defaultTableIdForDocumentType,
4525
- ICON_REGISTRY,
4526
- normalizeIconKey,
4527
- getIconComponent,
4528
- getDynamicIcon,
4529
- sourceRowCtxFromRuntime,
4530
- resolveSourceRowCTA,
4531
- resolveSourceIcon,
4532
2978
  PageActions,
4533
2979
  usePageActionsBottomPadding,
4534
2980
  BackButton,
@@ -4537,10 +2983,6 @@ export {
4537
2983
  PageLayout,
4538
2984
  PageShell,
4539
2985
  ArticleDetailLayout,
4540
- DEFAULT_CONTENT_SUFFIXES,
4541
- makeComposeContentUrl,
4542
- buildDefaultHref,
4543
- resolveContentHref,
4544
2986
  ErrorState,
4545
2987
  PageError,
4546
2988
  LoadError,
@@ -4552,7 +2994,6 @@ export {
4552
2994
  useVideoOriginPreconnect,
4553
2995
  useVideoWarmup,
4554
2996
  getCaptionsUrl,
4555
- SearchInput,
4556
2997
  FilterPillRow
4557
2998
  };
4558
- //# sourceMappingURL=chunk-Z3V2SGQZ.js.map
2999
+ //# sourceMappingURL=chunk-R2KT5GDD.js.map