@flamingo-stack/openframe-frontend-core 0.0.250 → 0.0.251
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-SGEO3W3F.js → chunk-4AVACC2J.js} +36 -26
- package/dist/chunk-4AVACC2J.js.map +1 -0
- package/dist/{chunk-PDYT7T6K.cjs → chunk-UXDWRC5Y.cjs} +36 -26
- package/dist/chunk-UXDWRC5Y.cjs.map +1 -0
- package/dist/components/index.cjs +2 -2
- package/dist/components/index.js +1 -1
- package/dist/components/related-content/index.cjs +2 -2
- package/dist/components/related-content/index.js +1 -1
- package/dist/components/related-content/related-content-section.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/related-content/related-content-section.tsx +53 -31
- package/dist/chunk-PDYT7T6K.cjs.map +0 -1
- package/dist/chunk-SGEO3W3F.js.map +0 -1
|
@@ -172,7 +172,8 @@ function ContentGroup({
|
|
|
172
172
|
resolveHref,
|
|
173
173
|
LinkProvider,
|
|
174
174
|
extras,
|
|
175
|
-
adminCampaignCard
|
|
175
|
+
adminCampaignCard,
|
|
176
|
+
heading
|
|
176
177
|
}) {
|
|
177
178
|
const { items, isLoading } = useGroupItems(type, refs, buildUrl);
|
|
178
179
|
const config = resolveGroupConfig(type);
|
|
@@ -180,7 +181,10 @@ function ContentGroup({
|
|
|
180
181
|
const cardSize = config.gridSize;
|
|
181
182
|
if (isLoading && !items) {
|
|
182
183
|
const skeletons = refs.map((r) => /* @__PURE__ */ jsx("div", { children: renderSkeletonForType(type, cardSize, adminCampaignCard) }, r.id));
|
|
183
|
-
return
|
|
184
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
185
|
+
heading,
|
|
186
|
+
isListLayout ? /* @__PURE__ */ jsx("div", { className: "space-y-4", children: skeletons }) : /* @__PURE__ */ jsx("div", { className: gridClassFor(columns), children: skeletons })
|
|
187
|
+
] });
|
|
184
188
|
}
|
|
185
189
|
if (!items || items.length === 0) return null;
|
|
186
190
|
const itemById = new Map(
|
|
@@ -198,7 +202,6 @@ function ContentGroup({
|
|
|
198
202
|
{
|
|
199
203
|
type,
|
|
200
204
|
item,
|
|
201
|
-
contentRef,
|
|
202
205
|
size: cardSize,
|
|
203
206
|
href,
|
|
204
207
|
targetPlatform,
|
|
@@ -209,7 +212,10 @@ function ContentGroup({
|
|
|
209
212
|
) }) }, itemId);
|
|
210
213
|
}).filter(Boolean);
|
|
211
214
|
if (cards.length === 0) return null;
|
|
212
|
-
return
|
|
215
|
+
return /* @__PURE__ */ jsxs("div", { className: "space-y-4", children: [
|
|
216
|
+
heading,
|
|
217
|
+
isListLayout ? /* @__PURE__ */ jsx("div", { className: "space-y-4", children: cards }) : /* @__PURE__ */ jsx("div", { className: gridClassFor(columns), children: cards })
|
|
218
|
+
] });
|
|
213
219
|
}
|
|
214
220
|
function RelatedContentSection({
|
|
215
221
|
contentRefs,
|
|
@@ -229,7 +235,8 @@ function RelatedContentSection({
|
|
|
229
235
|
LinkProvider = DefaultLinkPropsProvider,
|
|
230
236
|
adminCampaignCard
|
|
231
237
|
}) {
|
|
232
|
-
const
|
|
238
|
+
const suggestionsDisabled = includeTypes?.length === 0;
|
|
239
|
+
const suggestUrl = contentRefs === void 0 && entityType && entityId !== void 0 && entityId !== null && entityId !== "" && !suggestionsDisabled ? buildSuggestionUrl("/api/related-content", {
|
|
233
240
|
apiBaseUrl,
|
|
234
241
|
entityType,
|
|
235
242
|
entityId,
|
|
@@ -241,8 +248,11 @@ function RelatedContentSection({
|
|
|
241
248
|
}
|
|
242
249
|
}) : null;
|
|
243
250
|
const initialData = useMemo(
|
|
244
|
-
|
|
245
|
-
|
|
251
|
+
// An explicitly disabled rail (includeTypes: []) must ignore SSR-hydrated
|
|
252
|
+
// refs too — otherwise useSelfFetch(null, {initialData}) keeps serving
|
|
253
|
+
// initialItems and the "nothing participates" contract silently breaks.
|
|
254
|
+
() => !suggestionsDisabled && initialItems ? { refs: initialItems } : void 0,
|
|
255
|
+
[initialItems, suggestionsDisabled]
|
|
246
256
|
);
|
|
247
257
|
const { data } = useSelfFetch(suggestUrl, { initialData });
|
|
248
258
|
const effectiveBuildListUrl = useMemo(
|
|
@@ -260,33 +270,33 @@ function RelatedContentSection({
|
|
|
260
270
|
}
|
|
261
271
|
let orderedTypes = orderContentRefTypes(Object.keys(grouped));
|
|
262
272
|
if (entityType) {
|
|
263
|
-
const
|
|
273
|
+
const canonicalEntityType = canonicalContentRefType(entityType);
|
|
274
|
+
const sameType = orderedTypes.filter((t) => canonicalContentRefType(t) === canonicalEntityType);
|
|
264
275
|
if (sameType.length > 0) {
|
|
265
|
-
orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !==
|
|
276
|
+
orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !== canonicalEntityType)];
|
|
266
277
|
}
|
|
267
278
|
}
|
|
268
279
|
return /* @__PURE__ */ jsxs("div", { className: "space-y-8", children: [
|
|
269
280
|
/* @__PURE__ */ jsx("h2", { className: "text-2xl font-bold text-ods-text-primary", children: title }),
|
|
270
|
-
orderedTypes.map((type) => /* @__PURE__ */
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
] }, type))
|
|
281
|
+
orderedTypes.map((type) => /* @__PURE__ */ jsx(
|
|
282
|
+
ContentGroup,
|
|
283
|
+
{
|
|
284
|
+
type,
|
|
285
|
+
refs: grouped[type],
|
|
286
|
+
columns,
|
|
287
|
+
buildUrl: effectiveBuildListUrl,
|
|
288
|
+
resolveHref,
|
|
289
|
+
LinkProvider,
|
|
290
|
+
extras,
|
|
291
|
+
adminCampaignCard,
|
|
292
|
+
heading: /* @__PURE__ */ jsx("h3", { className: "font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider", children: getContentRefLabelOrTitleCase(type) })
|
|
293
|
+
},
|
|
294
|
+
type
|
|
295
|
+
))
|
|
286
296
|
] });
|
|
287
297
|
}
|
|
288
298
|
|
|
289
299
|
export {
|
|
290
300
|
RelatedContentSection
|
|
291
301
|
};
|
|
292
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-4AVACC2J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/related-content/related-content-section.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * RelatedContentSection\n *\n * Renders content references grouped by type using the canonical card\n * components. MOVED from the hub (`components/shared/related-content-card.tsx`)\n * so any consuming app can embed it; the hub keeps a thin wrapper that\n * pre-binds its host-specific injections (nav hook, URL recomposition,\n * program configs, admin campaign card).\n *\n * THREE data modes (precedence top-down):\n * 1. CONTROLLED — `contentRefs` provided (even `[]`): render exactly those\n * refs, no suggestion fetch (the original investor-update behavior).\n * 2. SUGGESTION — `entityType` + `entityId` provided: self-fetch\n * `GET {apiBaseUrl}/api/related-content?entityType&entityId[&count][&excludeTypes]`\n * (the generic 5-tier engine's second web service). `minResults` maps to\n * `count`; absent → param not sent (server default applies). Each ref\n * carries a `reason` (data-only — never rendered, matching the\n * FaqSection/FaqWithReason precedent).\n * 3. SSR-HYDRATED suggestion — also pass `initialItems` (the server page\n * called the engine directly); the first client fetch is skipped per the\n * `useSelfFetch` initialData contract.\n *\n * Group layout (list vs grid) + card size (lg vs default) come from\n * `CONTENT_REF_GROUPS` in `../../utils/content-ref-groups` — single source of\n * truth, no per-type logic in this file. Skeletons come from\n * `renderSkeletonForType` so the placeholder height matches the loaded card\n * exactly (zero layout shift on resolve).\n *\n * One API call per content type via the shared list-URL builder\n * (`buildListUrl` — injectable; defaults to the lib's byte-parity-tested\n * builder prefixed with `apiBaseUrl`). Fetching uses `useSelfFetch` (plain\n * fetch, NO react-query) so third-party embedders need no QueryClientProvider;\n * cards are imported via DEEP module paths (not the chat barrel) so this\n * chunk never reaches `@tanstack/react-query`.\n *\n * LOCKSTEP NOTE: this file's per-type card/skeleton dispatch is the SIZED\n * sibling of the chat-side `CHAT_CARD_REGISTRY` (`../chat/entity-cards/\n * dispatch.tsx`), which renders compact `size='sm'` cards wired to the chat\n * runtime. Two dispatchers by design — when registering a new fetch-mode\n * content type, add it BOTH there and here (cards + skeleton + list URL).\n */\n\nimport React, { useMemo } from 'react';\nimport {\n CONTENT_REF_GROUPS,\n getContentRefLabelOrTitleCase,\n orderContentRefTypes,\n type ContentRefGroupConfig,\n} from '../../utils/content-ref-groups';\nimport type { ContentRef, ContentRefWithReason } from '../../types/content-ref';\nimport { useSelfFetch } from '../../hooks/use-self-fetch';\nimport { extractItems, extractItemId } from '../../utils/extract-items';\nimport { buildListUrl as libBuildListUrl, canonicalContentRefType } from '../../utils/list-url';\nimport { buildSuggestionUrl } from '../../utils/suggestion-url';\nimport { decideNewTab } from '../chat/utils/decide-new-tab';\n// DEEP card imports — NOT the `../chat` barrel (the barrel statically reaches\n// @tanstack/react-query via embeddable-chat + its hooks). Deep paths keep this\n// component's SOURCE graph react-query-free. Note: tsup's shared-chunk\n// splitting may still colocate the cards with chat hooks in one dist chunk\n// (react-query is a required peerDep, so resolution always succeeds) — the\n// guarantee that matters here is the RUNTIME one: nothing on this path ever\n// instantiates a QueryClient, so embedders need NO QueryClientProvider.\nimport { BlogCard, BlogCardSkeleton } from '../chat/entity-cards/blog-card';\nimport { CaseStudyCard, CaseStudyCardSkeleton } from '../chat/entity-cards/case-study-card';\nimport { CustomerInterviewCard, CustomerInterviewCardSkeleton } from '../chat/entity-cards/customer-interview-card';\nimport { ProductReleaseCard, ProductReleaseCardSkeleton } from '../chat/entity-cards/product-release-card';\nimport { buildProductReleaseCardProps } from '../chat/entity-cards/product-release-card-defaults';\nimport { ProgramCard, ProgramCardSkeleton } from '../chat/entity-cards/program-card';\nimport { InvestorUpdateCard, InvestorUpdateCardSkeleton } from '../chat/entity-cards/investor-update-card';\nimport { OnboardingGuideCard, OnboardingGuideCardSkeleton } from '../chat/entity-cards/onboarding-guide-card';\nimport { RoadmapCard, RoadmapCardSkeleton } from '../chat/entity-cards/roadmap-card';\n// Type-only — erased at build, no runtime dependency on the dispatch module.\nimport type { ChatCardDispatchExtras } from '../chat/entity-cards/dispatch';\n\ntype CardSize = 'lg' | 'default' | 'sm';\n\n/** Anchor prop bundle the per-card link surface receives — same shape the\n * hub's `useNavLink` returns and the chat dispatcher's anchor builders\n * produce. `null` = non-anchor mode (no URL). */\nexport interface CardLinkAnchorProps {\n href: string;\n target?: '_blank';\n rel?: 'noopener noreferrer';\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/** Render-prop component injection for the navigation decision — keeps hook\n * calls legal (hooks live INSIDE the injected component; `CardForType`\n * itself calls zero hooks). The hub injects a `useNavLink`-backed provider;\n * the default is hook-free (pure `decideNewTab`). MUST be defined at module\n * scope by hosts — an inline arrow would remount every card each render. */\nexport interface CardLinkProviderProps {\n href: string | null;\n targetPlatform: string | null;\n children: (linkProps: CardLinkAnchorProps | null) => React.ReactElement | null;\n}\nexport type CardLinkProvider = React.ComponentType<CardLinkProviderProps>;\n\n/** Default link provider for standalone embeds: relative/-same-origin hrefs\n * stay same-tab, cross-origin pops a new tab (pure `decideNewTab` with no\n * platform context — `currentSource: ''` falls through to the origin\n * check). No router integration, no hooks. */\nfunction DefaultLinkPropsProvider({ href, targetPlatform, children }: CardLinkProviderProps): React.ReactElement | null {\n if (!href) return children(null);\n const newTab = decideNewTab({ href, targetPlatform, currentSource: '' });\n return children(\n newTab\n ? { href, target: '_blank', rel: 'noopener noreferrer' }\n : { href },\n );\n}\n\n/** Default href resolution: trust the ref's stored url/targetPlatform as the\n * API composed them. The hub overrides this with its `buildContentURL`\n * re-composition so dev gets localhost and prod gets platform domains. */\nfunction defaultResolveHref(ref: ContentRef): { href: string | null; targetPlatform: string | null } {\n return { href: ref.url || null, targetPlatform: ref.targetPlatform ?? null };\n}\n\n/** Host-injected renderer pair for the admin-only `marketing_campaign` type.\n * Absent (every non-hub embed) → the type renders nothing (its list URL\n * hits `/api/admin`, unreachable outside the hub anyway). */\nexport interface AdminCampaignCardSlot {\n Card: React.ComponentType<{ campaign: any }>;\n Skeleton: React.ComponentType<{ size?: 'default' | 'sm' }>;\n}\n\n/**\n * Per-type skeleton dispatch — returns the SAME colocated skeleton the\n * resolved card renders, sized to match (zero layout shift on resolve).\n * The chat-side `CHAT_CARD_REGISTRY` already does this via\n * `entry.skeleton()`; this surface exposes the same discipline to the\n * related-content rail.\n */\nfunction renderSkeletonForType(\n type: string,\n size: CardSize,\n adminCampaignCard?: AdminCampaignCardSlot,\n): React.ReactNode {\n // Most card skeletons accept only `{default, sm}`. `'lg'` collapses to\n // `'default'`. ProductReleaseCardSkeleton uses lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n switch (type) {\n case 'blog_post_existing':\n return <BlogCardSkeleton size={legacySize} />;\n case 'case_study':\n return <CaseStudyCardSkeleton size={legacySize} />;\n case 'customer_interview':\n return <CustomerInterviewCardSkeleton size={legacySize} />;\n case 'product_release':\n return <ProductReleaseCardSkeleton size={size === 'sm' ? 'sm' : 'lg'} />;\n case 'podcast':\n case 'webinar':\n case 'event':\n return <ProgramCardSkeleton size={legacySize} />;\n case 'investor_update':\n return <InvestorUpdateCardSkeleton size={legacySize} />;\n case 'onboarding_guide':\n // The rich catalog variant (hero + author grid, clamped description) —\n // the step-numbered 'default' variant is for the guide detail page's\n // \"More in section\" rail, not this full-width row.\n return <OnboardingGuideCardSkeleton size={size === 'sm' ? 'sm' : 'catalog'} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Skeleton size={legacySize} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return <RoadmapCardSkeleton size={legacySize} />;\n default:\n return null;\n }\n}\n\n/**\n * Per-type card dispatch — renders the right card with the right size.\n * Sized cards (`'lg'` / `'default'`) are unique to this rail — the chat\n * dispatcher only renders `'sm'`, so we go directly through the per-type\n * cards here.\n *\n * PURE FUNCTION COMPONENT WITH ZERO HOOK CALLS: the placeholder comes from a\n * plain `extras.buildOgPlaceholderUrl` call (the chat `dispatch.tsx`\n * pattern) and the anchor-prop bundle arrives via the `LinkProvider`\n * render-prop from the parent — so per-card hook legality is owned by the\n * injected provider component, not by this switch.\n *\n * `href` comes from the host's `resolveHref(ref)` (hub: live\n * `buildContentURL` recomposition; default: the ref's stored url).\n */\nfunction CardForType({\n type,\n item,\n size,\n href,\n targetPlatform,\n linkProps,\n extras,\n adminCampaignCard,\n}: {\n type: string;\n item: any;\n size: CardSize;\n href: string;\n targetPlatform: string | null;\n linkProps: CardLinkAnchorProps | null;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n}): React.ReactNode {\n // Most card variants accept only `{default, sm}`. `'lg'` collapses to\n // `'default'` for those. ProductReleaseCard uses its own lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n // OG placeholder URL — injected into the pure-presentation cards so they\n // render a branded fallback when the row's featured image is null. Plain\n // function call (NOT a hook). Title is the universal field across all card\n // item shapes used here.\n const placeholderUrl =\n extras?.buildOgPlaceholderUrl?.((item?.title as string | undefined) ?? '') ?? undefined;\n\n // Top-level target/rel for cards that take them as separate props\n // (BlogCard, CaseStudyCard, …). ProductReleaseCard takes the bundle as a\n // single `anchorProps={...}` and uses `linkProps` directly. When the host\n // didn't surface a URL, `linkProps` is null and the card stays in\n // non-anchor mode.\n const anchorAttrs: Pick<CardLinkAnchorProps, 'target' | 'rel'> = linkProps\n ? { target: linkProps.target, rel: linkProps.rel }\n : {};\n\n switch (type) {\n case 'blog_post_existing':\n return <BlogCard post={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'case_study':\n return <CaseStudyCard study={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'customer_interview':\n return <CustomerInterviewCard interview={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'product_release': {\n // Anchor-prop pattern: build product-release lg-variant props from the\n // shared `buildProductReleaseCardProps` so this rail and the /releases\n // catalog page render byte-identically. The card wraps in\n // `<a {...anchorProps}>` ONLY when `anchorProps.href` is set — pass\n // `undefined` (not an empty object) when href is empty so the card\n // stays in non-anchor mode without rendering a dead <a> tag.\n const releaseSize = size === 'sm' ? 'sm' : 'lg';\n const buildReleaseProps = extras?.buildProductReleaseCardProps ?? buildProductReleaseCardProps;\n const releaseProps = buildReleaseProps(item);\n return (\n <ProductReleaseCard\n size={releaseSize}\n title={item.title}\n summary={item.summary}\n version={item.version}\n {...releaseProps}\n anchorProps={linkProps ?? undefined}\n />\n );\n }\n case 'podcast':\n return extras?.programConfigs?.podcast\n ? <ProgramCard config={extras.programConfigs.podcast} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'webinar':\n return extras?.programConfigs?.webinar\n ? <ProgramCard config={extras.programConfigs.webinar} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'event':\n return extras?.programConfigs?.event\n ? <ProgramCard config={extras.programConfigs.event} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'investor_update':\n return <InvestorUpdateCard update={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'onboarding_guide':\n // Catalog variant (see skeleton note) — full-width rich card with a\n // line-clamped description instead of the step-numbered rail card.\n return <OnboardingGuideCard guide={item} size={size === 'sm' ? 'sm' : 'catalog'} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Card campaign={item} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return (\n <RoadmapCard\n item={item}\n href={href ?? ''}\n targetPlatform={targetPlatform}\n userVote={null}\n onVote={() => {}}\n size={legacySize}\n cardType={type as 'roadmap_item' | 'delivery_item' | 'internal_task'}\n {...anchorAttrs}\n />\n );\n default:\n return null;\n }\n}\n\n// =============================================================================\n// Fetch all items for a type in ONE server-sorted call, via the injectable\n// list-URL builder. `useSelfFetch` (URL = cache key) replaces the hub's old\n// react-query usage: `enabled` ≙ `url === null`, `!res.ok`/network error ≙\n// `error → items null → group renders nothing`. Accepted deltas vs\n// react-query: no retry/backoff, no focus refetch, no cross-mount cache.\n// =============================================================================\n\nfunction useGroupItems(\n type: string,\n refs: ContentRef[],\n buildUrl: (type: string, ids: string[]) => string | null,\n) {\n const ids = refs.map((r) => r.id);\n const url = ids.length > 0 ? buildUrl(type, ids) : null;\n const { data, isLoading } = useSelfFetch<unknown>(url);\n const items = data != null ? extractItems(data) : null;\n return { items, isLoading };\n}\n\n// =============================================================================\n// Per-group renderer — one API call, server-sorted, then render cards via the\n// dispatcher with per-type skeletons + per-type layout from CONTENT_REF_GROUPS.\n// =============================================================================\n\n/** Map columns prop → tailwind grid class. Only consulted for grid-layout\n * groups; list-layout groups stack vertically. */\nfunction gridClassFor(columns: 2 | 3): string {\n return columns === 3\n ? 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6'\n : 'grid grid-cols-1 sm:grid-cols-2 gap-6';\n}\n\n/** Resolve the group config for a type, falling back to a grid layout with\n * the default card size for unregistered types so the section still renders\n * rather than silently dropping them. The `label` field on the fallback is\n * intentionally a placeholder — the section heading goes through\n * `getContentRefLabelOrTitleCase(type)` instead so cross-surface labels\n * stay consistent between this rail and the investor-email builder. */\nfunction resolveGroupConfig(type: string): ContentRefGroupConfig {\n return CONTENT_REF_GROUPS[type] ?? {\n label: type,\n order: 999,\n layout: 'grid',\n gridSize: 'default',\n };\n}\n\nfunction ContentGroup({\n type,\n refs,\n columns,\n buildUrl,\n resolveHref,\n LinkProvider,\n extras,\n adminCampaignCard,\n heading,\n}: {\n type: string;\n refs: ContentRef[];\n columns: 2 | 3;\n buildUrl: (type: string, ids: string[]) => string | null;\n resolveHref: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n LinkProvider: CardLinkProvider;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n /** Group heading, rendered INSIDE the group so a group that resolves to\n * nothing (fetch miss / unsupported type / missing program config) drops\n * its heading too — no orphaned titles. */\n heading: React.ReactNode;\n}) {\n const { items, isLoading } = useGroupItems(type, refs, buildUrl);\n const config = resolveGroupConfig(type);\n const isListLayout = config.layout === 'list';\n const cardSize = config.gridSize;\n\n // Skeleton gate: `isLoading && !items` — SSR HTML and the client's first\n // paint render identical skeletons (useSelfFetch starts isLoading=true on\n // both sides), and once items exist they are never replaced by skeletons.\n if (isLoading && !items) {\n const skeletons = refs.map((r) => (\n <div key={r.id}>{renderSkeletonForType(type, cardSize, adminCampaignCard)}</div>\n ));\n return (\n <div className=\"space-y-4\">\n {heading}\n {isListLayout ? (\n <div className=\"space-y-4\">{skeletons}</div>\n ) : (\n <div className={gridClassFor(columns)}>{skeletons}</div>\n )}\n </div>\n );\n }\n\n if (!items || items.length === 0) return null;\n\n // Index fetched rows by id, then render in REF order — refs carry the\n // intended sequence (suggestion mode: the engine's tier order, so\n // same-platform/tag-matched items lead; controlled mode: the curated\n // display_order). The list APIs return rows date-sorted, which would\n // otherwise scramble that ordering (same-platform items sinking below\n // newer cross-platform ones).\n // Shared extractor (NOT raw `.id`) — some API shapes key items differently\n // (e.g. external_id types); raw access would silently drop valid items.\n const itemById = new Map(\n (items as any[]).map((it) => [extractItemId(type, it) ?? String((it as any)?.id), it]),\n );\n\n const cards = refs\n .map((contentRef) => {\n const itemId = String(contentRef.id);\n const item = itemById.get(itemId);\n if (!item) return null;\n // Re-compose the URL via the host's resolver (hub: buildContentURL so\n // dev gets localhost and prod the right platform domain; default: the\n // ref's stored url as the API composed it).\n const resolved = resolveHref(contentRef);\n const href = resolved.href ?? '';\n const targetPlatform = resolved.targetPlatform ?? contentRef.targetPlatform ?? null;\n return (\n <div key={itemId}>\n <LinkProvider href={href || null} targetPlatform={targetPlatform}>\n {(linkProps) => (\n <CardForType\n type={type}\n item={item}\n size={cardSize}\n href={href}\n targetPlatform={targetPlatform}\n linkProps={linkProps}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n />\n )}\n </LinkProvider>\n </div>\n );\n })\n .filter(Boolean);\n\n if (cards.length === 0) return null;\n\n return (\n <div className=\"space-y-4\">\n {heading}\n {isListLayout ? (\n <div className=\"space-y-4\">{cards}</div>\n ) : (\n <div className={gridClassFor(columns)}>{cards}</div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Main component\n// =============================================================================\n\ninterface RelatedContentResponse {\n refs: ContentRefWithReason[];\n}\n\nexport interface RelatedContentSectionProps {\n /** CONTROLLED mode (the original behavior). When defined — even `[]` — no\n * suggestion fetch runs and exactly these refs render. */\n contentRefs?: ContentRef[];\n /** SUGGESTION mode (with `entityId`): self-fetch suggestions for this host\n * entity from `{apiBaseUrl}/api/related-content`. Ignored when\n * `contentRefs` is provided. */\n entityType?: string;\n entityId?: number | string;\n /** Maps to the suggestion API's `count` param — the PER-TYPE fill target\n * for every candidate type EXCEPT the host's own. Absent → param not sent\n * (server default applies). */\n minResults?: number;\n /** Maps to the suggestion API's `sameTypeCount` param — the budget for the\n * candidate type MATCHING the host's own `entityType` (same-type boost:\n * a blog post's rail leads with more blog posts). Absent → param not\n * sent (host's type uses the server's `count`). */\n sameTypeMinResults?: number;\n /** SSR hydrate for suggestion mode — the server page ran the engine and\n * drills the refs here; the first client fetch is skipped (useSelfFetch\n * initialData contract). */\n initialItems?: ContentRefWithReason[];\n /** Section title (default: \"Related Content\") */\n title?: string;\n /**\n * Grid columns at desktop. 2 = denser cards / wider summary (original\n * investor-update layout); 3 = more cards per row for dashboards.\n * Only consulted for grid-layout groups. Default: 2.\n */\n columns?: 2 | 3;\n /**\n * ContentRef.type values to exclude. Honored in ALL modes — controlled\n * mode post-filters (original behavior); suggestion mode ALSO forwards the\n * list verbatim as the API's `excludeTypes=` param so excluded types never\n * consume engine fill slots (`minResults` stays honored). The subtraction\n * happens SERVER-side — this component never mirrors the hub's candidate\n * list.\n */\n excludeTypes?: string[];\n /**\n * SUGGESTION-mode allow-list (rail vocabulary): which content types\n * participate in this rail. Sent verbatim as the API's `types=` param —\n * the SERVER intersects it with its own allowed candidate set, and\n * platform policy gates (e.g. internal-only types) ALWAYS win: the client\n * cannot request its way past them. Absent → all server-side candidates.\n */\n includeTypes?: string[];\n /** Fetch-URL prefix for third-party embeds / reverse proxies\n * ('' = same-origin). Applied to BOTH the suggestion fetch and the\n * default per-group list fetches. */\n apiBaseUrl?: string;\n /** Host injection bundle — REUSES the chat dispatcher's\n * `ChatCardDispatchExtras` (programConfigs, buildOgPlaceholderUrl,\n * buildProductReleaseCardProps override). Program groups render nothing\n * when their config is absent. */\n extras?: ChatCardDispatchExtras;\n /** Hub injects its `buildContentURL` recomposition; default uses the\n * ref's stored `url`/`targetPlatform` as the API composed them. */\n resolveHref?: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n /** Hub injects its registry-driven entity-list-api builder; default = the\n * lib's `buildListUrl(type, ids, apiBaseUrl)`. */\n buildListUrl?: (type: string, ids: string[]) => string | null;\n /** Hub injects a `useNavLink`-backed render-prop provider; default = pure\n * anchor via `decideNewTab`. MUST be a module-scope component. */\n LinkProvider?: CardLinkProvider;\n /** Renderer pair for the admin-only `marketing_campaign` type. Absent →\n * the type renders nothing. */\n adminCampaignCard?: AdminCampaignCardSlot;\n}\n\nexport function RelatedContentSection({\n contentRefs,\n entityType,\n entityId,\n minResults,\n sameTypeMinResults,\n includeTypes,\n initialItems,\n title = 'Related Content',\n columns = 2,\n excludeTypes,\n apiBaseUrl = '',\n extras,\n resolveHref = defaultResolveHref,\n buildListUrl,\n LinkProvider = DefaultLinkPropsProvider,\n adminCampaignCard,\n}: RelatedContentSectionProps) {\n // ── Hooks above EVERY early return (the original `if (!contentRefs.length)\n // return null` guard moved below them). ──\n\n // Suggestion-mode fetch URL — null in controlled mode (contentRefs defined,\n // even []) or when the entity scope is incomplete.\n // `includeTypes: []` is an explicit \"nothing participates\" — skip the fetch\n // entirely (an empty-string `types=` param would be dropped by the URL\n // builder and read server-side as \"all candidates\") AND ignore SSR refs.\n const suggestionsDisabled = includeTypes?.length === 0;\n const suggestUrl =\n contentRefs === undefined &&\n entityType &&\n entityId !== undefined &&\n entityId !== null &&\n entityId !== '' &&\n !suggestionsDisabled\n ? buildSuggestionUrl('/api/related-content', {\n apiBaseUrl,\n entityType,\n entityId,\n count: minResults,\n extraParams: {\n sameTypeCount: sameTypeMinResults !== undefined ? String(sameTypeMinResults) : undefined,\n types: includeTypes !== undefined ? includeTypes.join(',') : undefined,\n excludeTypes: excludeTypes && excludeTypes.length > 0 ? excludeTypes.join(',') : undefined,\n },\n })\n : null;\n // Memoize the initialData wrapper — useSelfFetch re-syncs on [initialData],\n // and a fresh per-render object would loop setState under re-rendering\n // parents (the latent FaqSection bug, fixed there in the same change).\n const initialData = useMemo<RelatedContentResponse | undefined>(\n // An explicitly disabled rail (includeTypes: []) must ignore SSR-hydrated\n // refs too — otherwise useSelfFetch(null, {initialData}) keeps serving\n // initialItems and the \"nothing participates\" contract silently breaks.\n () => (!suggestionsDisabled && initialItems ? { refs: initialItems } : undefined),\n [initialItems, suggestionsDisabled],\n );\n const { data } = useSelfFetch<RelatedContentResponse>(suggestUrl, { initialData });\n\n // Default group fetcher: the lib's byte-parity-tested builder, prefixed for\n // embeds. Memoized so group-fetch URLs stay value-stable across renders.\n const effectiveBuildListUrl = useMemo(\n () => buildListUrl ?? ((type: string, ids: string[]) => libBuildListUrl(type, ids, apiBaseUrl)),\n [buildListUrl, apiBaseUrl],\n );\n\n const refs: ContentRef[] = contentRefs ?? data?.refs ?? [];\n\n // Per-consumer type gating — drops refs whose `type` is in the exclude\n // list. In suggestion mode the server already subtracted these (the param\n // is forwarded above); the client filter stays as an idempotent guard and\n // IS the mechanism in controlled mode (original behavior).\n const exclude = new Set(excludeTypes || []);\n const visibleRefs = exclude.size > 0 ? refs.filter((r) => !exclude.has(r.type)) : refs;\n // Zero refs (still loading in suggestion mode, or genuinely empty) → no\n // empty shell.\n if (!visibleRefs.length) return null;\n\n const grouped: Record<string, ContentRef[]> = {};\n for (const ref of visibleRefs) {\n if (!grouped[ref.type]) grouped[ref.type] = [];\n grouped[ref.type].push(ref);\n }\n\n // Registered types in CONTENT_REF_GROUPS order, then any unregistered\n // types appended (same shape the investor-email builder uses — both\n // consume `orderContentRefTypes` so cross-surface ordering matches).\n // SAME-TYPE FIRST: when a host entityType is known (suggestion / SSR\n // modes), its own content-type group is hoisted to the top — a blog\n // post's rail leads with blog posts. Rail group keys are compared via\n // the shared alias canonicalizer (blog_post_existing ↔ blog_post).\n let orderedTypes = orderContentRefTypes(Object.keys(grouped));\n if (entityType) {\n // Canonicalize BOTH sides — hosts pass registry vocab ('blog_post') but\n // rail-vocab aliases ('blog_post_existing') are also legal inputs; a raw\n // comparison would silently lose the same-type-first hoist for aliases.\n const canonicalEntityType = canonicalContentRefType(entityType);\n const sameType = orderedTypes.filter((t) => canonicalContentRefType(t) === canonicalEntityType);\n if (sameType.length > 0) {\n orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !== canonicalEntityType)];\n }\n }\n\n return (\n <div className=\"space-y-8\">\n <h2 className=\"text-2xl font-bold text-ods-text-primary\">{title}</h2>\n {orderedTypes.map((type) => (\n <ContentGroup\n key={type}\n type={type}\n refs={grouped[type]}\n columns={columns}\n buildUrl={effectiveBuildListUrl}\n resolveHref={resolveHref}\n LinkProvider={LinkProvider}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n heading={\n <h3 className=\"font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider\">\n {getContentRefLabelOrTitleCase(type)}\n </h3>\n }\n />\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["buildListUrl"]}
|
|
@@ -172,7 +172,8 @@ function ContentGroup({
|
|
|
172
172
|
resolveHref,
|
|
173
173
|
LinkProvider,
|
|
174
174
|
extras,
|
|
175
|
-
adminCampaignCard
|
|
175
|
+
adminCampaignCard,
|
|
176
|
+
heading
|
|
176
177
|
}) {
|
|
177
178
|
const { items, isLoading } = useGroupItems(type, refs, buildUrl);
|
|
178
179
|
const config = resolveGroupConfig(type);
|
|
@@ -180,7 +181,10 @@ function ContentGroup({
|
|
|
180
181
|
const cardSize = config.gridSize;
|
|
181
182
|
if (isLoading && !items) {
|
|
182
183
|
const skeletons = refs.map((r) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { children: renderSkeletonForType(type, cardSize, adminCampaignCard) }, r.id));
|
|
183
|
-
return
|
|
184
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-4", children: [
|
|
185
|
+
heading,
|
|
186
|
+
isListLayout ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "space-y-4", children: skeletons }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: gridClassFor(columns), children: skeletons })
|
|
187
|
+
] });
|
|
184
188
|
}
|
|
185
189
|
if (!items || items.length === 0) return null;
|
|
186
190
|
const itemById = new Map(
|
|
@@ -198,7 +202,6 @@ function ContentGroup({
|
|
|
198
202
|
{
|
|
199
203
|
type,
|
|
200
204
|
item,
|
|
201
|
-
contentRef,
|
|
202
205
|
size: cardSize,
|
|
203
206
|
href,
|
|
204
207
|
targetPlatform,
|
|
@@ -209,7 +212,10 @@ function ContentGroup({
|
|
|
209
212
|
) }) }, itemId);
|
|
210
213
|
}).filter(Boolean);
|
|
211
214
|
if (cards.length === 0) return null;
|
|
212
|
-
return
|
|
215
|
+
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-4", children: [
|
|
216
|
+
heading,
|
|
217
|
+
isListLayout ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "space-y-4", children: cards }) : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: gridClassFor(columns), children: cards })
|
|
218
|
+
] });
|
|
213
219
|
}
|
|
214
220
|
function RelatedContentSection({
|
|
215
221
|
contentRefs,
|
|
@@ -229,7 +235,8 @@ function RelatedContentSection({
|
|
|
229
235
|
LinkProvider = DefaultLinkPropsProvider,
|
|
230
236
|
adminCampaignCard
|
|
231
237
|
}) {
|
|
232
|
-
const
|
|
238
|
+
const suggestionsDisabled = _optionalChain([includeTypes, 'optionalAccess', _12 => _12.length]) === 0;
|
|
239
|
+
const suggestUrl = contentRefs === void 0 && entityType && entityId !== void 0 && entityId !== null && entityId !== "" && !suggestionsDisabled ? _chunkSGJBUL2Ycjs.buildSuggestionUrl.call(void 0, "/api/related-content", {
|
|
233
240
|
apiBaseUrl,
|
|
234
241
|
entityType,
|
|
235
242
|
entityId,
|
|
@@ -241,8 +248,11 @@ function RelatedContentSection({
|
|
|
241
248
|
}
|
|
242
249
|
}) : null;
|
|
243
250
|
const initialData = _react.useMemo.call(void 0,
|
|
244
|
-
|
|
245
|
-
|
|
251
|
+
// An explicitly disabled rail (includeTypes: []) must ignore SSR-hydrated
|
|
252
|
+
// refs too — otherwise useSelfFetch(null, {initialData}) keeps serving
|
|
253
|
+
// initialItems and the "nothing participates" contract silently breaks.
|
|
254
|
+
() => !suggestionsDisabled && initialItems ? { refs: initialItems } : void 0,
|
|
255
|
+
[initialItems, suggestionsDisabled]
|
|
246
256
|
);
|
|
247
257
|
const { data } = _chunkT7AJBKZPcjs.useSelfFetch.call(void 0, suggestUrl, { initialData });
|
|
248
258
|
const effectiveBuildListUrl = _react.useMemo.call(void 0,
|
|
@@ -260,33 +270,33 @@ function RelatedContentSection({
|
|
|
260
270
|
}
|
|
261
271
|
let orderedTypes = _chunkNCXHTQH2cjs.orderContentRefTypes.call(void 0, Object.keys(grouped));
|
|
262
272
|
if (entityType) {
|
|
263
|
-
const
|
|
273
|
+
const canonicalEntityType = _chunkNCXHTQH2cjs.canonicalContentRefType.call(void 0, entityType);
|
|
274
|
+
const sameType = orderedTypes.filter((t) => _chunkNCXHTQH2cjs.canonicalContentRefType.call(void 0, t) === canonicalEntityType);
|
|
264
275
|
if (sameType.length > 0) {
|
|
265
|
-
orderedTypes = [...sameType, ...orderedTypes.filter((t) => _chunkNCXHTQH2cjs.canonicalContentRefType.call(void 0, t) !==
|
|
276
|
+
orderedTypes = [...sameType, ...orderedTypes.filter((t) => _chunkNCXHTQH2cjs.canonicalContentRefType.call(void 0, t) !== canonicalEntityType)];
|
|
266
277
|
}
|
|
267
278
|
}
|
|
268
279
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "space-y-8", children: [
|
|
269
280
|
/* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h2", { className: "text-2xl font-bold text-ods-text-primary", children: title }),
|
|
270
|
-
orderedTypes.map((type) => /* @__PURE__ */ _jsxruntime.
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
] }, type))
|
|
281
|
+
orderedTypes.map((type) => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
282
|
+
ContentGroup,
|
|
283
|
+
{
|
|
284
|
+
type,
|
|
285
|
+
refs: grouped[type],
|
|
286
|
+
columns,
|
|
287
|
+
buildUrl: effectiveBuildListUrl,
|
|
288
|
+
resolveHref,
|
|
289
|
+
LinkProvider,
|
|
290
|
+
extras,
|
|
291
|
+
adminCampaignCard,
|
|
292
|
+
heading: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "h3", { className: "font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider", children: _chunkNCXHTQH2cjs.getContentRefLabelOrTitleCase.call(void 0, type) })
|
|
293
|
+
},
|
|
294
|
+
type
|
|
295
|
+
))
|
|
286
296
|
] });
|
|
287
297
|
}
|
|
288
298
|
|
|
289
299
|
|
|
290
300
|
|
|
291
301
|
exports.RelatedContentSection = RelatedContentSection;
|
|
292
|
-
//# sourceMappingURL=chunk-
|
|
302
|
+
//# sourceMappingURL=chunk-UXDWRC5Y.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-UXDWRC5Y.cjs","../src/components/related-content/related-content-section.tsx"],"names":["buildListUrl"],"mappings":"AAAA,6rBAAY;AACZ;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACA;AACA;AACF,wDAA6B;AAC7B;AACA;ACOA,8BAA+B;AAsGlB,+CAAA;AA1Cb,SAAS,wBAAA,CAAyB,EAAE,IAAA,EAAM,cAAA,EAAgB,SAAS,CAAA,EAAqD;AACtH,EAAA,GAAA,CAAI,CAAC,IAAA,EAAM,OAAO,QAAA,CAAS,IAAI,CAAA;AAC/B,EAAA,MAAM,OAAA,EAAS,4CAAA,EAAe,IAAA,EAAM,cAAA,EAAgB,aAAA,EAAe,GAAG,CAAC,CAAA;AACvE,EAAA,OAAO,QAAA;AAAA,IACL,OAAA,EACI,EAAE,IAAA,EAAM,MAAA,EAAQ,QAAA,EAAU,GAAA,EAAK,sBAAsB,EAAA,EACrD,EAAE,KAAK;AAAA,EACb,CAAA;AACF;AAKA,SAAS,kBAAA,CAAmB,GAAA,EAAyE;AACnG,EAAA,OAAO,EAAE,IAAA,EAAM,GAAA,CAAI,IAAA,GAAO,IAAA,EAAM,cAAA,mBAAgB,GAAA,CAAI,cAAA,UAAkB,OAAK,CAAA;AAC7E;AAiBA,SAAS,qBAAA,CACP,IAAA,EACA,IAAA,EACA,iBAAA,EACiB;AAGjB,EAAA,MAAM,WAAA,EAA+B,KAAA,IAAS,KAAA,EAAO,KAAA,EAAO,SAAA;AAC5D,EAAA,OAAA,CAAQ,IAAA,EAAM;AAAA,IACZ,KAAK,oBAAA;AACH,MAAA,uBAAO,6BAAA,kCAAC,EAAA,EAAiB,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA,IAC7C,KAAK,YAAA;AACH,MAAA,uBAAO,6BAAA,uCAAC,EAAA,EAAsB,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA,IAClD,KAAK,oBAAA;AACH,MAAA,uBAAO,6BAAA,+CAAC,EAAA,EAA8B,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA,IAC1D,KAAK,iBAAA;AACH,MAAA,uBAAO,6BAAA,4CAAC,EAAA,EAA2B,IAAA,EAAM,KAAA,IAAS,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,CAAA;AAAA,IACxE,KAAK,SAAA;AAAA,IACL,KAAK,SAAA;AAAA,IACL,KAAK,OAAA;AACH,MAAA,uBAAO,6BAAA,qCAAC,EAAA,EAAoB,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA,IAChD,KAAK,iBAAA;AACH,MAAA,uBAAO,6BAAA,4CAAC,EAAA,EAA2B,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA,IACvD,KAAK,kBAAA;AAIH,MAAA,uBAAO,6BAAA,6CAAC,EAAA,EAA4B,IAAA,EAAM,KAAA,IAAS,KAAA,EAAO,KAAA,EAAO,UAAA,CAAW,CAAA;AAAA,IAC9E,KAAK,oBAAA;AACH,MAAA,OAAO,kBAAA,kBAAoB,6BAAA,iBAAC,CAAkB,QAAA,EAAlB,EAA2B,IAAA,EAAM,WAAA,CAAY,EAAA,EAAK,IAAA;AAAA,IAChF,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,uBAAO,6BAAA,qCAAC,EAAA,EAAoB,IAAA,EAAM,WAAA,CAAY,CAAA;AAAA,IAChD,OAAA;AACE,MAAA,OAAO,IAAA;AAAA,EACX;AACF;AAiBA,SAAS,WAAA,CAAY;AAAA,EACnB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA,EACA,cAAA;AAAA,EACA,SAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,EASoB;AAGlB,EAAA,MAAM,WAAA,EAA+B,KAAA,IAAS,KAAA,EAAO,KAAA,EAAO,SAAA;AAK5D,EAAA,MAAM,eAAA,mCACJ,MAAA,2BAAQ,qBAAA,0BAAA,kCAAyB,IAAA,6BAAM,OAAA,UAAgC,IAAE,GAAA,UAAK,KAAA,GAAA;AAOhF,EAAA,MAAM,YAAA,EAA2D,UAAA,EAC7D,EAAE,MAAA,EAAQ,SAAA,CAAU,MAAA,EAAQ,GAAA,EAAK,SAAA,CAAU,IAAI,EAAA,EAC/C,CAAC,CAAA;AAEL,EAAA,OAAA,CAAQ,IAAA,EAAM;AAAA,IACZ,KAAK,oBAAA;AACH,MAAA,uBAAO,6BAAA,0BAAC,EAAA,EAAS,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,CAAA;AAAA,IAC9I,KAAK,YAAA;AACH,MAAA,uBAAO,6BAAA,+BAAC,EAAA,EAAc,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,CAAA;AAAA,IACpJ,KAAK,oBAAA;AACH,MAAA,uBAAO,6BAAA,uCAAC,EAAA,EAAsB,SAAA,EAAW,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,CAAA;AAAA,IAChK,KAAK,iBAAA,EAAmB;AAOtB,MAAA,MAAM,YAAA,EAAc,KAAA,IAAS,KAAA,EAAO,KAAA,EAAO,IAAA;AAC3C,MAAA,MAAM,kBAAA,mCAAoB,MAAA,6BAAQ,8BAAA,UAAgC,gDAAA;AAClE,MAAA,MAAM,aAAA,EAAe,iBAAA,CAAkB,IAAI,CAAA;AAC3C,MAAA,uBACE,6BAAA;AAAA,QAAC,oCAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAM,WAAA;AAAA,UACN,KAAA,EAAO,IAAA,CAAK,KAAA;AAAA,UACZ,OAAA,EAAS,IAAA,CAAK,OAAA;AAAA,UACd,OAAA,EAAS,IAAA,CAAK,OAAA;AAAA,UACb,GAAG,YAAA;AAAA,UACJ,WAAA,mBAAa,SAAA,UAAa,KAAA;AAAA,QAAA;AAAA,MAC5B,CAAA;AAAA,IAEJ;AAAA,IACA,KAAK,SAAA;AACH,MAAA,uBAAO,MAAA,6BAAQ,cAAA,6BAAgB,UAAA,kBAC3B,6BAAA,6BAAC,EAAA,EAAY,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,OAAA,EAAS,IAAA,EAAY,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,EAAA,EAC/K,IAAA;AAAA,IACN,KAAK,SAAA;AACH,MAAA,uBAAO,MAAA,6BAAQ,cAAA,6BAAgB,UAAA,kBAC3B,6BAAA,6BAAC,EAAA,EAAY,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,OAAA,EAAS,IAAA,EAAY,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,EAAA,EAC/K,IAAA;AAAA,IACN,KAAK,OAAA;AACH,MAAA,uBAAO,MAAA,6BAAQ,cAAA,+BAAgB,QAAA,kBAC3B,6BAAA,6BAAC,EAAA,EAAY,MAAA,EAAQ,MAAA,CAAO,cAAA,CAAe,KAAA,EAAO,IAAA,EAAY,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,EAAA,EAC7K,IAAA;AAAA,IACN,KAAK,iBAAA;AACH,MAAA,uBAAO,6BAAA,oCAAC,EAAA,EAAmB,MAAA,EAAQ,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,CAAA;AAAA,IAC1J,KAAK,kBAAA;AAGH,MAAA,uBAAO,6BAAA,qCAAC,EAAA,EAAoB,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,KAAA,IAAS,KAAA,EAAO,KAAA,EAAO,SAAA,EAAW,IAAA,EAAY,cAAA,EAAgC,cAAA,EAAiC,GAAG,YAAA,CAAa,CAAA;AAAA,IAChL,KAAK,oBAAA;AACH,MAAA,OAAO,kBAAA,kBAAoB,6BAAA,iBAAC,CAAkB,IAAA,EAAlB,EAAuB,QAAA,EAAU,KAAA,CAAM,EAAA,EAAK,IAAA;AAAA,IAC1E,KAAK,cAAA;AAAA,IACL,KAAK,eAAA;AAAA,IACL,KAAK,eAAA;AACH,MAAA,uBACE,6BAAA;AAAA,QAAC,6BAAA;AAAA,QAAA;AAAA,UACC,IAAA;AAAA,UACA,IAAA,mBAAM,IAAA,UAAQ,IAAA;AAAA,UACd,cAAA;AAAA,UACA,QAAA,EAAU,IAAA;AAAA,UACV,MAAA,EAAQ,CAAA,EAAA,GAAM;AAAA,UAAC,CAAA;AAAA,UACf,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU,IAAA;AAAA,UACT,GAAG;AAAA,QAAA;AAAA,MACN,CAAA;AAAA,IAEJ,OAAA;AACE,MAAA,OAAO,IAAA;AAAA,EACX;AACF;AAUA,SAAS,aAAA,CACP,IAAA,EACA,IAAA,EACA,QAAA,EACA;AACA,EAAA,MAAM,IAAA,EAAM,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAA,GAAM,CAAA,CAAE,EAAE,CAAA;AAChC,EAAA,MAAM,IAAA,EAAM,GAAA,CAAI,OAAA,EAAS,EAAA,EAAI,QAAA,CAAS,IAAA,EAAM,GAAG,EAAA,EAAI,IAAA;AACnD,EAAA,MAAM,EAAE,IAAA,EAAM,UAAU,EAAA,EAAI,4CAAA,GAAyB,CAAA;AACrD,EAAA,MAAM,MAAA,EAAQ,KAAA,GAAQ,KAAA,EAAO,4CAAA,IAAiB,EAAA,EAAI,IAAA;AAClD,EAAA,OAAO,EAAE,KAAA,EAAO,UAAU,CAAA;AAC5B;AASA,SAAS,YAAA,CAAa,OAAA,EAAwB;AAC5C,EAAA,OAAO,QAAA,IAAY,EAAA,EACf,uDAAA,EACA,uCAAA;AACN;AAQA,SAAS,kBAAA,CAAmB,IAAA,EAAqC;AAC/D,EAAA,wBAAO,oCAAA,CAAmB,IAAI,CAAA,UAAK;AAAA,IACjC,KAAA,EAAO,IAAA;AAAA,IACP,KAAA,EAAO,GAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,QAAA,EAAU;AAAA,EACZ,GAAA;AACF;AAEA,SAAS,YAAA,CAAa;AAAA,EACpB,IAAA;AAAA,EACA,IAAA;AAAA,EACA,OAAA;AAAA,EACA,QAAA;AAAA,EACA,WAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,iBAAA;AAAA,EACA;AACF,CAAA,EAaG;AACD,EAAA,MAAM,EAAE,KAAA,EAAO,UAAU,EAAA,EAAI,aAAA,CAAc,IAAA,EAAM,IAAA,EAAM,QAAQ,CAAA;AAC/D,EAAA,MAAM,OAAA,EAAS,kBAAA,CAAmB,IAAI,CAAA;AACtC,EAAA,MAAM,aAAA,EAAe,MAAA,CAAO,OAAA,IAAW,MAAA;AACvC,EAAA,MAAM,SAAA,EAAW,MAAA,CAAO,QAAA;AAKxB,EAAA,GAAA,CAAI,UAAA,GAAa,CAAC,KAAA,EAAO;AACvB,IAAA,MAAM,UAAA,EAAY,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA,EAAA,mBAC1B,6BAAA,KAAC,EAAA,EAAgB,QAAA,EAAA,qBAAA,CAAsB,IAAA,EAAM,QAAA,EAAU,iBAAiB,EAAA,CAAA,EAA9D,CAAA,CAAE,EAA8D,CAC3E,CAAA;AACD,IAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,MAAA,OAAA;AAAA,MACA,aAAA,kBACC,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,UAAA,CAAU,EAAA,kBAEtC,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,OAAO,CAAA,EAAI,QAAA,EAAA,UAAA,CAAU;AAAA,IAAA,EAAA,CAEtD,CAAA;AAAA,EAEJ;AAEA,EAAA,GAAA,CAAI,CAAC,MAAA,GAAS,KAAA,CAAM,OAAA,IAAW,CAAA,EAAG,OAAO,IAAA;AAUzC,EAAA,MAAM,SAAA,EAAW,IAAI,GAAA;AAAA,IAClB,KAAA,CAAgB,GAAA,CAAI,CAAC,EAAA,EAAA,GAAO,kBAAC,6CAAA,IAAc,EAAM,EAAE,CAAA,UAAK,MAAA,iBAAQ,EAAA,+BAAY,IAAE,GAAA,EAAG,EAAE,CAAC;AAAA,EACvF,CAAA;AAEA,EAAA,MAAM,MAAA,EAAQ,IAAA,CACX,GAAA,CAAI,CAAC,UAAA,EAAA,GAAe;AACnB,IAAA,MAAM,OAAA,EAAS,MAAA,CAAO,UAAA,CAAW,EAAE,CAAA;AACnC,IAAA,MAAM,KAAA,EAAO,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAChC,IAAA,GAAA,CAAI,CAAC,IAAA,EAAM,OAAO,IAAA;AAIlB,IAAA,MAAM,SAAA,EAAW,WAAA,CAAY,UAAU,CAAA;AACvC,IAAA,MAAM,KAAA,mBAAO,QAAA,CAAS,IAAA,UAAQ,IAAA;AAC9B,IAAA,MAAM,eAAA,oCAAiB,QAAA,CAAS,cAAA,UAAkB,UAAA,CAAW,gBAAA,UAAkB,MAAA;AAC/E,IAAA,uBACE,6BAAA,KAAC,EAAA,EACC,QAAA,kBAAA,6BAAA,YAAC,EAAA,EAAa,IAAA,EAAM,KAAA,GAAQ,IAAA,EAAM,cAAA,EAC/B,QAAA,EAAA,CAAC,SAAA,EAAA,mBACA,6BAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,IAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA,EAAM,QAAA;AAAA,QACN,IAAA;AAAA,QACA,cAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA;AAAA,MAAA;AAAA,IACF,EAAA,CAEJ,EAAA,CAAA,EAdQ,MAeV,CAAA;AAAA,EAEJ,CAAC,CAAA,CACA,MAAA,CAAO,OAAO,CAAA;AAEjB,EAAA,GAAA,CAAI,KAAA,CAAM,OAAA,IAAW,CAAA,EAAG,OAAO,IAAA;AAE/B,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,WAAA,EACZ,QAAA,EAAA;AAAA,IAAA,OAAA;AAAA,IACA,aAAA,kBACC,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,WAAA,EAAa,QAAA,EAAA,MAAA,CAAM,EAAA,kBAElC,6BAAA,KAAC,EAAA,EAAI,SAAA,EAAW,YAAA,CAAa,OAAO,CAAA,EAAI,QAAA,EAAA,MAAA,CAAM;AAAA,EAAA,EAAA,CAElD,CAAA;AAEJ;AAgFO,SAAS,qBAAA,CAAsB;AAAA,EACpC,WAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,kBAAA;AAAA,EACA,YAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA,EAAQ,iBAAA;AAAA,EACR,QAAA,EAAU,CAAA;AAAA,EACV,YAAA;AAAA,EACA,WAAA,EAAa,EAAA;AAAA,EACb,MAAA;AAAA,EACA,YAAA,EAAc,kBAAA;AAAA,EACd,YAAA,EAAAA,aAAAA;AAAA,EACA,aAAA,EAAe,wBAAA;AAAA,EACf;AACF,CAAA,EAA+B;AAS7B,EAAA,MAAM,oBAAA,kBAAsB,YAAA,+BAAc,SAAA,IAAW,CAAA;AACrD,EAAA,MAAM,WAAA,EACJ,YAAA,IAAgB,KAAA,EAAA,GAChB,WAAA,GACA,SAAA,IAAa,KAAA,EAAA,GACb,SAAA,IAAa,KAAA,GACb,SAAA,IAAa,GAAA,GACb,CAAC,oBAAA,EACG,kDAAA,sBAAmB,EAAwB;AAAA,IACzC,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,KAAA,EAAO,UAAA;AAAA,IACP,WAAA,EAAa;AAAA,MACX,aAAA,EAAe,mBAAA,IAAuB,KAAA,EAAA,EAAY,MAAA,CAAO,kBAAkB,EAAA,EAAI,KAAA,CAAA;AAAA,MAC/E,KAAA,EAAO,aAAA,IAAiB,KAAA,EAAA,EAAY,YAAA,CAAa,IAAA,CAAK,GAAG,EAAA,EAAI,KAAA,CAAA;AAAA,MAC7D,YAAA,EAAc,aAAA,GAAgB,YAAA,CAAa,OAAA,EAAS,EAAA,EAAI,YAAA,CAAa,IAAA,CAAK,GAAG,EAAA,EAAI,KAAA;AAAA,IACnF;AAAA,EACF,CAAC,EAAA,EACD,IAAA;AAIN,EAAA,MAAM,YAAA,EAAc,4BAAA;AAAA;AAAA;AAAA;AAAA,IAIlB,CAAA,EAAA,GAAO,CAAC,oBAAA,GAAuB,aAAA,EAAe,EAAE,IAAA,EAAM,aAAa,EAAA,EAAI,KAAA,CAAA;AAAA,IACvE,CAAC,YAAA,EAAc,mBAAmB;AAAA,EACpC,CAAA;AACA,EAAA,MAAM,EAAE,KAAK,EAAA,EAAI,4CAAA,UAAqC,EAAY,EAAE,YAAY,CAAC,CAAA;AAIjF,EAAA,MAAM,sBAAA,EAAwB,4BAAA;AAAA,IAC5B,CAAA,EAAA,oBAAMA,aAAAA,UAAAA,CAAiB,CAAC,IAAA,EAAc,GAAA,EAAA,GAAkB,4CAAA,IAAgB,EAAM,GAAA,EAAK,UAAU,CAAA,GAAA;AAAA,IAC7F,CAACA,aAAAA,EAAc,UAAU;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,KAAA,oCAAqB,WAAA,0BAAe,IAAA,+BAAM,QAAA,UAAQ,CAAC,GAAA;AAMzD,EAAA,MAAM,QAAA,EAAU,IAAI,GAAA,CAAI,aAAA,GAAgB,CAAC,CAAC,CAAA;AAC1C,EAAA,MAAM,YAAA,EAAc,OAAA,CAAQ,KAAA,EAAO,EAAA,EAAI,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,EAAA,GAAM,CAAC,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAI,CAAC,EAAA,EAAI,IAAA;AAGlF,EAAA,GAAA,CAAI,CAAC,WAAA,CAAY,MAAA,EAAQ,OAAO,IAAA;AAEhC,EAAA,MAAM,QAAA,EAAwC,CAAC,CAAA;AAC/C,EAAA,IAAA,CAAA,MAAW,IAAA,GAAO,WAAA,EAAa;AAC7B,IAAA,GAAA,CAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,EAAG,OAAA,CAAQ,GAAA,CAAI,IAAI,EAAA,EAAI,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAAA,EAC5B;AASA,EAAA,IAAI,aAAA,EAAe,oDAAA,MAAqB,CAAO,IAAA,CAAK,OAAO,CAAC,CAAA;AAC5D,EAAA,GAAA,CAAI,UAAA,EAAY;AAId,IAAA,MAAM,oBAAA,EAAsB,uDAAA,UAAkC,CAAA;AAC9D,IAAA,MAAM,SAAA,EAAW,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAA,GAAM,uDAAA,CAAyB,EAAA,IAAM,mBAAmB,CAAA;AAC9F,IAAA,GAAA,CAAI,QAAA,CAAS,OAAA,EAAS,CAAA,EAAG;AACvB,MAAA,aAAA,EAAe,CAAC,GAAG,QAAA,EAAU,GAAG,YAAA,CAAa,MAAA,CAAO,CAAC,CAAA,EAAA,GAAM,uDAAA,CAAyB,EAAA,IAAM,mBAAmB,CAAC,CAAA;AAAA,IAChH;AAAA,EACF;AAEA,EAAA,uBACE,8BAAA,KAAC,EAAA,EAAI,SAAA,EAAU,WAAA,EACb,QAAA,EAAA;AAAA,oBAAA,6BAAA,IAAC,EAAA,EAAG,SAAA,EAAU,0CAAA,EAA4C,QAAA,EAAA,MAAA,CAAM,CAAA;AAAA,IAC/D,YAAA,CAAa,GAAA,CAAI,CAAC,IAAA,EAAA,mBACjB,6BAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QAEC,IAAA;AAAA,QACA,IAAA,EAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,QAClB,OAAA;AAAA,QACA,QAAA,EAAU,qBAAA;AAAA,QACV,WAAA;AAAA,QACA,YAAA;AAAA,QACA,MAAA;AAAA,QACA,iBAAA;AAAA,QACA,OAAA,kBACE,6BAAA,IAAC,EAAA,EAAG,SAAA,EAAU,iGAAA,EACX,QAAA,EAAA,6DAAA,IAAkC,EAAA,CACrC;AAAA,MAAA,CAAA;AAAA,MAZG;AAAA,IAcP,CACD;AAAA,EAAA,EAAA,CACH,CAAA;AAEJ;ADtWA;AACA;AACE;AACF,sDAAC","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-UXDWRC5Y.cjs","sourcesContent":[null,"\"use client\";\n\n/**\n * RelatedContentSection\n *\n * Renders content references grouped by type using the canonical card\n * components. MOVED from the hub (`components/shared/related-content-card.tsx`)\n * so any consuming app can embed it; the hub keeps a thin wrapper that\n * pre-binds its host-specific injections (nav hook, URL recomposition,\n * program configs, admin campaign card).\n *\n * THREE data modes (precedence top-down):\n * 1. CONTROLLED — `contentRefs` provided (even `[]`): render exactly those\n * refs, no suggestion fetch (the original investor-update behavior).\n * 2. SUGGESTION — `entityType` + `entityId` provided: self-fetch\n * `GET {apiBaseUrl}/api/related-content?entityType&entityId[&count][&excludeTypes]`\n * (the generic 5-tier engine's second web service). `minResults` maps to\n * `count`; absent → param not sent (server default applies). Each ref\n * carries a `reason` (data-only — never rendered, matching the\n * FaqSection/FaqWithReason precedent).\n * 3. SSR-HYDRATED suggestion — also pass `initialItems` (the server page\n * called the engine directly); the first client fetch is skipped per the\n * `useSelfFetch` initialData contract.\n *\n * Group layout (list vs grid) + card size (lg vs default) come from\n * `CONTENT_REF_GROUPS` in `../../utils/content-ref-groups` — single source of\n * truth, no per-type logic in this file. Skeletons come from\n * `renderSkeletonForType` so the placeholder height matches the loaded card\n * exactly (zero layout shift on resolve).\n *\n * One API call per content type via the shared list-URL builder\n * (`buildListUrl` — injectable; defaults to the lib's byte-parity-tested\n * builder prefixed with `apiBaseUrl`). Fetching uses `useSelfFetch` (plain\n * fetch, NO react-query) so third-party embedders need no QueryClientProvider;\n * cards are imported via DEEP module paths (not the chat barrel) so this\n * chunk never reaches `@tanstack/react-query`.\n *\n * LOCKSTEP NOTE: this file's per-type card/skeleton dispatch is the SIZED\n * sibling of the chat-side `CHAT_CARD_REGISTRY` (`../chat/entity-cards/\n * dispatch.tsx`), which renders compact `size='sm'` cards wired to the chat\n * runtime. Two dispatchers by design — when registering a new fetch-mode\n * content type, add it BOTH there and here (cards + skeleton + list URL).\n */\n\nimport React, { useMemo } from 'react';\nimport {\n CONTENT_REF_GROUPS,\n getContentRefLabelOrTitleCase,\n orderContentRefTypes,\n type ContentRefGroupConfig,\n} from '../../utils/content-ref-groups';\nimport type { ContentRef, ContentRefWithReason } from '../../types/content-ref';\nimport { useSelfFetch } from '../../hooks/use-self-fetch';\nimport { extractItems, extractItemId } from '../../utils/extract-items';\nimport { buildListUrl as libBuildListUrl, canonicalContentRefType } from '../../utils/list-url';\nimport { buildSuggestionUrl } from '../../utils/suggestion-url';\nimport { decideNewTab } from '../chat/utils/decide-new-tab';\n// DEEP card imports — NOT the `../chat` barrel (the barrel statically reaches\n// @tanstack/react-query via embeddable-chat + its hooks). Deep paths keep this\n// component's SOURCE graph react-query-free. Note: tsup's shared-chunk\n// splitting may still colocate the cards with chat hooks in one dist chunk\n// (react-query is a required peerDep, so resolution always succeeds) — the\n// guarantee that matters here is the RUNTIME one: nothing on this path ever\n// instantiates a QueryClient, so embedders need NO QueryClientProvider.\nimport { BlogCard, BlogCardSkeleton } from '../chat/entity-cards/blog-card';\nimport { CaseStudyCard, CaseStudyCardSkeleton } from '../chat/entity-cards/case-study-card';\nimport { CustomerInterviewCard, CustomerInterviewCardSkeleton } from '../chat/entity-cards/customer-interview-card';\nimport { ProductReleaseCard, ProductReleaseCardSkeleton } from '../chat/entity-cards/product-release-card';\nimport { buildProductReleaseCardProps } from '../chat/entity-cards/product-release-card-defaults';\nimport { ProgramCard, ProgramCardSkeleton } from '../chat/entity-cards/program-card';\nimport { InvestorUpdateCard, InvestorUpdateCardSkeleton } from '../chat/entity-cards/investor-update-card';\nimport { OnboardingGuideCard, OnboardingGuideCardSkeleton } from '../chat/entity-cards/onboarding-guide-card';\nimport { RoadmapCard, RoadmapCardSkeleton } from '../chat/entity-cards/roadmap-card';\n// Type-only — erased at build, no runtime dependency on the dispatch module.\nimport type { ChatCardDispatchExtras } from '../chat/entity-cards/dispatch';\n\ntype CardSize = 'lg' | 'default' | 'sm';\n\n/** Anchor prop bundle the per-card link surface receives — same shape the\n * hub's `useNavLink` returns and the chat dispatcher's anchor builders\n * produce. `null` = non-anchor mode (no URL). */\nexport interface CardLinkAnchorProps {\n href: string;\n target?: '_blank';\n rel?: 'noopener noreferrer';\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/** Render-prop component injection for the navigation decision — keeps hook\n * calls legal (hooks live INSIDE the injected component; `CardForType`\n * itself calls zero hooks). The hub injects a `useNavLink`-backed provider;\n * the default is hook-free (pure `decideNewTab`). MUST be defined at module\n * scope by hosts — an inline arrow would remount every card each render. */\nexport interface CardLinkProviderProps {\n href: string | null;\n targetPlatform: string | null;\n children: (linkProps: CardLinkAnchorProps | null) => React.ReactElement | null;\n}\nexport type CardLinkProvider = React.ComponentType<CardLinkProviderProps>;\n\n/** Default link provider for standalone embeds: relative/-same-origin hrefs\n * stay same-tab, cross-origin pops a new tab (pure `decideNewTab` with no\n * platform context — `currentSource: ''` falls through to the origin\n * check). No router integration, no hooks. */\nfunction DefaultLinkPropsProvider({ href, targetPlatform, children }: CardLinkProviderProps): React.ReactElement | null {\n if (!href) return children(null);\n const newTab = decideNewTab({ href, targetPlatform, currentSource: '' });\n return children(\n newTab\n ? { href, target: '_blank', rel: 'noopener noreferrer' }\n : { href },\n );\n}\n\n/** Default href resolution: trust the ref's stored url/targetPlatform as the\n * API composed them. The hub overrides this with its `buildContentURL`\n * re-composition so dev gets localhost and prod gets platform domains. */\nfunction defaultResolveHref(ref: ContentRef): { href: string | null; targetPlatform: string | null } {\n return { href: ref.url || null, targetPlatform: ref.targetPlatform ?? null };\n}\n\n/** Host-injected renderer pair for the admin-only `marketing_campaign` type.\n * Absent (every non-hub embed) → the type renders nothing (its list URL\n * hits `/api/admin`, unreachable outside the hub anyway). */\nexport interface AdminCampaignCardSlot {\n Card: React.ComponentType<{ campaign: any }>;\n Skeleton: React.ComponentType<{ size?: 'default' | 'sm' }>;\n}\n\n/**\n * Per-type skeleton dispatch — returns the SAME colocated skeleton the\n * resolved card renders, sized to match (zero layout shift on resolve).\n * The chat-side `CHAT_CARD_REGISTRY` already does this via\n * `entry.skeleton()`; this surface exposes the same discipline to the\n * related-content rail.\n */\nfunction renderSkeletonForType(\n type: string,\n size: CardSize,\n adminCampaignCard?: AdminCampaignCardSlot,\n): React.ReactNode {\n // Most card skeletons accept only `{default, sm}`. `'lg'` collapses to\n // `'default'`. ProductReleaseCardSkeleton uses lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n switch (type) {\n case 'blog_post_existing':\n return <BlogCardSkeleton size={legacySize} />;\n case 'case_study':\n return <CaseStudyCardSkeleton size={legacySize} />;\n case 'customer_interview':\n return <CustomerInterviewCardSkeleton size={legacySize} />;\n case 'product_release':\n return <ProductReleaseCardSkeleton size={size === 'sm' ? 'sm' : 'lg'} />;\n case 'podcast':\n case 'webinar':\n case 'event':\n return <ProgramCardSkeleton size={legacySize} />;\n case 'investor_update':\n return <InvestorUpdateCardSkeleton size={legacySize} />;\n case 'onboarding_guide':\n // The rich catalog variant (hero + author grid, clamped description) —\n // the step-numbered 'default' variant is for the guide detail page's\n // \"More in section\" rail, not this full-width row.\n return <OnboardingGuideCardSkeleton size={size === 'sm' ? 'sm' : 'catalog'} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Skeleton size={legacySize} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return <RoadmapCardSkeleton size={legacySize} />;\n default:\n return null;\n }\n}\n\n/**\n * Per-type card dispatch — renders the right card with the right size.\n * Sized cards (`'lg'` / `'default'`) are unique to this rail — the chat\n * dispatcher only renders `'sm'`, so we go directly through the per-type\n * cards here.\n *\n * PURE FUNCTION COMPONENT WITH ZERO HOOK CALLS: the placeholder comes from a\n * plain `extras.buildOgPlaceholderUrl` call (the chat `dispatch.tsx`\n * pattern) and the anchor-prop bundle arrives via the `LinkProvider`\n * render-prop from the parent — so per-card hook legality is owned by the\n * injected provider component, not by this switch.\n *\n * `href` comes from the host's `resolveHref(ref)` (hub: live\n * `buildContentURL` recomposition; default: the ref's stored url).\n */\nfunction CardForType({\n type,\n item,\n size,\n href,\n targetPlatform,\n linkProps,\n extras,\n adminCampaignCard,\n}: {\n type: string;\n item: any;\n size: CardSize;\n href: string;\n targetPlatform: string | null;\n linkProps: CardLinkAnchorProps | null;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n}): React.ReactNode {\n // Most card variants accept only `{default, sm}`. `'lg'` collapses to\n // `'default'` for those. ProductReleaseCard uses its own lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n // OG placeholder URL — injected into the pure-presentation cards so they\n // render a branded fallback when the row's featured image is null. Plain\n // function call (NOT a hook). Title is the universal field across all card\n // item shapes used here.\n const placeholderUrl =\n extras?.buildOgPlaceholderUrl?.((item?.title as string | undefined) ?? '') ?? undefined;\n\n // Top-level target/rel for cards that take them as separate props\n // (BlogCard, CaseStudyCard, …). ProductReleaseCard takes the bundle as a\n // single `anchorProps={...}` and uses `linkProps` directly. When the host\n // didn't surface a URL, `linkProps` is null and the card stays in\n // non-anchor mode.\n const anchorAttrs: Pick<CardLinkAnchorProps, 'target' | 'rel'> = linkProps\n ? { target: linkProps.target, rel: linkProps.rel }\n : {};\n\n switch (type) {\n case 'blog_post_existing':\n return <BlogCard post={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'case_study':\n return <CaseStudyCard study={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'customer_interview':\n return <CustomerInterviewCard interview={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'product_release': {\n // Anchor-prop pattern: build product-release lg-variant props from the\n // shared `buildProductReleaseCardProps` so this rail and the /releases\n // catalog page render byte-identically. The card wraps in\n // `<a {...anchorProps}>` ONLY when `anchorProps.href` is set — pass\n // `undefined` (not an empty object) when href is empty so the card\n // stays in non-anchor mode without rendering a dead <a> tag.\n const releaseSize = size === 'sm' ? 'sm' : 'lg';\n const buildReleaseProps = extras?.buildProductReleaseCardProps ?? buildProductReleaseCardProps;\n const releaseProps = buildReleaseProps(item);\n return (\n <ProductReleaseCard\n size={releaseSize}\n title={item.title}\n summary={item.summary}\n version={item.version}\n {...releaseProps}\n anchorProps={linkProps ?? undefined}\n />\n );\n }\n case 'podcast':\n return extras?.programConfigs?.podcast\n ? <ProgramCard config={extras.programConfigs.podcast} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'webinar':\n return extras?.programConfigs?.webinar\n ? <ProgramCard config={extras.programConfigs.webinar} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'event':\n return extras?.programConfigs?.event\n ? <ProgramCard config={extras.programConfigs.event} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'investor_update':\n return <InvestorUpdateCard update={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'onboarding_guide':\n // Catalog variant (see skeleton note) — full-width rich card with a\n // line-clamped description instead of the step-numbered rail card.\n return <OnboardingGuideCard guide={item} size={size === 'sm' ? 'sm' : 'catalog'} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Card campaign={item} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return (\n <RoadmapCard\n item={item}\n href={href ?? ''}\n targetPlatform={targetPlatform}\n userVote={null}\n onVote={() => {}}\n size={legacySize}\n cardType={type as 'roadmap_item' | 'delivery_item' | 'internal_task'}\n {...anchorAttrs}\n />\n );\n default:\n return null;\n }\n}\n\n// =============================================================================\n// Fetch all items for a type in ONE server-sorted call, via the injectable\n// list-URL builder. `useSelfFetch` (URL = cache key) replaces the hub's old\n// react-query usage: `enabled` ≙ `url === null`, `!res.ok`/network error ≙\n// `error → items null → group renders nothing`. Accepted deltas vs\n// react-query: no retry/backoff, no focus refetch, no cross-mount cache.\n// =============================================================================\n\nfunction useGroupItems(\n type: string,\n refs: ContentRef[],\n buildUrl: (type: string, ids: string[]) => string | null,\n) {\n const ids = refs.map((r) => r.id);\n const url = ids.length > 0 ? buildUrl(type, ids) : null;\n const { data, isLoading } = useSelfFetch<unknown>(url);\n const items = data != null ? extractItems(data) : null;\n return { items, isLoading };\n}\n\n// =============================================================================\n// Per-group renderer — one API call, server-sorted, then render cards via the\n// dispatcher with per-type skeletons + per-type layout from CONTENT_REF_GROUPS.\n// =============================================================================\n\n/** Map columns prop → tailwind grid class. Only consulted for grid-layout\n * groups; list-layout groups stack vertically. */\nfunction gridClassFor(columns: 2 | 3): string {\n return columns === 3\n ? 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6'\n : 'grid grid-cols-1 sm:grid-cols-2 gap-6';\n}\n\n/** Resolve the group config for a type, falling back to a grid layout with\n * the default card size for unregistered types so the section still renders\n * rather than silently dropping them. The `label` field on the fallback is\n * intentionally a placeholder — the section heading goes through\n * `getContentRefLabelOrTitleCase(type)` instead so cross-surface labels\n * stay consistent between this rail and the investor-email builder. */\nfunction resolveGroupConfig(type: string): ContentRefGroupConfig {\n return CONTENT_REF_GROUPS[type] ?? {\n label: type,\n order: 999,\n layout: 'grid',\n gridSize: 'default',\n };\n}\n\nfunction ContentGroup({\n type,\n refs,\n columns,\n buildUrl,\n resolveHref,\n LinkProvider,\n extras,\n adminCampaignCard,\n heading,\n}: {\n type: string;\n refs: ContentRef[];\n columns: 2 | 3;\n buildUrl: (type: string, ids: string[]) => string | null;\n resolveHref: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n LinkProvider: CardLinkProvider;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n /** Group heading, rendered INSIDE the group so a group that resolves to\n * nothing (fetch miss / unsupported type / missing program config) drops\n * its heading too — no orphaned titles. */\n heading: React.ReactNode;\n}) {\n const { items, isLoading } = useGroupItems(type, refs, buildUrl);\n const config = resolveGroupConfig(type);\n const isListLayout = config.layout === 'list';\n const cardSize = config.gridSize;\n\n // Skeleton gate: `isLoading && !items` — SSR HTML and the client's first\n // paint render identical skeletons (useSelfFetch starts isLoading=true on\n // both sides), and once items exist they are never replaced by skeletons.\n if (isLoading && !items) {\n const skeletons = refs.map((r) => (\n <div key={r.id}>{renderSkeletonForType(type, cardSize, adminCampaignCard)}</div>\n ));\n return (\n <div className=\"space-y-4\">\n {heading}\n {isListLayout ? (\n <div className=\"space-y-4\">{skeletons}</div>\n ) : (\n <div className={gridClassFor(columns)}>{skeletons}</div>\n )}\n </div>\n );\n }\n\n if (!items || items.length === 0) return null;\n\n // Index fetched rows by id, then render in REF order — refs carry the\n // intended sequence (suggestion mode: the engine's tier order, so\n // same-platform/tag-matched items lead; controlled mode: the curated\n // display_order). The list APIs return rows date-sorted, which would\n // otherwise scramble that ordering (same-platform items sinking below\n // newer cross-platform ones).\n // Shared extractor (NOT raw `.id`) — some API shapes key items differently\n // (e.g. external_id types); raw access would silently drop valid items.\n const itemById = new Map(\n (items as any[]).map((it) => [extractItemId(type, it) ?? String((it as any)?.id), it]),\n );\n\n const cards = refs\n .map((contentRef) => {\n const itemId = String(contentRef.id);\n const item = itemById.get(itemId);\n if (!item) return null;\n // Re-compose the URL via the host's resolver (hub: buildContentURL so\n // dev gets localhost and prod the right platform domain; default: the\n // ref's stored url as the API composed it).\n const resolved = resolveHref(contentRef);\n const href = resolved.href ?? '';\n const targetPlatform = resolved.targetPlatform ?? contentRef.targetPlatform ?? null;\n return (\n <div key={itemId}>\n <LinkProvider href={href || null} targetPlatform={targetPlatform}>\n {(linkProps) => (\n <CardForType\n type={type}\n item={item}\n size={cardSize}\n href={href}\n targetPlatform={targetPlatform}\n linkProps={linkProps}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n />\n )}\n </LinkProvider>\n </div>\n );\n })\n .filter(Boolean);\n\n if (cards.length === 0) return null;\n\n return (\n <div className=\"space-y-4\">\n {heading}\n {isListLayout ? (\n <div className=\"space-y-4\">{cards}</div>\n ) : (\n <div className={gridClassFor(columns)}>{cards}</div>\n )}\n </div>\n );\n}\n\n// =============================================================================\n// Main component\n// =============================================================================\n\ninterface RelatedContentResponse {\n refs: ContentRefWithReason[];\n}\n\nexport interface RelatedContentSectionProps {\n /** CONTROLLED mode (the original behavior). When defined — even `[]` — no\n * suggestion fetch runs and exactly these refs render. */\n contentRefs?: ContentRef[];\n /** SUGGESTION mode (with `entityId`): self-fetch suggestions for this host\n * entity from `{apiBaseUrl}/api/related-content`. Ignored when\n * `contentRefs` is provided. */\n entityType?: string;\n entityId?: number | string;\n /** Maps to the suggestion API's `count` param — the PER-TYPE fill target\n * for every candidate type EXCEPT the host's own. Absent → param not sent\n * (server default applies). */\n minResults?: number;\n /** Maps to the suggestion API's `sameTypeCount` param — the budget for the\n * candidate type MATCHING the host's own `entityType` (same-type boost:\n * a blog post's rail leads with more blog posts). Absent → param not\n * sent (host's type uses the server's `count`). */\n sameTypeMinResults?: number;\n /** SSR hydrate for suggestion mode — the server page ran the engine and\n * drills the refs here; the first client fetch is skipped (useSelfFetch\n * initialData contract). */\n initialItems?: ContentRefWithReason[];\n /** Section title (default: \"Related Content\") */\n title?: string;\n /**\n * Grid columns at desktop. 2 = denser cards / wider summary (original\n * investor-update layout); 3 = more cards per row for dashboards.\n * Only consulted for grid-layout groups. Default: 2.\n */\n columns?: 2 | 3;\n /**\n * ContentRef.type values to exclude. Honored in ALL modes — controlled\n * mode post-filters (original behavior); suggestion mode ALSO forwards the\n * list verbatim as the API's `excludeTypes=` param so excluded types never\n * consume engine fill slots (`minResults` stays honored). The subtraction\n * happens SERVER-side — this component never mirrors the hub's candidate\n * list.\n */\n excludeTypes?: string[];\n /**\n * SUGGESTION-mode allow-list (rail vocabulary): which content types\n * participate in this rail. Sent verbatim as the API's `types=` param —\n * the SERVER intersects it with its own allowed candidate set, and\n * platform policy gates (e.g. internal-only types) ALWAYS win: the client\n * cannot request its way past them. Absent → all server-side candidates.\n */\n includeTypes?: string[];\n /** Fetch-URL prefix for third-party embeds / reverse proxies\n * ('' = same-origin). Applied to BOTH the suggestion fetch and the\n * default per-group list fetches. */\n apiBaseUrl?: string;\n /** Host injection bundle — REUSES the chat dispatcher's\n * `ChatCardDispatchExtras` (programConfigs, buildOgPlaceholderUrl,\n * buildProductReleaseCardProps override). Program groups render nothing\n * when their config is absent. */\n extras?: ChatCardDispatchExtras;\n /** Hub injects its `buildContentURL` recomposition; default uses the\n * ref's stored `url`/`targetPlatform` as the API composed them. */\n resolveHref?: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n /** Hub injects its registry-driven entity-list-api builder; default = the\n * lib's `buildListUrl(type, ids, apiBaseUrl)`. */\n buildListUrl?: (type: string, ids: string[]) => string | null;\n /** Hub injects a `useNavLink`-backed render-prop provider; default = pure\n * anchor via `decideNewTab`. MUST be a module-scope component. */\n LinkProvider?: CardLinkProvider;\n /** Renderer pair for the admin-only `marketing_campaign` type. Absent →\n * the type renders nothing. */\n adminCampaignCard?: AdminCampaignCardSlot;\n}\n\nexport function RelatedContentSection({\n contentRefs,\n entityType,\n entityId,\n minResults,\n sameTypeMinResults,\n includeTypes,\n initialItems,\n title = 'Related Content',\n columns = 2,\n excludeTypes,\n apiBaseUrl = '',\n extras,\n resolveHref = defaultResolveHref,\n buildListUrl,\n LinkProvider = DefaultLinkPropsProvider,\n adminCampaignCard,\n}: RelatedContentSectionProps) {\n // ── Hooks above EVERY early return (the original `if (!contentRefs.length)\n // return null` guard moved below them). ──\n\n // Suggestion-mode fetch URL — null in controlled mode (contentRefs defined,\n // even []) or when the entity scope is incomplete.\n // `includeTypes: []` is an explicit \"nothing participates\" — skip the fetch\n // entirely (an empty-string `types=` param would be dropped by the URL\n // builder and read server-side as \"all candidates\") AND ignore SSR refs.\n const suggestionsDisabled = includeTypes?.length === 0;\n const suggestUrl =\n contentRefs === undefined &&\n entityType &&\n entityId !== undefined &&\n entityId !== null &&\n entityId !== '' &&\n !suggestionsDisabled\n ? buildSuggestionUrl('/api/related-content', {\n apiBaseUrl,\n entityType,\n entityId,\n count: minResults,\n extraParams: {\n sameTypeCount: sameTypeMinResults !== undefined ? String(sameTypeMinResults) : undefined,\n types: includeTypes !== undefined ? includeTypes.join(',') : undefined,\n excludeTypes: excludeTypes && excludeTypes.length > 0 ? excludeTypes.join(',') : undefined,\n },\n })\n : null;\n // Memoize the initialData wrapper — useSelfFetch re-syncs on [initialData],\n // and a fresh per-render object would loop setState under re-rendering\n // parents (the latent FaqSection bug, fixed there in the same change).\n const initialData = useMemo<RelatedContentResponse | undefined>(\n // An explicitly disabled rail (includeTypes: []) must ignore SSR-hydrated\n // refs too — otherwise useSelfFetch(null, {initialData}) keeps serving\n // initialItems and the \"nothing participates\" contract silently breaks.\n () => (!suggestionsDisabled && initialItems ? { refs: initialItems } : undefined),\n [initialItems, suggestionsDisabled],\n );\n const { data } = useSelfFetch<RelatedContentResponse>(suggestUrl, { initialData });\n\n // Default group fetcher: the lib's byte-parity-tested builder, prefixed for\n // embeds. Memoized so group-fetch URLs stay value-stable across renders.\n const effectiveBuildListUrl = useMemo(\n () => buildListUrl ?? ((type: string, ids: string[]) => libBuildListUrl(type, ids, apiBaseUrl)),\n [buildListUrl, apiBaseUrl],\n );\n\n const refs: ContentRef[] = contentRefs ?? data?.refs ?? [];\n\n // Per-consumer type gating — drops refs whose `type` is in the exclude\n // list. In suggestion mode the server already subtracted these (the param\n // is forwarded above); the client filter stays as an idempotent guard and\n // IS the mechanism in controlled mode (original behavior).\n const exclude = new Set(excludeTypes || []);\n const visibleRefs = exclude.size > 0 ? refs.filter((r) => !exclude.has(r.type)) : refs;\n // Zero refs (still loading in suggestion mode, or genuinely empty) → no\n // empty shell.\n if (!visibleRefs.length) return null;\n\n const grouped: Record<string, ContentRef[]> = {};\n for (const ref of visibleRefs) {\n if (!grouped[ref.type]) grouped[ref.type] = [];\n grouped[ref.type].push(ref);\n }\n\n // Registered types in CONTENT_REF_GROUPS order, then any unregistered\n // types appended (same shape the investor-email builder uses — both\n // consume `orderContentRefTypes` so cross-surface ordering matches).\n // SAME-TYPE FIRST: when a host entityType is known (suggestion / SSR\n // modes), its own content-type group is hoisted to the top — a blog\n // post's rail leads with blog posts. Rail group keys are compared via\n // the shared alias canonicalizer (blog_post_existing ↔ blog_post).\n let orderedTypes = orderContentRefTypes(Object.keys(grouped));\n if (entityType) {\n // Canonicalize BOTH sides — hosts pass registry vocab ('blog_post') but\n // rail-vocab aliases ('blog_post_existing') are also legal inputs; a raw\n // comparison would silently lose the same-type-first hoist for aliases.\n const canonicalEntityType = canonicalContentRefType(entityType);\n const sameType = orderedTypes.filter((t) => canonicalContentRefType(t) === canonicalEntityType);\n if (sameType.length > 0) {\n orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !== canonicalEntityType)];\n }\n }\n\n return (\n <div className=\"space-y-8\">\n <h2 className=\"text-2xl font-bold text-ods-text-primary\">{title}</h2>\n {orderedTypes.map((type) => (\n <ContentGroup\n key={type}\n type={type}\n refs={grouped[type]}\n columns={columns}\n buildUrl={effectiveBuildListUrl}\n resolveHref={resolveHref}\n LinkProvider={LinkProvider}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n heading={\n <h3 className=\"font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider\">\n {getContentRefLabelOrTitleCase(type)}\n </h3>\n }\n />\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
var _chunk3TDLFCCScjs = require('../chunk-3TDLFCCS.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _chunkUXDWRC5Ycjs = require('../chunk-UXDWRC5Y.cjs');
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
|
|
@@ -7837,5 +7837,5 @@ function LegalDocumentPage({
|
|
|
7837
7837
|
|
|
7838
7838
|
|
|
7839
7839
|
|
|
7840
|
-
exports.ADMIN_APPROVAL_REQUEST_CONTEXT_TYPE = _chunkNCXHTQH2cjs.ADMIN_APPROVAL_REQUEST_CONTEXT_TYPE; exports.AIEnrichButton = _chunkNCXHTQH2cjs.AIEnrichButton; exports.AIEnrichSection = _chunkNCXHTQH2cjs.AIEnrichSection; exports.AIRequiredBadge = _chunkNCXHTQH2cjs.AIRequiredBadge; exports.AIStatusIndicator = _chunkNCXHTQH2cjs.AIStatusIndicator; exports.AIWarningsSection = _chunkNCXHTQH2cjs.AIWarningsSection; exports.ANTHROPIC_SUPPORTED_IMAGE_MIME = _chunkNCXHTQH2cjs.ANTHROPIC_SUPPORTED_IMAGE_MIME; exports.APPROVAL_STATUS = _chunkNCXHTQH2cjs.APPROVAL_STATUS; exports.ASSISTANT_TYPE = _chunkNCXHTQH2cjs.ASSISTANT_TYPE; exports.AUTHOR_TYPE = _chunkNCXHTQH2cjs.AUTHOR_TYPE; exports.AUTO_CONTINUATION_DIRECTIVE_PREFIX = _chunkNCXHTQH2cjs.AUTO_CONTINUATION_DIRECTIVE_PREFIX; exports.AboutIcon = _chunkZ4IBEIWDcjs.AboutIcon; exports.Accordion = _chunkNCXHTQH2cjs.Accordion; exports.AccordionContent = _chunkNCXHTQH2cjs.AccordionContent; exports.AccordionItem = _chunkNCXHTQH2cjs.AccordionItem; exports.AccordionTrigger = _chunkNCXHTQH2cjs.AccordionTrigger; exports.ActionsMenu = _chunk6LK4VEXEcjs.ActionsMenu; exports.ActionsMenuDropdown = _chunk6LK4VEXEcjs.ActionsMenuDropdown; exports.AdminContentCard = _chunkNCXHTQH2cjs.AdminContentCard; exports.AiRobotIcon = _chunkZ4IBEIWDcjs.AiRobotIcon; exports.Alert = _chunkNCXHTQH2cjs.Alert; exports.AlertDescription = _chunkNCXHTQH2cjs.AlertDescription; exports.AlertDialog = _chunkNCXHTQH2cjs.AlertDialog; exports.AlertDialogAction = _chunkNCXHTQH2cjs.AlertDialogAction; exports.AlertDialogCancel = _chunkNCXHTQH2cjs.AlertDialogCancel; exports.AlertDialogContent = _chunkNCXHTQH2cjs.AlertDialogContent; exports.AlertDialogDescription = _chunkNCXHTQH2cjs.AlertDialogDescription; exports.AlertDialogFooter = _chunkNCXHTQH2cjs.AlertDialogFooter; exports.AlertDialogHeader = _chunkNCXHTQH2cjs.AlertDialogHeader; exports.AlertDialogOverlay = _chunkNCXHTQH2cjs.AlertDialogOverlay; exports.AlertDialogPortal = _chunkNCXHTQH2cjs.AlertDialogPortal; exports.AlertDialogTitle = _chunkNCXHTQH2cjs.AlertDialogTitle; exports.AlertDialogTrigger = _chunkNCXHTQH2cjs.AlertDialogTrigger; exports.AlertTitle = _chunkNCXHTQH2cjs.AlertTitle; exports.AlertTriangleIcon = _chunkZ4IBEIWDcjs.AlertTriangleIcon; exports.AllowedDomainsInput = _chunkNCXHTQH2cjs.AllowedDomainsInput; exports.AnnouncementBar = AnnouncementBar; exports.AnnouncementBarSkeleton = AnnouncementBarSkeleton; exports.AppHeader = _chunkNCXHTQH2cjs.AppHeader; exports.AppLayout = _chunkNCXHTQH2cjs.AppLayout; exports.AppLayoutDrawer = _chunkNCXHTQH2cjs.AppLayoutDrawerRoot; exports.AppLayoutDrawerBody = _chunkNCXHTQH2cjs.AppLayoutDrawerBody; exports.AppLayoutDrawerClose = _chunkNCXHTQH2cjs.AppLayoutDrawerClose; exports.AppLayoutDrawerContent = _chunkNCXHTQH2cjs.AppLayoutDrawerContent; exports.AppLayoutDrawerDescription = _chunkNCXHTQH2cjs.AppLayoutDrawerDescription; exports.AppLayoutDrawerFooter = _chunkNCXHTQH2cjs.AppLayoutDrawerFooter; exports.AppLayoutDrawerHeader = _chunkNCXHTQH2cjs.AppLayoutDrawerHeader; exports.AppLayoutDrawerTitle = _chunkNCXHTQH2cjs.AppLayoutDrawerTitle; exports.AppLayoutDrawerTrigger = _chunkNCXHTQH2cjs.AppLayoutDrawerTrigger; exports.ApprovalBatchMessage = _chunkNCXHTQH2cjs.ApprovalBatchMessage; exports.ApprovalRequestMessage = _chunkNCXHTQH2cjs.ApprovalRequestMessage; exports.ApprovalRequestNotificationTile = _chunkNCXHTQH2cjs.ApprovalRequestNotificationTile; exports.ArchiveChatModal = _chunkNCXHTQH2cjs.ArchiveChatModal; exports.ArchiveIcon = _chunkZ4IBEIWDcjs.ArchiveIcon; exports.ArgRow = _chunkNCXHTQH2cjs.ArgRow; exports.ArrayEntryManager = _chunkNCXHTQH2cjs.ArrayEntryManager; exports.ArticleDetailLayout = _chunk6LK4VEXEcjs.ArticleDetailLayout; exports.ArticleLayoutSkeleton = ArticleLayoutSkeleton; exports.AspectRatio = _chunkNCXHTQH2cjs.AspectRatio; exports.AssigneeDropdown = _chunkNCXHTQH2cjs.AssigneeDropdown; exports.AuditLoggingIcon = _chunkZ4IBEIWDcjs.AuditLoggingIcon; exports.AuthProvider = AuthProvider; exports.AuthProvidersList = _chunkNCXHTQH2cjs.AuthProvidersList; exports.Autocomplete = _chunkNCXHTQH2cjs.Autocomplete; exports.AutomateEverythingIcon = _chunkZ4IBEIWDcjs.AutomateEverythingIcon; exports.AutomatedDiagnosticsIcon = _chunkZ4IBEIWDcjs.AutomatedDiagnosticsIcon; exports.Badge = _chunkNCXHTQH2cjs.Badge; exports.BashIcon = _chunkZ4IBEIWDcjs.BashIcon; exports.BenefitCard = _chunkNCXHTQH2cjs.BenefitCard; exports.BenefitCardGrid = _chunkNCXHTQH2cjs.BenefitCardGrid; exports.BlockCard = _chunkNCXHTQH2cjs.BlockCard; exports.BlogCard = _chunkNCXHTQH2cjs.BlogCard; exports.BlogCardGridSkeleton = BlogCardGridSkeleton; exports.BlogCardSkeleton = _chunkNCXHTQH2cjs.BlogCardSkeleton; exports.BlogImagePlaceholder = _chunk6LK4VEXEcjs.BlogImagePlaceholder; exports.Board = _chunkNCXHTQH2cjs.Board; exports.BoardColumn = _chunkNCXHTQH2cjs.BoardColumn; exports.BoardColumnHeader = _chunkNCXHTQH2cjs.BoardColumnHeader; exports.BotIcon = _chunkZ4IBEIWDcjs.BotIcon; exports.BrandAssociationCard = _chunkNCXHTQH2cjs.BrandAssociationCard; exports.BrandAssociationGrid = _chunkNCXHTQH2cjs.BrandAssociationGrid; exports.Breadcrumb = _chunkNCXHTQH2cjs.Breadcrumb; exports.BreadcrumbEllipsis = _chunkNCXHTQH2cjs.BreadcrumbEllipsis; exports.BreadcrumbItem = _chunkNCXHTQH2cjs.BreadcrumbItem; exports.BreadcrumbLink = _chunkNCXHTQH2cjs.BreadcrumbLink; exports.BreadcrumbList = _chunkNCXHTQH2cjs.BreadcrumbList; exports.BreadcrumbPage = _chunkNCXHTQH2cjs.BreadcrumbPage; exports.BreadcrumbSeparator = _chunkNCXHTQH2cjs.BreadcrumbSeparator; exports.BreadcrumbSkeleton = BreadcrumbSkeleton; exports.BuildingsIcon = _chunkZ4IBEIWDcjs.BuildingsIcon; exports.BulkOperationsIcon = _chunkZ4IBEIWDcjs.BulkOperationsIcon; exports.BulletList = _chunkNCXHTQH2cjs.BulletList; exports.Button = _chunkTU26IZPOcjs.Button; exports.CHAT_ATTACHMENT_CONCURRENT_UPLOADS_PER_USER = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_CONCURRENT_UPLOADS_PER_USER; exports.CHAT_ATTACHMENT_MARKDOWN_PATTERN = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_MARKDOWN_PATTERN; exports.CHAT_ATTACHMENT_MIME_TYPES = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_MIME_TYPES; exports.CHAT_ATTACHMENT_VIEW_TOKEN_QUERY_PARAM = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_VIEW_TOKEN_QUERY_PARAM; exports.CHAT_ATTACHMENT_VIEW_URL_PREFIX = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_VIEW_URL_PREFIX; exports.CHAT_ATTACHMENT_VIEW_URL_PREFIX_REGEX_ESCAPED = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_VIEW_URL_PREFIX_REGEX_ESCAPED; exports.CHAT_TYPE = _chunkNCXHTQH2cjs.CHAT_TYPE; exports.CHIP_ACTION_BUTTON_CLASS = _chunkNCXHTQH2cjs.CHIP_ACTION_BUTTON_CLASS; exports.COMPACT_CARD_ICON_SLOT = _chunk6LK4VEXEcjs.COMPACT_CARD_ICON_SLOT; exports.COMPACT_CARD_IMAGE_SLOT = _chunk6LK4VEXEcjs.COMPACT_CARD_IMAGE_SLOT; exports.COMPACT_CARD_META_ROW = _chunk6LK4VEXEcjs.COMPACT_CARD_META_ROW; exports.COMPACT_CARD_META_ROW_BOX = _chunk6LK4VEXEcjs.COMPACT_CARD_META_ROW_BOX; exports.COMPACT_CARD_OUTER = _chunk6LK4VEXEcjs.COMPACT_CARD_OUTER; exports.COMPACT_CARD_OUTER_STATIC = _chunk6LK4VEXEcjs.COMPACT_CARD_OUTER_STATIC; exports.COMPACT_CARD_ROW_FILLER = _chunk6LK4VEXEcjs.COMPACT_CARD_ROW_FILLER; exports.COMPACT_CARD_SKELETON_IMAGE_SLOT = _chunk6LK4VEXEcjs.COMPACT_CARD_SKELETON_IMAGE_SLOT; exports.COMPACT_CARD_SKELETON_OUTER = _chunk6LK4VEXEcjs.COMPACT_CARD_SKELETON_OUTER; exports.COMPACT_CARD_SUBTITLE = _chunk6LK4VEXEcjs.COMPACT_CARD_SUBTITLE; exports.COMPACT_CARD_SUMMARY = _chunk6LK4VEXEcjs.COMPACT_CARD_SUMMARY; exports.COMPACT_CARD_TEXT_COL = _chunk6LK4VEXEcjs.COMPACT_CARD_TEXT_COL; exports.COMPACT_CARD_TITLE = _chunk6LK4VEXEcjs.COMPACT_CARD_TITLE; exports.COMPACT_CARD_TITLE_ROW = _chunk6LK4VEXEcjs.COMPACT_CARD_TITLE_ROW; exports.COMPACT_HEADER_BUTTON = _chunkNCXHTQH2cjs.COMPACT_HEADER_BUTTON; exports.CONNECTION_STATUS = _chunkNCXHTQH2cjs.CONNECTION_STATUS; exports.CUSTOM_ITEM_ID = _chunkNCXHTQH2cjs.CUSTOM_ITEM_ID; exports.CUSTOM_PRESET_KEY = _chunkNCXHTQH2cjs.CUSTOM_PRESET_KEY; exports.CampaignCardAdmin = _chunkNCXHTQH2cjs.CampaignCardAdmin; exports.CampaignCardAdminSkeleton = _chunkNCXHTQH2cjs.CampaignCardAdminSkeleton; exports.CapterraIcon = _chunkZ4IBEIWDcjs.CapterraIcon; exports.Card = _chunk6LK4VEXEcjs.Card; exports.CardContent = _chunk6LK4VEXEcjs.CardContent; exports.CardDescription = _chunk6LK4VEXEcjs.CardDescription; exports.CardFooter = _chunk6LK4VEXEcjs.CardFooter; exports.CardHeader = _chunk6LK4VEXEcjs.CardHeader; exports.CardHorizontal = _chunk6LK4VEXEcjs.CardHorizontal; exports.CardLoader = _chunkNCXHTQH2cjs.CardLoader; exports.CardSkeleton = CardSkeleton; exports.CardSkeletonGrid = CardSkeletonGrid; exports.CardTitle = _chunk6LK4VEXEcjs.CardTitle; exports.CartaIcon = _chunkZ4IBEIWDcjs.CartaIcon; exports.CaseStudyCard = _chunkNCXHTQH2cjs.CaseStudyCard; exports.CaseStudyCardSkeleton = _chunkNCXHTQH2cjs.CaseStudyCardSkeleton; exports.CategoriesCart = CategoriesCart; exports.CategoryCard = CategoryCard; exports.CategoryCardSkeleton = CategoryCardSkeleton; exports.CategorySidebarSkeleton = CategorySidebarSkeleton; exports.CategoryVendorSelectorSkeleton = CategoryVendorSelectorSkeleton; exports.ChangelogManager = _chunkNCXHTQH2cjs.ChangelogManager; exports.ChangelogSectionsManager = _chunkNCXHTQH2cjs.ChangelogSectionsManager; exports.ChatArchivePage = _chunkNCXHTQH2cjs.ChatArchivePage; exports.ChatAttachmentAddButton = _chunkNCXHTQH2cjs.ChatAttachmentAddButton; exports.ChatAttachmentChipStrip = _chunkNCXHTQH2cjs.ChatAttachmentChipStrip; exports.ChatCardLoader = _chunkNCXHTQH2cjs.ChatCardLoader; exports.ChatComposer = _chunkNCXHTQH2cjs.ChatComposer; exports.ChatContainer = _chunkNCXHTQH2cjs.ChatContainer; exports.ChatContent = _chunkNCXHTQH2cjs.ChatContent; exports.ChatDialogModals = _chunkNCXHTQH2cjs.ChatDialogModals; exports.ChatFooter = _chunkNCXHTQH2cjs.ChatFooter; exports.ChatHeader = _chunkNCXHTQH2cjs.ChatHeader; exports.ChatHeaderIconButton = _chunkNCXHTQH2cjs.ChatHeaderIconButton; exports.ChatIdentityProvider = _chunkNCXHTQH2cjs.ChatIdentityProvider; exports.ChatInput = _chunkNCXHTQH2cjs.ChatInput; exports.ChatMessageEnhanced = _chunkNCXHTQH2cjs.MemoizedChatMessageEnhanced; exports.ChatMessageList = _chunkNCXHTQH2cjs.ChatMessageList; exports.ChatMessageListSkeleton = _chunkNCXHTQH2cjs.ChatMessageListSkeleton; exports.ChatMessageRow = _chunkNCXHTQH2cjs.ChatMessageRow; exports.ChatMessageRowSkeleton = _chunkNCXHTQH2cjs.ChatMessageRowSkeleton; exports.ChatMessageSkeleton = _chunkNCXHTQH2cjs.ChatMessageSkeleton; exports.ChatPanelHeader = _chunkNCXHTQH2cjs.ChatPanelHeader; exports.ChatQuickAction = _chunkNCXHTQH2cjs.ChatQuickAction; exports.ChatSidebar = _chunkNCXHTQH2cjs.ChatSidebar; exports.ChatTicketItem = _chunkNCXHTQH2cjs.ChatTicketItem; exports.ChatTicketList = _chunkNCXHTQH2cjs.ChatTicketList; exports.ChatTypingIndicator = _chunkNCXHTQH2cjs.ChatTypingIndicator; exports.ChatVideoEntityCard = _chunkNCXHTQH2cjs.ChatVideoEntityCard; exports.CheckCircleIcon = _chunkZ4IBEIWDcjs.CheckCircleIcon; exports.CheckIcon = _chunkNCXHTQH2cjs.CheckIcon; exports.Checkbox = _chunk6JINAOI7cjs.Checkbox; exports.CheckboxBlock = _chunkNCXHTQH2cjs.CheckboxBlock; exports.CheckboxWithDescription = _chunkNCXHTQH2cjs.CheckboxWithDescription; exports.ChevronButton = _chunkSGJBUL2Ycjs.ChevronButton; exports.CircularProgress = _chunkNCXHTQH2cjs.CircularProgress; exports.ClaudeIcon = _chunkZ4IBEIWDcjs.ClaudeIcon; exports.ClickUpIcon = _chunkZ4IBEIWDcjs.ClickUpIcon; exports.ClickUpTasksManager = _chunkNCXHTQH2cjs.ClickUpTasksManager; exports.ClientOnlyHeader = _chunkNCXHTQH2cjs.ClientOnlyHeader; exports.CmdIcon = _chunkZ4IBEIWDcjs.CmdIcon; exports.CoinsIcon = _chunkZ4IBEIWDcjs.CoinsIcon; exports.ColorPickerInput = _chunkNCXHTQH2cjs.ColorPickerInput; exports.ColorPresetSelect = _chunkNCXHTQH2cjs.ColorPresetSelect; exports.ColorSwatch = _chunkNCXHTQH2cjs.ColorSwatch; exports.CommandApprovalToast = _chunkELF4OOHCcjs.CommandApprovalToast; exports.CommandBox = _chunkNCXHTQH2cjs.CommandBox; exports.CommentCard = CommentCard; exports.CommentSkeleton = CommentSkeleton; exports.CommunityHubIcon = _chunkZ4IBEIWDcjs.CommunityHubIcon; exports.CommunityIcon = _chunkZ4IBEIWDcjs.CommunityIcon; exports.CompactPageLoader = _chunkNCXHTQH2cjs.CompactPageLoader; exports.CompareIcon = _chunkZ4IBEIWDcjs.CompareIcon; exports.ConfidenceBadge = _chunkNCXHTQH2cjs.ConfidenceBadge; exports.ContentLoader = _chunkNCXHTQH2cjs.ContentLoader; exports.ContentLoadingContainer = ContentLoadingContainer; exports.ContentPageContainer = _chunk6LK4VEXEcjs.ContentPageContainer; exports.ContextCompactionDisplay = _chunkNCXHTQH2cjs.ContextCompactionDisplay; exports.CopyIcon = _chunkZ4IBEIWDcjs.CopyIcon; exports.CpuIcon = _chunkZ4IBEIWDcjs.CpuIcon; exports.CursorPagination = _chunkNCXHTQH2cjs.CursorPagination; exports.CursorPaginationSimple = _chunkNCXHTQH2cjs.CursorPaginationSimple; exports.CustomExternalLinkIcon = _chunkZ4IBEIWDcjs.CustomExternalLinkIcon; exports.CustomForkIcon = _chunkZ4IBEIWDcjs.CustomForkIcon; exports.CustomLicenseIcon = _chunkZ4IBEIWDcjs.CustomLicenseIcon; exports.CustomStarIcon = _chunkZ4IBEIWDcjs.CustomStarIcon; exports.CustomTimeIcon = _chunkZ4IBEIWDcjs.CustomTimeIcon; exports.CustomerInterviewCard = _chunkNCXHTQH2cjs.CustomerInterviewCard; exports.CustomerInterviewCardSkeleton = _chunkNCXHTQH2cjs.CustomerInterviewCardSkeleton; exports.CutVendorCostsIcon = _chunkZ4IBEIWDcjs.CutVendorCostsIcon; exports.CveLink = _chunkNCXHTQH2cjs.CveLink; exports.DEFAULT_CUSTOM_STATUS_COLOR = _chunkNCXHTQH2cjs.DEFAULT_CUSTOM_STATUS_COLOR; exports.DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID = _chunk6LK4VEXEcjs.DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID; exports.DEFAULT_THEME = _chunkNCXHTQH2cjs.DEFAULT_THEME; exports.DashboardIcon = _chunkZ4IBEIWDcjs.DashboardIcon; exports.DashboardInfoCard = _chunkNCXHTQH2cjs.DashboardInfoCard; exports.DataRoomDocCard = _chunkNCXHTQH2cjs.DataRoomDocCard; exports.DataRoomDocCardSkeleton = _chunkNCXHTQH2cjs.DataRoomDocCardSkeleton; exports.DataTable = _chunkNCXHTQH2cjs.DataTable; exports.DataTableBody = _chunkNCXHTQH2cjs.DataTableBody; exports.DataTableCursorFooter = _chunkNCXHTQH2cjs.DataTableCursorFooter; exports.DataTableEmpty = _chunkNCXHTQH2cjs.DataTableEmpty; exports.DataTableHeader = _chunkNCXHTQH2cjs.DataTableHeader; exports.DataTableInfiniteFooter = _chunkNCXHTQH2cjs.DataTableInfiniteFooter; exports.DataTableRoot = _chunkNCXHTQH2cjs.DataTableRoot; exports.DataTableRow = _chunkNCXHTQH2cjs.DataTableRow; exports.DataTableRowCount = _chunkNCXHTQH2cjs.DataTableRowCount; exports.DataTableSkeleton = _chunkNCXHTQH2cjs.DataTableSkeleton; exports.DatePicker = _chunkNCXHTQH2cjs.DatePicker; exports.DatePickerInput = _chunkNCXHTQH2cjs.DatePickerInput; exports.DatePickerInputSimple = _chunkNCXHTQH2cjs.DatePickerInputSimple; exports.DateTimePicker = DateTimePicker; exports.DeliveryLists = DeliveryLists; exports.DeliveryRow = _chunkPDKBCCCDcjs.DeliveryRow; exports.DeliveryTable = DeliveryTable; exports.DenoIcon = _chunkZ4IBEIWDcjs.DenoIcon; exports.DesktopIcon = _chunkZ4IBEIWDcjs.DesktopIcon; exports.DetailLoader = _chunkNCXHTQH2cjs.DetailLoader; exports.DetailPageContainer = _chunk6LK4VEXEcjs.DetailPageContainer; exports.DetailPageSkeleton = _chunkLZL6P7SNcjs.DetailPageSkeleton; exports.DevCardRowContent = _chunkPDKBCCCDcjs.DevCardRowContent; exports.DevCardRowSkeleton = _chunkPDKBCCCDcjs.DevCardRowSkeleton; exports.DevCardRowSkeletonList = _chunkPDKBCCCDcjs.DevCardRowSkeletonList; exports.DevSectionPage = _chunkPDKBCCCDcjs.DevSectionPage; exports.DevSectionView = _chunkPDKBCCCDcjs.DevSectionView; exports.DeviceCard = _chunkNCXHTQH2cjs.DeviceCard; exports.DeviceCardCompact = _chunkNCXHTQH2cjs.DeviceCardCompact; exports.DeviceCardSkeleton = DeviceCardSkeleton; exports.DeviceCardSkeletonGrid = DeviceCardSkeletonGrid; exports.DevicesIcon = _chunkZ4IBEIWDcjs.DevicesIcon; exports.Dialog = _chunkNCXHTQH2cjs.Dialog; exports.DialogClose = _chunkNCXHTQH2cjs.DialogClose; exports.DialogContent = _chunkNCXHTQH2cjs.DialogContent; exports.DialogDescription = _chunkNCXHTQH2cjs.DialogDescription; exports.DialogFooter = _chunkNCXHTQH2cjs.DialogFooter; exports.DialogHeader = _chunkNCXHTQH2cjs.DialogHeader; exports.DialogListItem = _chunkNCXHTQH2cjs.DialogListItem; exports.DialogOverlay = _chunkNCXHTQH2cjs.DialogOverlay; exports.DialogPortal = _chunkNCXHTQH2cjs.DialogPortal; exports.DialogTitle = _chunkNCXHTQH2cjs.DialogTitle; exports.DialogTrigger = _chunkNCXHTQH2cjs.DialogTrigger; exports.DocSearchBar = _chunkLZL6P7SNcjs.DocSearchBar; exports.DocSearchResultRow = _chunkLZL6P7SNcjs.DocSearchResultRow; exports.DocumentIcon = _chunkZ4IBEIWDcjs.DocumentIcon; exports.DonutIcon = _chunkZ4IBEIWDcjs.DonutIcon; exports.DoubleChevronIcon = _chunkZ4IBEIWDcjs.DoubleChevronIcon; exports.Drawer = _chunkNCXHTQH2cjs.Drawer; exports.DrawerBody = _chunkNCXHTQH2cjs.DrawerBody; exports.DrawerClose = _chunkNCXHTQH2cjs.DrawerClose; exports.DrawerContent = _chunkNCXHTQH2cjs.DrawerContent; exports.DrawerDescription = _chunkNCXHTQH2cjs.DrawerDescription; exports.DrawerFooter = _chunkNCXHTQH2cjs.DrawerFooter; exports.DrawerHeader = _chunkNCXHTQH2cjs.DrawerHeader; exports.DrawerOverlay = _chunkNCXHTQH2cjs.DrawerOverlay; exports.DrawerPortal = _chunkNCXHTQH2cjs.DrawerPortal; exports.DrawerTitle = _chunkNCXHTQH2cjs.DrawerTitle; exports.DrawerTrigger = _chunkNCXHTQH2cjs.DrawerTrigger; exports.DropdownButton = _chunkNCXHTQH2cjs.DropdownButton; exports.DropdownMenu = _chunkTU26IZPOcjs.DropdownMenu; exports.DropdownMenuCheckboxItem = _chunkTU26IZPOcjs.DropdownMenuCheckboxItem; exports.DropdownMenuContent = _chunkTU26IZPOcjs.DropdownMenuContent; exports.DropdownMenuGroup = _chunkTU26IZPOcjs.DropdownMenuGroup; exports.DropdownMenuItem = _chunkTU26IZPOcjs.DropdownMenuItem; exports.DropdownMenuLabel = _chunkTU26IZPOcjs.DropdownMenuLabel; exports.DropdownMenuPortal = _chunkTU26IZPOcjs.DropdownMenuPortal; exports.DropdownMenuRadioGroup = _chunkTU26IZPOcjs.DropdownMenuRadioGroup; exports.DropdownMenuRadioItem = _chunkTU26IZPOcjs.DropdownMenuRadioItem; exports.DropdownMenuSeparator = _chunkTU26IZPOcjs.DropdownMenuSeparator; exports.DropdownMenuShortcut = _chunkTU26IZPOcjs.DropdownMenuShortcut; exports.DropdownMenuSub = _chunkTU26IZPOcjs.DropdownMenuSub; exports.DropdownMenuSubContent = _chunkTU26IZPOcjs.DropdownMenuSubContent; exports.DropdownMenuSubTrigger = _chunkTU26IZPOcjs.DropdownMenuSubTrigger; exports.DropdownMenuTrigger = _chunkTU26IZPOcjs.DropdownMenuTrigger; exports.DynamicSkeleton = DynamicSkeleton; exports.DynamicThemeProvider = _chunkNCXHTQH2cjs.DynamicThemeProvider; exports.EMPTY_AUTHOR_PLACEHOLDER = _chunk6LK4VEXEcjs.EMPTY_AUTHOR_PLACEHOLDER; exports.EditProfileIcon = _chunkZ4IBEIWDcjs.EditProfileIcon; exports.ElestioLogo = _chunkZ4IBEIWDcjs.ElestioLogo; exports.EmbeddableChat = _chunkNCXHTQH2cjs.EmbeddableChat; exports.EmptyState = _chunkPDKBCCCDcjs.EmptyState; exports.EmptyVendorIcon = _chunkZ4IBEIWDcjs.EmptyVendorIcon; exports.EntityAuthorCard = _chunk6LK4VEXEcjs.EntityAuthorCard; exports.EntityImage = _chunkNCXHTQH2cjs.EntityImage; exports.EntityMetadataAuthorCell = _chunk6LK4VEXEcjs.EntityMetadataAuthorCell; exports.EntityMetadataValueCell = _chunk6LK4VEXEcjs.EntityMetadataValueCell; exports.EntitySummaryEditor = _chunkNCXHTQH2cjs.EntitySummaryEditor; exports.EntityTagBadges = _chunk6LK4VEXEcjs.EntityTagBadges; exports.EntityVideoSection = _chunk6LK4VEXEcjs.EntityVideoSection; exports.ErrorBoundary = _chunkNCXHTQH2cjs.ErrorBoundary; exports.ErrorIcon = _chunkZ4IBEIWDcjs.ErrorIcon; exports.ErrorMessageDisplay = _chunkNCXHTQH2cjs.ErrorMessageDisplay; exports.ErrorState = _chunk6LK4VEXEcjs.ErrorState; exports.ExpandChevron = _chunkNCXHTQH2cjs.ExpandChevron; exports.ExploreCategoriesIcon = _chunkZ4IBEIWDcjs.ExploreCategoriesIcon; exports.EyeIcon = _chunkZ4IBEIWDcjs.EyeIcon; exports.FLAMINGO_LOGO_SVG_PATH = _chunkZ4IBEIWDcjs.FLAMINGO_LOGO_SVG_PATH; exports.FLAMINGO_LOGO_VIEWBOX = _chunkZ4IBEIWDcjs.FLAMINGO_LOGO_VIEWBOX; exports.FacebookIcon = _chunkZ4IBEIWDcjs.FacebookIcon; exports.FaqAccordion = _chunk3TDLFCCScjs.FaqAccordion; exports.FaqSection = _chunk3TDLFCCScjs.FaqSection; exports.FeatureCardGrid = _chunkNCXHTQH2cjs.FeatureCardGrid; exports.FeatureList = _chunkNCXHTQH2cjs.FeatureList; exports.FeatureListSkeleton = FeatureListSkeleton; exports.FieldWrapper = _chunk6JINAOI7cjs.FieldWrapper; exports.FigmaIcon = _chunkZ4IBEIWDcjs.FigmaIcon; exports.FigmaPrototypeViewer = _chunkNCXHTQH2cjs.FigmaPrototypeViewer; exports.FileCheckIcon = _chunkZ4IBEIWDcjs.FileCheckIcon; exports.FileTextIcon = _chunkZ4IBEIWDcjs.FileTextIcon; exports.FileUpload = _chunkNCXHTQH2cjs.FileUpload; exports.FilterCheckboxItem = _chunkNCXHTQH2cjs.FilterCheckboxItem; exports.FilterChip = FilterChip; exports.FilterIcon = _chunkZ4IBEIWDcjs.FilterIcon; exports.FilterList = _chunkNCXHTQH2cjs.FilterList; exports.FilterListItem = _chunkNCXHTQH2cjs.FilterListItem; exports.FilterModal = _chunkNCXHTQH2cjs.FilterModal; exports.FilterPillRow = _chunk6LK4VEXEcjs.FilterPillRow; exports.FiltersDropdown = _chunkNCXHTQH2cjs.FiltersDropdown; exports.FlamingoLogo = _chunkZ4IBEIWDcjs.FlamingoLogo; exports.FloatingTooltip = _chunkNCXHTQH2cjs.FloatingTooltip; exports.FolderShieldIcon = _chunkZ4IBEIWDcjs.FolderShieldIcon; exports.Footer = Footer; exports.FooterWaitlistButton = FooterWaitlistButton; exports.FormLoader = _chunkNCXHTQH2cjs.FormLoader; exports.FormPageContainer = _chunk6LK4VEXEcjs.FormPageContainer; exports.FormSkeleton = FormSkeleton; exports.G2Icon = _chunkZ4IBEIWDcjs.G2Icon; exports.GenericEntityCard = _chunkNCXHTQH2cjs.GenericEntityCard; exports.GenericEntityCardSkeleton = _chunkNCXHTQH2cjs.GenericEntityCardSkeleton; exports.GetAppIcon = _chunkZ4IBEIWDcjs.GetAppIcon; exports.GitHubActivityCard = _chunkNCXHTQH2cjs.GitHubActivityCard; exports.GitHubActivityCardSkeleton = _chunkNCXHTQH2cjs.GitHubActivityCardSkeleton; exports.GitHubIcon = _chunkZ4IBEIWDcjs.GitHubIcon; exports.GitHubReleasesManager = _chunkNCXHTQH2cjs.GitHubReleasesManager; exports.GlobeIcon = _chunkZ4IBEIWDcjs.GlobeIcon; exports.GoogleGeminiIcon = _chunkZ4IBEIWDcjs.GoogleGeminiIcon; exports.GoogleLogo = _chunkZ4IBEIWDcjs.GoogleLogo; exports.GridViewIcon = _chunkZ4IBEIWDcjs.GridViewIcon; exports.GuideModeBanner = _chunkNCXHTQH2cjs.GuideModeBanner; exports.GuideWelcome = _chunkNCXHTQH2cjs.GuideWelcome; exports.HamburgerIcon = _chunkZ4IBEIWDcjs.HamburgerIcon; exports.HandDollarIcon = _chunkZ4IBEIWDcjs.HandDollarIcon; exports.Header = _chunkNCXHTQH2cjs.Header; exports.HeaderButton = _chunkNCXHTQH2cjs.HeaderButton; exports.HeaderGlobalSearch = _chunkNCXHTQH2cjs.HeaderGlobalSearch; exports.HeaderMingoButton = _chunkNCXHTQH2cjs.HeaderMingoButton; exports.HeaderOrganizationFilter = _chunkNCXHTQH2cjs.HeaderOrganizationFilter; exports.HeaderSkeleton = _chunkNCXHTQH2cjs.HeaderSkeleton; exports.HeroImageUploader = HeroImageUploader; exports.HeroSkeleton = HeroSkeleton; exports.HiddenTagsPopup = _chunk6LK4VEXEcjs.HiddenTagsPopup; exports.HighlightCard = _chunkNCXHTQH2cjs.HighlightCard; exports.HighlightCardGrid = _chunkNCXHTQH2cjs.HighlightCardGrid; exports.HighlightConfigSection = _chunkNCXHTQH2cjs.HighlightConfigSection; exports.HighlightGenerationSection = _chunkNCXHTQH2cjs.HighlightGenerationSection; exports.HighlightVideoCombinedSection = _chunkNCXHTQH2cjs.HighlightVideoCombinedSection; exports.HighlightVideoPreview = _chunkNCXHTQH2cjs.HighlightVideoPreview; exports.HighlightVideoSection = _chunkNCXHTQH2cjs.HighlightVideoSection; exports.HoneypotField = _chunkNCXHTQH2cjs.HoneypotField; exports.HotelIcon = _chunkZ4IBEIWDcjs.HotelIcon; exports.HoverCard = _chunkNCXHTQH2cjs.HoverCard; exports.HoverCardContent = _chunkNCXHTQH2cjs.HoverCardContent; exports.HoverCardTrigger = _chunkNCXHTQH2cjs.HoverCardTrigger; exports.HoverDropdown = _chunkNCXHTQH2cjs.HoverDropdown; exports.HubspotIcon = _chunkZ4IBEIWDcjs.HubspotIcon; exports.HubspotTicketCard = _chunkNCXHTQH2cjs.HubspotTicketCard; exports.HubspotTicketCardSkeleton = _chunkNCXHTQH2cjs.HubspotTicketCardSkeleton; exports.ICON_REGISTRY = _chunk6LK4VEXEcjs.ICON_REGISTRY; exports.ITIcon = _chunkZ4IBEIWDcjs.ITIcon; exports.IconsBlock = _chunkNCXHTQH2cjs.IconsBlock; exports.IconsXIcon = _chunkZ4IBEIWDcjs.XIcon; exports.ImageCropper = ImageCropper; exports.ImageGalleryModal = _chunkNCXHTQH2cjs.ImageGalleryModal; exports.ImageIcon = _chunkZ4IBEIWDcjs.ImageIcon; exports.ImageUploader = _chunkNCXHTQH2cjs.ImageUploader; exports.InfoCard = _chunkNCXHTQH2cjs.InfoCard; exports.InfoCircleIcon = _chunkZ4IBEIWDcjs.InfoCircleIcon; exports.InfoRow = _chunkNCXHTQH2cjs.InfoRow; exports.Input = _chunk6JINAOI7cjs.Input; exports.InputTrigger = _chunkNCXHTQH2cjs.InputTrigger; exports.InstagramIcon = _chunkZ4IBEIWDcjs.InstagramIcon; exports.InteractiveCard = _chunkNCXHTQH2cjs.InteractiveCard; exports.InteractiveSkeleton = InteractiveSkeleton; exports.InvestorUpdateCard = _chunkNCXHTQH2cjs.InvestorUpdateCard; exports.InvestorUpdateCardSkeleton = _chunkNCXHTQH2cjs.InvestorUpdateCardSkeleton; exports.JumpInIcon = _chunkZ4IBEIWDcjs.JumpInIcon; exports.KnowledgeBaseLinksManager = _chunkNCXHTQH2cjs.KnowledgeBaseLinksManager; exports.Label = _chunkNCXHTQH2cjs.Label; exports.LaptopIcon = _chunkZ4IBEIWDcjs.LaptopIcon; exports.LegalDocumentPage = LegalDocumentPage; exports.LinkedInIcon = _chunkZ4IBEIWDcjs.LinkedInIcon; exports.LinuxIcon = _chunkZ4IBEIWDcjs.LinuxIcon; exports.ListLoader = _chunkNCXHTQH2cjs.ListLoader; exports.ListPageContainer = _chunk6LK4VEXEcjs.ListPageContainer; exports.ListPageLayout = _chunkNCXHTQH2cjs.ListPageLayout; exports.ListSkeleton = ListSkeleton; exports.LivestormIcon = _chunkZ4IBEIWDcjs.LivestormIcon; exports.LoadError = _chunk6LK4VEXEcjs.LoadError; exports.LoadingProvider = _chunkNCXHTQH2cjs.LoadingProvider; exports.LogOutIcon = _chunkZ4IBEIWDcjs.LogOutIcon; exports.LogsIcon = _chunkZ4IBEIWDcjs.LogsIcon; exports.LowerTCOIcon = _chunkZ4IBEIWDcjs.LowerTCOIcon; exports.LucideCheckCircleIcon = _chunkNCXHTQH2cjs.CheckCircleIcon; exports.LucideXIcon = _chunkNCXHTQH2cjs.XIcon; exports.LumaIcon = _chunkZ4IBEIWDcjs.LumaIcon; exports.MESSAGE_ROLE = _chunkNCXHTQH2cjs.MESSAGE_ROLE; exports.MESSAGE_TYPE = _chunkNCXHTQH2cjs.MESSAGE_TYPE; exports.MSPDisplay = MSPDisplay; exports.MUX_IMAGE_ORIGIN = _chunk6LK4VEXEcjs.MUX_IMAGE_ORIGIN; exports.MUX_STREAM_ORIGIN = _chunk6LK4VEXEcjs.MUX_STREAM_ORIGIN; exports.MacOSIcon = _chunkZ4IBEIWDcjs.MacOSIcon; exports.MadeWithLove = MadeWithLove; exports.MarginCrisisIcon = _chunkZ4IBEIWDcjs.MarginCrisisIcon; exports.MarginReportSkeleton = MarginReportSkeleton; exports.MarkdownEditor = _chunkNCXHTQH2cjs.MarkdownEditor; exports.MediaCarousel = MediaCarousel; exports.MediaGalleryManager = _chunkNCXHTQH2cjs.MediaGalleryManager; exports.MediaSkeleton = MediaSkeleton; exports.MediaTypeSelector = _chunkNCXHTQH2cjs.MediaTypeSelector; exports.MenuIcon = _chunkZ4IBEIWDcjs.MenuIcon; exports.Menubar = _chunkNCXHTQH2cjs.Menubar; exports.MenubarCheckboxItem = _chunkNCXHTQH2cjs.MenubarCheckboxItem; exports.MenubarContent = _chunkNCXHTQH2cjs.MenubarContent; exports.MenubarGroup = _chunkNCXHTQH2cjs.MenubarGroup; exports.MenubarItem = _chunkNCXHTQH2cjs.MenubarItem; exports.MenubarLabel = _chunkNCXHTQH2cjs.MenubarLabel; exports.MenubarMenu = _chunkNCXHTQH2cjs.MenubarMenu; exports.MenubarPortal = _chunkNCXHTQH2cjs.MenubarPortal; exports.MenubarRadioGroup = _chunkNCXHTQH2cjs.MenubarRadioGroup; exports.MenubarRadioItem = _chunkNCXHTQH2cjs.MenubarRadioItem; exports.MenubarSeparator = _chunkNCXHTQH2cjs.MenubarSeparator; exports.MenubarShortcut = _chunkNCXHTQH2cjs.MenubarShortcut; exports.MenubarSub = _chunkNCXHTQH2cjs.MenubarSub; exports.MenubarSubContent = _chunkNCXHTQH2cjs.MenubarSubContent; exports.MenubarSubTrigger = _chunkNCXHTQH2cjs.MenubarSubTrigger; exports.MenubarTrigger = _chunkNCXHTQH2cjs.MenubarTrigger; exports.MessageCircleIcon = _chunkZ4IBEIWDcjs.MessageCircleIcon; exports.MessageSegmentAccumulator = _chunkNCXHTQH2cjs.MessageSegmentAccumulator; exports.MetricValue = MetricValue; exports.MiamiCyberGangLogo = _chunkZ4IBEIWDcjs.MiamiCyberGangLogo; exports.MiamiCyberGangLogoFaceOnly = _chunkZ4IBEIWDcjs.MiamiCyberGangLogoFaceOnly; exports.MicrosoftIcon = _chunkZ4IBEIWDcjs.MicrosoftIcon; exports.MingoChatHistory = _chunkNCXHTQH2cjs.MingoChatHistory; exports.MingoChatHistorySkeleton = _chunkNCXHTQH2cjs.MingoChatHistorySkeleton; exports.MingoIcon = _chunkZ4IBEIWDcjs.MingoIcon; exports.MingoOnboardingCard = _chunkNCXHTQH2cjs.MingoOnboardingCard; exports.MingoOnboardingCardSkeleton = _chunkNCXHTQH2cjs.MingoOnboardingCardSkeleton; exports.MingoOnboardingListSkeleton = _chunkNCXHTQH2cjs.MingoOnboardingListSkeleton; exports.MingoWelcome = _chunkNCXHTQH2cjs.MingoWelcome; exports.MinusCircleIcon = _chunkZ4IBEIWDcjs.MinusCircleIcon; exports.MinusIcon = _chunkNCXHTQH2cjs.MinusIcon; exports.MlgLogo = _chunkZ4IBEIWDcjs.MlgLogo; exports.MobileBurgerMenu = _chunkNCXHTQH2cjs.MobileBurgerMenu; exports.MobileNavPanel = _chunkNCXHTQH2cjs.MobileNavPanel; exports.Modal = _chunkNCXHTQH2cjs.Modal; exports.ModalContent = _chunkNCXHTQH2cjs.ModalContent; exports.ModalFooter = _chunkNCXHTQH2cjs.ModalFooter; exports.ModalHeader = _chunkNCXHTQH2cjs.ModalHeader; exports.ModalTitle = _chunkNCXHTQH2cjs.ModalTitle; exports.ModalV2 = _chunkNCXHTQH2cjs.Modal2; exports.ModalV2Content = _chunkNCXHTQH2cjs.ModalContent2; exports.ModalV2Footer = _chunkNCXHTQH2cjs.ModalFooter2; exports.ModalV2Header = _chunkNCXHTQH2cjs.ModalHeader2; exports.ModalV2Title = _chunkNCXHTQH2cjs.ModalTitle2; exports.ModelDisplay = _chunkNCXHTQH2cjs.ModelDisplay; exports.ModularHellIcon = _chunkZ4IBEIWDcjs.ModularHellIcon; exports.MoonIcon = _chunkZ4IBEIWDcjs.MoonIcon; exports.MoreAboutButton = _chunkNCXHTQH2cjs.MoreAboutButton; exports.MoreActionsMenu = _chunkNCXHTQH2cjs.MoreActionsMenu; exports.MspProfileFormSkeleton = MspProfileFormSkeleton; exports.NETWORK_CONFIG = _chunkNCXHTQH2cjs.NETWORK_CONFIG; exports.NEW_TAB_FEATURES = _chunk6LK4VEXEcjs.NEW_TAB_FEATURES; exports.NOCIcon = _chunkZ4IBEIWDcjs.NOCIcon; exports.NaturalLanguageIcon = _chunkZ4IBEIWDcjs.NaturalLanguageIcon; exports.NavLinkAnchorViaRuntime = _chunkNCXHTQH2cjs.NavLinkAnchorViaRuntime; exports.NavigationMenu = _chunkNCXHTQH2cjs.NavigationMenu; exports.NavigationMenuContent = _chunkNCXHTQH2cjs.NavigationMenuContent; exports.NavigationMenuIndicator = _chunkNCXHTQH2cjs.NavigationMenuIndicator; exports.NavigationMenuItem = _chunkNCXHTQH2cjs.NavigationMenuItem; exports.NavigationMenuLink = _chunkNCXHTQH2cjs.NavigationMenuLink; exports.NavigationMenuList = _chunkNCXHTQH2cjs.NavigationMenuList; exports.NavigationMenuTrigger = _chunkNCXHTQH2cjs.NavigationMenuTrigger; exports.NavigationMenuViewport = _chunkNCXHTQH2cjs.NavigationMenuViewport; exports.NavigationSidebar = _chunkNCXHTQH2cjs.NavigationSidebar; exports.NavigationSkeleton = NavigationSkeleton; exports.NetworkIcon = _chunkZ4IBEIWDcjs.NetworkIcon; exports.NotFoundError = _chunk6LK4VEXEcjs.NotFoundError; exports.NotificationDrawer = _chunkNCXHTQH2cjs.NotificationDrawer; exports.NotificationPopups = _chunkNCXHTQH2cjs.NotificationPopups; exports.NotificationTile = _chunkNCXHTQH2cjs.NotificationTile; exports.NotificationsProvider = _chunkNCXHTQH2cjs.NotificationsProvider; exports.NushellIcon = _chunkZ4IBEIWDcjs.NushellIcon; exports.OPENFRAME_PATHS = _chunkNCXHTQH2cjs.OPENFRAME_PATHS; exports.OPSIcon = _chunkZ4IBEIWDcjs.OPSIcon; exports.OSTypeBadge = _chunkNCXHTQH2cjs.OSTypeBadge; exports.OSTypeBadgeGroup = _chunkNCXHTQH2cjs.OSTypeBadgeGroup; exports.OSTypeIcon = _chunkNCXHTQH2cjs.OSTypeIcon; exports.OSTypeLabel = _chunkNCXHTQH2cjs.OSTypeLabel; exports.OWNER_TYPE = _chunkNCXHTQH2cjs.OWNER_TYPE; exports.OnboardingGuideCard = _chunk6LK4VEXEcjs.OnboardingGuideCard; exports.OnboardingGuideCardSkeleton = _chunk6LK4VEXEcjs.OnboardingGuideCardSkeleton; exports.OnboardingStepCard = _chunkNCXHTQH2cjs.OnboardingStepCard; exports.OnboardingWalkthrough = _chunkNCXHTQH2cjs.OnboardingWalkthrough; exports.OpenAiIcon = _chunkZ4IBEIWDcjs.OpenAiIcon; exports.OpenFrameLogo = _chunkZ4IBEIWDcjs.OpenFrameLogo; exports.OpenFrameText = _chunkZ4IBEIWDcjs.OpenFrameText; exports.OpenSourceIcon = _chunkZ4IBEIWDcjs.OpenSourceIcon; exports.OpenmspLogo = _chunkZ4IBEIWDcjs.OpenmspLogo; exports.OrganizationCard = _chunkNCXHTQH2cjs.OrganizationCard; exports.OrganizationCardSkeleton = OrganizationCardSkeleton; exports.OrganizationCardSkeletonGrid = OrganizationCardSkeletonGrid; exports.OrganizationIconSkeleton = OrganizationIconSkeleton; exports.OrganizationsIcon = _chunkZ4IBEIWDcjs.OrganizationsIcon; exports.PAGE_HEADING_CLASS = _chunkNCXHTQH2cjs.PAGE_HEADING_CLASS; exports.PRICING_STYLES = PRICING_STYLES; exports.PackageIcon = _chunkZ4IBEIWDcjs.PackageIcon; exports.PageActions = _chunk6LK4VEXEcjs.PageActions; exports.PageContainer = _chunk6LK4VEXEcjs.PageContainer; exports.PageError = _chunk6LK4VEXEcjs.PageError; exports.PageHeading = _chunkNCXHTQH2cjs.PageHeading; exports.PageLayout = _chunkNCXHTQH2cjs.PageLayout; exports.PageLoader = _chunkNCXHTQH2cjs.PageLoader; exports.PageShell = _chunk6LK4VEXEcjs.PageShell; exports.Pagination = _chunkNCXHTQH2cjs.Pagination; exports.PaginationContent = _chunkNCXHTQH2cjs.PaginationContent; exports.PaginationEllipsis = _chunkNCXHTQH2cjs.PaginationEllipsis; exports.PaginationItem = _chunkNCXHTQH2cjs.PaginationItem; exports.PaginationLink = _chunkNCXHTQH2cjs.PaginationLink; exports.PaginationNext = _chunkNCXHTQH2cjs.PaginationNext; exports.PaginationPrevious = _chunkNCXHTQH2cjs.PaginationPrevious; exports.ParagraphSkeleton = ParagraphSkeleton; exports.ParallaxImageShowcase = _chunkNCXHTQH2cjs.ParallaxImageShowcase; exports.PatchPolicyIcon = _chunkZ4IBEIWDcjs.PatchPolicyIcon; exports.PathsDisplay = _chunkNCXHTQH2cjs.PathsDisplay; exports.PersistentFilterControls = PersistentFilterControls; exports.PersistentMobileDropdown = PersistentMobileDropdown; exports.PersistentPagination = PersistentPagination; exports.PersistentPaginationWrapper = PersistentPaginationWrapper; exports.PersistentSearchContainer = PersistentSearchContainer; exports.PersistentSidebar = PersistentSidebar; exports.PhoneInput = _chunkNCXHTQH2cjs.PhoneInput; exports.PilotIcon = _chunkZ4IBEIWDcjs.PilotIcon; exports.PlatformBadge = _chunkNCXHTQH2cjs.PlatformBadge; exports.PlatformFilterComponent = _chunkNCXHTQH2cjs.PlatformFilterComponent; exports.PlatformSkeletonContainer = PlatformSkeletonContainer; exports.PlusCircleIcon = _chunkZ4IBEIWDcjs.PlusCircleIcon; exports.PodbeanIcon = _chunkZ4IBEIWDcjs.PodbeanIcon; exports.PoliciesIcon = _chunkZ4IBEIWDcjs.PoliciesIcon; exports.PolicyConfigurationPanel = _chunkNCXHTQH2cjs.PolicyConfigurationPanel; exports.PowerShellIcon = _chunkZ4IBEIWDcjs.PowerShellIcon; exports.PricingDisplay = PricingDisplay; exports.PricingSkeleton = PricingSkeleton; exports.ProductReleaseCard = _chunkNCXHTQH2cjs.ProductReleaseCard; exports.ProductReleaseCardSkeleton = _chunkNCXHTQH2cjs.ProductReleaseCardSkeleton; exports.ProductReleasesView = ProductReleasesView; exports.ProfileLoadingSkeleton = ProfileLoadingSkeleton; exports.ProfileSkeleton = ProfileSkeleton; exports.ProgramCard = _chunkNCXHTQH2cjs.ProgramCard; exports.ProgramCardSkeleton = _chunkNCXHTQH2cjs.ProgramCardSkeleton; exports.Progress = _chunkNCXHTQH2cjs.Progress; exports.ProgressBar = _chunkNCXHTQH2cjs.ProgressBar; exports.ProgressiveSkeleton = ProgressiveSkeleton; exports.ProviderButton = _chunkNCXHTQH2cjs.ProviderButton; exports.PushButtonSelector = _chunkNCXHTQH2cjs.PushButtonSelector; exports.PythonIcon = _chunkZ4IBEIWDcjs.PythonIcon; exports.QueriesIcon = _chunkZ4IBEIWDcjs.QueriesIcon; exports.QueryReportTable = _chunkNCXHTQH2cjs.QueryReportTable; exports.QueryReportTableHeader = _chunkNCXHTQH2cjs.QueryReportTableHeader; exports.QueryReportTableRow = _chunkNCXHTQH2cjs.QueryReportTableRow; exports.QueryReportTableSkeleton = _chunkNCXHTQH2cjs.QueryReportTableSkeleton; exports.RATIO_DISPLAY_GRID_CLASS = _chunk6LK4VEXEcjs.RATIO_DISPLAY_GRID_CLASS; exports.RATIO_GRID_CLASS = _chunk6LK4VEXEcjs.RATIO_GRID_CLASS; exports.ROW_HEIGHT_DESKTOP = _chunkNCXHTQH2cjs.ROW_HEIGHT_DESKTOP; exports.ROW_HEIGHT_MOBILE = _chunkNCXHTQH2cjs.ROW_HEIGHT_MOBILE; exports.RadioGroup = _chunkNCXHTQH2cjs.RadioGroup; exports.RadioGroupBlock = _chunkNCXHTQH2cjs.RadioGroupBlock; exports.RadioGroupItem = _chunkNCXHTQH2cjs.RadioGroupItem; exports.RapidInnovationIcon = _chunkZ4IBEIWDcjs.RapidInnovationIcon; exports.RatioTabs = _chunk6LK4VEXEcjs.RatioTabs; exports.ReclaimProfitsIcon = _chunkZ4IBEIWDcjs.ReclaimProfitsIcon; exports.RedditIcon = _chunkZ4IBEIWDcjs.RedditIcon; exports.RelatedContentSection = _chunkPDYT7T6Kcjs.RelatedContentSection; exports.ReleaseChangelogSection = _chunkNCXHTQH2cjs.ReleaseChangelogSection; exports.ReleaseDetailPage = ReleaseDetailPage; exports.ReleaseDetailSkeleton = ReleaseDetailSkeleton; exports.ReleaseMediaManager = _chunkNCXHTQH2cjs.ReleaseMediaManager; exports.RemoteControlIcon = _chunkZ4IBEIWDcjs.RemoteControlIcon; exports.RenameChatModal = _chunkNCXHTQH2cjs.RenameChatModal; exports.ResponsiveIconsBlock = ResponsiveIconsBlock; exports.ResultBlock = _chunkNCXHTQH2cjs.ResultBlock; exports.ResultsCount = ResultsCount; exports.ResultsHeaderSkeleton = ResultsHeaderSkeleton; exports.RoadmapCard = _chunkNCXHTQH2cjs.RoadmapCard; exports.RoadmapCardSkeleton = _chunkNCXHTQH2cjs.RoadmapCardSkeleton; exports.RoadmapGrid = RoadmapGrid; exports.RoadmapGridSkeleton = RoadmapGridSkeleton; exports.RoadmapView = RoadmapView; exports.RoadmapVoteButton = _chunkNCXHTQH2cjs.RoadmapVoteButton; exports.SCROLL_ANCHOR = _chunkNCXHTQH2cjs.SCROLL_ANCHOR; exports.SCROLL_ANCHOR_WIRE_KEY = _chunkNCXHTQH2cjs.SCROLL_ANCHOR_WIRE_KEY; exports.SEOEditorPreview = _chunkNCXHTQH2cjs.SEOEditorPreview; exports.SOCIcon = _chunkZ4IBEIWDcjs.SOCIcon; exports.SOURCE_ICON_NAMES = _chunk6LK4VEXEcjs.SOURCE_ICON_NAMES; exports.SOURCE_LABELS_BY_TABLE = _chunk6LK4VEXEcjs.SOURCE_LABELS_BY_TABLE; exports.SSOConfigurationIcon = _chunkZ4IBEIWDcjs.SSOConfigurationIcon; exports.SYNTHETIC_REALTIME_ID_PREFIXES = _chunkNCXHTQH2cjs.SYNTHETIC_REALTIME_ID_PREFIXES; exports.ScriptArguments = _chunkNCXHTQH2cjs.ScriptArguments; exports.ScriptGenerationIcon = _chunkZ4IBEIWDcjs.ScriptGenerationIcon; exports.ScriptIcon = _chunkZ4IBEIWDcjs.ScriptIcon; exports.ScriptInfoSection = _chunkNCXHTQH2cjs.ScriptInfoSection; exports.SearchContainerSkeleton = SearchContainerSkeleton; exports.SearchIcon = _chunkZ4IBEIWDcjs.SearchIcon; exports.SearchInput = _chunk6LK4VEXEcjs.SearchInput; exports.SectionSelector = _chunkNCXHTQH2cjs.SectionSelector; exports.Select = _chunkNCXHTQH2cjs.Select; exports.SelectButton = _chunkNCXHTQH2cjs.SelectButton; exports.SelectContent = _chunkNCXHTQH2cjs.SelectContent; exports.SelectGroup = _chunkNCXHTQH2cjs.SelectGroup; exports.SelectItem = _chunkNCXHTQH2cjs.SelectItem; exports.SelectLabel = _chunkNCXHTQH2cjs.SelectLabel; exports.SelectScrollDownButton = _chunkNCXHTQH2cjs.SelectScrollDownButton; exports.SelectScrollUpButton = _chunkNCXHTQH2cjs.SelectScrollUpButton; exports.SelectSeparator = _chunkNCXHTQH2cjs.SelectSeparator; exports.SelectTrigger = _chunkNCXHTQH2cjs.SelectTrigger; exports.SelectValue = _chunkNCXHTQH2cjs.SelectValue; exports.SelectionSourceBadge = SelectionSourceBadge; exports.SendIcon = _chunkZ4IBEIWDcjs.SendIcon; exports.Separator = _chunkNCXHTQH2cjs.Separator; exports.ServerIcon = _chunkZ4IBEIWDcjs.ServerIcon; exports.ServiceCard = _chunkNCXHTQH2cjs.ServiceCard; exports.SettingsIcon = _chunkZ4IBEIWDcjs.SettingsIcon; exports.ShapeCircleDashIcon = _chunkZ4IBEIWDcjs.ShapeCircleDashIcon; exports.Sheet = _chunkNCXHTQH2cjs.Sheet; exports.SheetClose = _chunkNCXHTQH2cjs.SheetClose; exports.SheetContent = _chunkNCXHTQH2cjs.SheetContent; exports.SheetDescription = _chunkNCXHTQH2cjs.SheetDescription; exports.SheetFooter = _chunkNCXHTQH2cjs.SheetFooter; exports.SheetHeader = _chunkNCXHTQH2cjs.SheetHeader; exports.SheetOverlay = _chunkNCXHTQH2cjs.SheetOverlay; exports.SheetPortal = _chunkNCXHTQH2cjs.SheetPortal; exports.SheetTitle = _chunkNCXHTQH2cjs.SheetTitle; exports.SheetTrigger = _chunkNCXHTQH2cjs.SheetTrigger; exports.ShellIcon = _chunkZ4IBEIWDcjs.ShellIcon; exports.ShellTypeBadge = _chunkNCXHTQH2cjs.ShellTypeBadge; exports.ShieldCheckIcon = _chunkZ4IBEIWDcjs.ShieldCheckIcon; exports.ShieldIcon = _chunkZ4IBEIWDcjs.ShieldIcon; exports.ShieldKeyIcon = _chunkZ4IBEIWDcjs.ShieldKeyIcon; exports.ShieldLockIcon = _chunkZ4IBEIWDcjs.ShieldLockIcon; exports.SimpleMarkdownRenderer = _chunk6LK4VEXEcjs.SimpleMarkdownRenderer; exports.Skeleton = _chunk6JINAOI7cjs.Skeleton; exports.SkeletonButton = _chunk6JINAOI7cjs.SkeletonButton; exports.SkeletonCard = _chunk6JINAOI7cjs.SkeletonCard; exports.SkeletonGrid = _chunk6JINAOI7cjs.SkeletonGrid; exports.SkeletonHeading = _chunk6JINAOI7cjs.SkeletonHeading; exports.SkeletonList = _chunk6JINAOI7cjs.SkeletonList; exports.SkeletonNavigation = _chunk6JINAOI7cjs.SkeletonNavigation; exports.SkeletonPresets = SkeletonPresets; exports.SkeletonText = _chunk6JINAOI7cjs.SkeletonText; exports.SlackCommunitySkeleton = SlackCommunitySkeleton; exports.SlackIcon = _chunkZ4IBEIWDcjs.SlackIcon; exports.SlackMessageCard = _chunkNCXHTQH2cjs.SlackMessageCard; exports.SlackMessageCardSkeleton = _chunkNCXHTQH2cjs.SlackMessageCardSkeleton; exports.SlashCommandSuggestions = _chunkNCXHTQH2cjs.SlashCommandSuggestions; exports.Slider = _chunkNCXHTQH2cjs.Slider; exports.SlidersIcon = _chunkZ4IBEIWDcjs.SlidersIcon; exports.SlidingSidebar = _chunkNCXHTQH2cjs.SlidingSidebar; exports.SmartEscalationIcon = _chunkZ4IBEIWDcjs.SmartEscalationIcon; exports.SocialIconRow = SocialIconRow; exports.SocialLinksManager = _chunkNCXHTQH2cjs.SocialLinksManager; exports.SoftwareInfo = _chunkNCXHTQH2cjs.SoftwareInfo; exports.SoftwareSourceBadge = _chunkNCXHTQH2cjs.SoftwareSourceBadge; exports.SourceActionButton = _chunkNCXHTQH2cjs.SourceActionButton; exports.SparklesIcon = _chunkZ4IBEIWDcjs.SparklesIcon; exports.SplitButton = _chunkTU26IZPOcjs.SplitButton; exports.SquareAvatar = _chunk6LK4VEXEcjs.SquareAvatar; exports.StartWithOpenFrameButton = _chunkNCXHTQH2cjs.StartWithOpenFrameButton; exports.StatsSectionSkeleton = StatsSectionSkeleton; exports.StatusBadge = _chunk6LK4VEXEcjs.StatusBadge; exports.StatusFilterComponent = _chunkNCXHTQH2cjs.StatusFilterComponent; exports.StatusIndicator = _chunkNCXHTQH2cjs.StatusIndicator; exports.StatusUpdatesIcon = _chunkZ4IBEIWDcjs.StatusUpdatesIcon; exports.StickySectionNav = _chunkNCXHTQH2cjs.StickySectionNav; exports.SunIcon = _chunkZ4IBEIWDcjs.SunIcon; exports.Switch = _chunkNCXHTQH2cjs.Switch; exports.THEME_ATTRIBUTE = _chunkNCXHTQH2cjs.THEME_ATTRIBUTE; exports.THEME_STORAGE_KEY = _chunkNCXHTQH2cjs.THEME_STORAGE_KEY; exports.TICKET_STATUS_COLOR_PRESETS = _chunkNCXHTQH2cjs.TICKET_STATUS_COLOR_PRESETS; exports.TabContent = _chunkNCXHTQH2cjs.TabContent; exports.TabNavigation = _chunkNCXHTQH2cjs.TabNavigation; exports.TabSelector = _chunkNCXHTQH2cjs.TabSelector; exports.Table = _chunkNCXHTQH2cjs.Table; exports.TableCardSkeleton = _chunkNCXHTQH2cjs.TableCardSkeleton; exports.TableCell = _chunkNCXHTQH2cjs.TableCell; exports.TableDescriptionCell = _chunkNCXHTQH2cjs.TableDescriptionCell; exports.TableEmptyState = _chunkNCXHTQH2cjs.TableEmptyState; exports.TableHeader = _chunkNCXHTQH2cjs.TableHeader; exports.TableRow = _chunkNCXHTQH2cjs.TableRow; exports.TableSkeleton = TableSkeleton; exports.TableTimestampCell = _chunkNCXHTQH2cjs.TableTimestampCell; exports.TableViewIcon = _chunkZ4IBEIWDcjs.TableViewIcon; exports.Tabs = _chunk6LK4VEXEcjs.Tabs; exports.TabsContent = _chunk6LK4VEXEcjs.TabsContent; exports.TabsList = _chunk6LK4VEXEcjs.TabsList; exports.TabsTrigger = _chunk6LK4VEXEcjs.TabsTrigger; exports.Tag = _chunk6LK4VEXEcjs.Tag; exports.TagKeyValueFilter = _chunkNCXHTQH2cjs.TagKeyValueFilter; exports.TagSearchInput = _chunkNCXHTQH2cjs.TagSearchInput; exports.TagsInput = _chunkNCXHTQH2cjs.TagsInput; exports.TagsManager = _chunkNCXHTQH2cjs.TagsManager; exports.TagsSelector = _chunkNCXHTQH2cjs.TagsSelector; exports.TaskTypeIcon = _chunkNCXHTQH2cjs.TaskTypeIcon; exports.TelegramIcon = _chunkZ4IBEIWDcjs.TelegramIcon; exports.TextSkeleton = TextSkeleton; exports.Textarea = _chunkNCXHTQH2cjs.Textarea; exports.ThemeProvider = _chunkNCXHTQH2cjs.ThemeProvider; exports.ThinkingDisplay = _chunkNCXHTQH2cjs.ThinkingDisplay; exports.ThumbsDownIcon = _chunkZ4IBEIWDcjs.ThumbsDownIcon; exports.ThumbsUpIcon = _chunkZ4IBEIWDcjs.ThumbsUpIcon; exports.TicketAttachmentsList = _chunkNCXHTQH2cjs.TicketAttachmentsList; exports.TicketCard = _chunkNCXHTQH2cjs.TicketCard; exports.TicketCardSkeleton = _chunkNCXHTQH2cjs.TicketCardSkeleton; exports.TicketDetailSection = _chunkNCXHTQH2cjs.TicketDetailSection; exports.TicketInfoSection = _chunkNCXHTQH2cjs.TicketInfoSection; exports.TicketNoteCard = _chunkNCXHTQH2cjs.TicketNoteCard; exports.TicketNotesSection = _chunkNCXHTQH2cjs.TicketNotesSection; exports.TicketStatusConfigList = _chunkNCXHTQH2cjs.TicketStatusConfigList; exports.TicketStatusConfigRow = _chunkNCXHTQH2cjs.TicketStatusConfigRow; exports.TicketStatusTag = _chunkNCXHTQH2cjs.TicketStatusTag; exports.TimelineSkeleton = TimelineSkeleton; exports.TitleBlock = _chunkNCXHTQH2cjs.TitleBlock; exports.TitleContentBlock = _chunkNCXHTQH2cjs.TitleContentBlock; exports.ToastCard = _chunkELF4OOHCcjs.ToastCard; exports.Toaster = _chunkELF4OOHCcjs.Toaster; exports.Toggle = _chunkNCXHTQH2cjs.Toggle; exports.ToggleGroup = _chunkNCXHTQH2cjs.ToggleGroup; exports.ToggleGroupItem = _chunkNCXHTQH2cjs.ToggleGroupItem; exports.ToolBadge = _chunkNCXHTQH2cjs.ToolBadge; exports.ToolExecutionDisplay = _chunkNCXHTQH2cjs.ToolExecutionDisplay; exports.Tooltip = _chunkNCXHTQH2cjs.Tooltip; exports.TooltipContent = _chunkNCXHTQH2cjs.TooltipContent; exports.TooltipProvider = _chunkNCXHTQH2cjs.TooltipProvider; exports.TooltipTrigger = _chunkNCXHTQH2cjs.TooltipTrigger; exports.TranscribeAndSummarizeCombinedSection = _chunkNCXHTQH2cjs.TranscribeAndSummarizeCombinedSection; exports.TranscribeSummarizeSection = _chunkNCXHTQH2cjs.TranscribeSummarizeSection; exports.TranscriptSummaryEditor = _chunkNCXHTQH2cjs.TranscriptSummaryEditor; exports.TransparentTrustedIcon = _chunkZ4IBEIWDcjs.TransparentTrustedIcon; exports.TruncateText = _chunkNCXHTQH2cjs.TruncateText; exports.TrustpilotIcon = _chunkZ4IBEIWDcjs.TrustpilotIcon; exports.TwoColumnLayoutSkeleton = TwoColumnLayoutSkeleton; exports.UnarchiveChatModal = _chunkNCXHTQH2cjs.UnarchiveChatModal; exports.UnifiedPagination = _chunkPDKBCCCDcjs.UnifiedPagination; exports.UnifiedSkeleton = UnifiedSkeleton; exports.UserDisplay = UserDisplay; exports.UserIcon = _chunkZ4IBEIWDcjs.UserIcon; exports.UsersGridSkeleton = UsersGridSkeleton; exports.UsersGroupIcon = _chunkZ4IBEIWDcjs.UsersGroupIcon; exports.UsersIcon = _chunkZ4IBEIWDcjs.UsersIcon; exports.VendorDetailLayoutSkeleton = VendorDetailLayoutSkeleton; exports.VendorDirectoryIcon = _chunkZ4IBEIWDcjs.VendorDirectoryIcon; exports.VendorDisplayButton = VendorDisplayButton; exports.VendorGridSkeleton = VendorGridSkeleton; exports.VendorIcon = VendorIcon; exports.VendorPageSkeleton = VendorPageSkeleton; exports.VendorShowcaseMainIcon = _chunkZ4IBEIWDcjs.VendorShowcaseMainIcon; exports.VendorTag = VendorTag; exports.VendorsIcon = _chunkZ4IBEIWDcjs.VendorsIcon; exports.Video = _chunk6LK4VEXEcjs.Video; exports.VideoBiteCard = _chunk6LK4VEXEcjs.VideoBiteCard; exports.VideoBitesDisplay = _chunk6LK4VEXEcjs.VideoBitesDisplay; exports.VideoClipsSection = _chunkNCXHTQH2cjs.VideoClipsSection; exports.VideoSourceSelector = _chunkNCXHTQH2cjs.VideoSourceSelector; exports.ViewToggle = _chunkNCXHTQH2cjs.ViewToggle; exports.WaitlistForm = _chunkNCXHTQH2cjs.WaitlistForm; exports.WhatsAppIcon = _chunkZ4IBEIWDcjs.WhatsAppIcon; exports.WindowsIcon = _chunkZ4IBEIWDcjs.WindowsIcon; exports.WizardLayoutSkeleton = WizardLayoutSkeleton; exports.XCircleIcon = _chunkNCXHTQH2cjs.XCircleIcon; exports.XLogo = _chunkZ4IBEIWDcjs.XLogo; exports.YesNoDisplay = YesNoDisplay; exports.YouTubeIcon = _chunkZ4IBEIWDcjs.YouTubeIcon; exports.alignJustify = _chunkNCXHTQH2cjs.alignJustify; exports.applyProxyAuth = _chunkNCXHTQH2cjs.applyProxyAuth; exports.badgeVariants = _chunkNCXHTQH2cjs.badgeVariants; exports.blogFilterConfig = blogFilterConfig; exports.buildAnchorProps = _chunk6LK4VEXEcjs.buildAnchorProps; exports.buildAutoContinuationDirective = _chunkNCXHTQH2cjs.buildAutoContinuationDirective; exports.buildChatAttachmentViewUrl = _chunkNCXHTQH2cjs.buildChatAttachmentViewUrl; exports.buildChatRefKey = _chunkNCXHTQH2cjs.buildChatRefKey; exports.buildDiscussAddendum = _chunkNCXHTQH2cjs.buildDiscussAddendum; exports.buildNatsWsUrl = _chunkNCXHTQH2cjs.buildNatsWsUrl; exports.buildProductReleaseCardProps = _chunkNCXHTQH2cjs.buildProductReleaseCardProps; exports.buttonVariants = _chunkTU26IZPOcjs.buttonVariants; exports.chatAuthedFetch = _chunkNCXHTQH2cjs.embedAuthedFetch; exports.chatChipClass = _chunkNCXHTQH2cjs.chatChipClass; exports.clearChatProxyAuth = _chunkNCXHTQH2cjs.clearEmbedProxyAuth; exports.clickupTaskUrl = _chunkNCXHTQH2cjs.clickupTaskUrl; exports.columnFromTicketStatus = _chunkNCXHTQH2cjs.columnFromTicketStatus; exports.computeHistoryPrepend = _chunkNCXHTQH2cjs.computeHistoryPrepend; exports.computeIsNewTab = _chunk6LK4VEXEcjs.computeIsNewTab; exports.createColumnHelper = _chunkNCXHTQH2cjs.createColumnHelper; exports.createMessageSegmentAccumulator = _chunkNCXHTQH2cjs.createMessageSegmentAccumulator; exports.decideNewTab = _chunk6LK4VEXEcjs.decideNewTab; exports.defaultBuildProductReleaseCardProps = _chunkNCXHTQH2cjs.defaultBuildProductReleaseCardProps; exports.defaultTableIdForDocumentType = _chunk6LK4VEXEcjs.defaultTableIdForDocumentType; exports.deriveColumns = _chunkNCXHTQH2cjs.deriveColumns; exports.detectAspectRatio = _chunk6LK4VEXEcjs.detectAspectRatio; exports.dotColorByVariant = _chunkELF4OOHCcjs.dotColorByVariant; exports.escapeMarkdownInline = _chunkNCXHTQH2cjs.escapeMarkdownInline; exports.evaluateFeatureValue = evaluateFeatureValue; exports.executeNavigation = _chunkNCXHTQH2cjs.executeNavigation; exports.executeNavigationImperative = _chunkNCXHTQH2cjs.executeNavigationImperative; exports.exportToCSV = _chunkNCXHTQH2cjs.exportToCSV; exports.extractEntityIdFilter = _chunkNCXHTQH2cjs.extractEntityIdFilter; exports.extractErrorMessages = _chunkNCXHTQH2cjs.extractErrorMessages; exports.extractIncompleteMessageState = _chunkNCXHTQH2cjs.extractIncompleteMessageState; exports.extractTextFromChunk = _chunkNCXHTQH2cjs.extractTextFromChunk; exports.extractYouTubeId = _chunk6LK4VEXEcjs.extractYouTubeId; exports.fetchSlashCommands = _chunkNCXHTQH2cjs.fetchSlashCommands; exports.flattenAssistantContent = _chunkNCXHTQH2cjs.flattenAssistantContent; exports.flattenMessagePagesChronological = _chunkNCXHTQH2cjs.flattenMessagePagesChronological; exports.flexRender = _chunkNCXHTQH2cjs.flexRender; exports.formatChatAttachmentMarkdownForBubble = _chunkNCXHTQH2cjs.formatChatAttachmentMarkdownForBubble; exports.formatInvestorUpdatePeriod = _chunkNCXHTQH2cjs.formatInvestorUpdatePeriod; exports.formatPricingForDisplay = formatPricingForDisplay; exports.formatRelativePath = _chunkLZL6P7SNcjs.formatRelativePath; exports.formatSingularLookupInvocation = _chunkNCXHTQH2cjs.formatSingularLookupInvocation; exports.getApprovalMeta = _chunkNCXHTQH2cjs.getApprovalMeta; exports.getCaptionsUrl = _chunk6LK4VEXEcjs.getCaptionsUrl; exports.getChatProxyAuth = _chunkNCXHTQH2cjs.getEmbedProxyAuth; exports.getCommandText = _chunkNCXHTQH2cjs.getCommandText; exports.getCoreRowModel = _chunkNCXHTQH2cjs.getCoreRowModel; exports.getDeviceTypeIcon = _chunkZ4IBEIWDcjs.getDeviceTypeIcon; exports.getDynamicIcon = _chunk6LK4VEXEcjs.getDynamicIcon; exports.getExpandedRowModel = _chunkNCXHTQH2cjs.getExpandedRowModel; exports.getFacetedRowModel = _chunkNCXHTQH2cjs.getFacetedRowModel; exports.getFacetedUniqueValues = _chunkNCXHTQH2cjs.getFacetedUniqueValues; exports.getFilteredRowModel = _chunkNCXHTQH2cjs.getFilteredRowModel; exports.getGroupedRowModel = _chunkNCXHTQH2cjs.getGroupedRowModel; exports.getHideClasses = _chunkNCXHTQH2cjs.getHideClasses; exports.getIconComponent = _chunk6LK4VEXEcjs.getIconComponent; exports.getOpenFramePaths = _chunkNCXHTQH2cjs.getOpenFramePaths; exports.getPaginationRowModel = _chunkNCXHTQH2cjs.getPaginationRowModel; exports.getPersistedProxyEmail = _chunkNCXHTQH2cjs.getPersistedProxyEmail; exports.getSortedRowModel = _chunkNCXHTQH2cjs.getSortedRowModel; exports.getSourceIconName = _chunk6LK4VEXEcjs.getSourceIconName; exports.getSourceLabel = _chunk6LK4VEXEcjs.getSourceLabel; exports.getStatusColorScheme = _chunkNCXHTQH2cjs.getStatusColorScheme; exports.getTabById = _chunkNCXHTQH2cjs.getTabById; exports.getTabComponent = _chunkNCXHTQH2cjs.getTabComponent; exports.getTaskTypeLabel = _chunkNCXHTQH2cjs.getTaskTypeLabel; exports.getTicketStatusConfig = _chunkNCXHTQH2cjs.getTicketStatusConfig; exports.getTicketStatusTag = _chunkNCXHTQH2cjs.getTicketStatusTag; exports.groupByAspectRatio = _chunk6LK4VEXEcjs.groupByAspectRatio; exports.groupTicketsByStatus = _chunkNCXHTQH2cjs.groupTicketsByStatus; exports.handleChatNavClick = _chunkNCXHTQH2cjs.handleChatNavClick; exports.isApprovalNotification = _chunkNCXHTQH2cjs.isApprovalNotification; exports.isControlChunk = _chunkNCXHTQH2cjs.isControlChunk; exports.isCrossOriginUrl = _chunk6LK4VEXEcjs.isCrossOriginUrl; exports.isErrorChunk = _chunkNCXHTQH2cjs.isErrorChunk; exports.isMetadataChunk = _chunkNCXHTQH2cjs.isMetadataChunk; exports.isModifierClick = _chunk6LK4VEXEcjs.isModifierClick; exports.isStructuredContent = _chunkNCXHTQH2cjs.isStructuredContent; exports.kindToCanonicalStatus = _chunkNCXHTQH2cjs.kindToCanonicalStatus; exports.mapDocSearchResults = _chunkLZL6P7SNcjs.mapDocSearchResults; exports.maxPersistedStreamSeq = _chunkNCXHTQH2cjs.maxPersistedStreamSeq; exports.mergeHistoryWithRealtime = _chunkNCXHTQH2cjs.mergeHistoryWithRealtime; exports.multiSelectFilterFn = _chunkNCXHTQH2cjs.multiSelectFilterFn; exports.navigationMenuTriggerStyle = _chunkNCXHTQH2cjs.navigationMenuTriggerStyle; exports.newTabAnchorAttrs = _chunk6LK4VEXEcjs.newTabAnchorAttrs; exports.normalizeContent = _chunkNCXHTQH2cjs.normalizeContent; exports.normalizeIconKey = _chunk6LK4VEXEcjs.normalizeIconKey; exports.parseChunkToAction = _chunkNCXHTQH2cjs.parseChunkToAction; exports.parseScrollAnchor = _chunkNCXHTQH2cjs.parseScrollAnchor; exports.parseWireCommandOverride = _chunkNCXHTQH2cjs.parseWireCommandOverride; exports.processHistoricalMessages = _chunkNCXHTQH2cjs.processHistoricalMessages; exports.processHistoricalMessagesWithErrors = _chunkNCXHTQH2cjs.processHistoricalMessagesWithErrors; exports.progressColorByVariant = _chunkELF4OOHCcjs.progressColorByVariant; exports.ratioToCategory = _chunk6LK4VEXEcjs.ratioToCategory; exports.remarkCardLinks = _chunkNCXHTQH2cjs.remarkCardLinks; exports.renderChatInlineEntityCard = _chunkNCXHTQH2cjs.renderChatInlineEntityCard; exports.renderSvgIcon = _chunkZ4IBEIWDcjs.renderSvgIcon; exports.resolveExternalNavigation = _chunk6LK4VEXEcjs.resolveExternalNavigation; exports.resolveSearchResultAction = _chunkLZL6P7SNcjs.resolveSearchResultAction; exports.resolveSourceIcon = _chunk6LK4VEXEcjs.resolveSourceIcon; exports.resolveSourceRowCTA = _chunk6LK4VEXEcjs.resolveSourceRowCTA; exports.resolveStatusTagProps = _chunkNCXHTQH2cjs.resolveStatusTagProps; exports.resolveTicketStatus = _chunkNCXHTQH2cjs.resolveTicketStatus; exports.safeHref = _chunk6LK4VEXEcjs.safeHref; exports.sanitizeTitleForChat = _chunkNCXHTQH2cjs.sanitizeTitleForChat; exports.setChatProxyAuth = _chunkNCXHTQH2cjs.setEmbedProxyAuth; exports.setRealAuthHook = setRealAuthHook; exports.showCommandApprovalToast = _chunkELF4OOHCcjs.showCommandApprovalToast; exports.showToast = _chunkELF4OOHCcjs.showToast; exports.statusBadgeVariants = _chunk6LK4VEXEcjs.statusBadgeVariants; exports.stripChatAttachmentMarkdown = _chunkNCXHTQH2cjs.stripChatAttachmentMarkdown; exports.stripSameOriginToPath = _chunk6LK4VEXEcjs.stripSameOriginToPath; exports.tagVariants = _chunk6LK4VEXEcjs.tagVariants; exports.tintOnDark = _chunkNCXHTQH2cjs.tintOnDark; exports.toggleVariants = _chunkNCXHTQH2cjs.toggleVariants; exports.transformEventToProgram = _chunkNCXHTQH2cjs.transformEventToProgram; exports.transformPodcastToProgram = _chunkNCXHTQH2cjs.transformPodcastToProgram; exports.transformWebinarToProgram = _chunkNCXHTQH2cjs.transformWebinarToProgram; exports.useAppLayoutDrawerContainer = _chunkNCXHTQH2cjs.useAppLayoutDrawerContainer; exports.useAuth = useAuth; exports.useBoardCollapse = _chunkNCXHTQH2cjs.useBoardCollapse; exports.useChat = _chunkNCXHTQH2cjs.useChat; exports.useChatAttachmentImageGallery = _chunkNCXHTQH2cjs.useChatAttachmentImageGallery; exports.useChatAttachments = _chunkNCXHTQH2cjs.useChatAttachments; exports.useChatCardItem = _chunkNCXHTQH2cjs.useChatCardItem; exports.useChatIdentity = _chunkNCXHTQH2cjs.useChatIdentity; exports.useChunkCatchup = _chunkNCXHTQH2cjs.useChunkCatchup; exports.useCloseOnNavigation = _chunkNCXHTQH2cjs.useCloseOnNavigation; exports.useCollapsible = _chunkNCXHTQH2cjs.useCollapsible; exports.useContentLoading = useContentLoading; exports.useDataTable = _chunkNCXHTQH2cjs.useDataTable; exports.useDataTableContext = _chunkNCXHTQH2cjs.useDataTableContext; exports.useDocSearch = _chunkLZL6P7SNcjs.useDocSearch; exports.useDynamicTheme = _chunkNCXHTQH2cjs.useDynamicTheme; exports.useEmbeddedChat = _chunkNCXHTQH2cjs.useSseChatAdapter; exports.useFiltersDropdown = _chunkNCXHTQH2cjs.useFiltersDropdown; exports.useJetStreamDialogSubscription = _chunkNCXHTQH2cjs.useJetStreamDialogSubscription; exports.useLegalDocs = useLegalDocs; exports.useLoading = _chunkNCXHTQH2cjs.useLoading; exports.useNatsChatAdapter = _chunkNCXHTQH2cjs.useNatsChatAdapter; exports.useNatsDialogSubscription = _chunkNCXHTQH2cjs.useNatsDialogSubscription; exports.useNotifications = _chunkNCXHTQH2cjs.useNotifications; exports.useOnboardingState = _chunkELF4OOHCcjs.useOnboardingState; exports.useOptionalNotifications = _chunkNCXHTQH2cjs.useOptionalNotifications; exports.usePageActionsBottomPadding = _chunk6LK4VEXEcjs.usePageActionsBottomPadding; exports.usePaginationLoading = usePaginationLoading; exports.useProxiedImageUrl = _chunkNCXHTQH2cjs.useProxiedImageUrl; exports.useRealtimeChunkProcessor = _chunkNCXHTQH2cjs.useRealtimeChunkProcessor; exports.useRoadmapVoting = useRoadmapVoting; exports.useSSE = _chunkNCXHTQH2cjs.useSSE; exports.useSectionNavigation = _chunkNCXHTQH2cjs.useSectionNavigation; exports.useSlashCommandRegistry = _chunkNCXHTQH2cjs.useSlashCommandRegistry; exports.useSlashCommands = _chunkNCXHTQH2cjs.useSlashCommands; exports.useSseChatAdapter = _chunkNCXHTQH2cjs.useSseChatAdapter; exports.useTheme = _chunkNCXHTQH2cjs.useTheme; exports.useThemeToggle = _chunkNCXHTQH2cjs.useThemeToggle; exports.useUnifiedChat = _chunkNCXHTQH2cjs.useUnifiedChat; exports.useUnifiedFiltering = useUnifiedFiltering; exports.useVideoOriginPreconnect = _chunk6LK4VEXEcjs.useVideoOriginPreconnect; exports.useVideoWarmup = _chunk6LK4VEXEcjs.useVideoWarmup; exports.usesCanonicalStatusStyle = _chunkNCXHTQH2cjs.usesCanonicalStatusStyle; exports.vendorFilterConfig = vendorFilterConfig;
|
|
7840
|
+
exports.ADMIN_APPROVAL_REQUEST_CONTEXT_TYPE = _chunkNCXHTQH2cjs.ADMIN_APPROVAL_REQUEST_CONTEXT_TYPE; exports.AIEnrichButton = _chunkNCXHTQH2cjs.AIEnrichButton; exports.AIEnrichSection = _chunkNCXHTQH2cjs.AIEnrichSection; exports.AIRequiredBadge = _chunkNCXHTQH2cjs.AIRequiredBadge; exports.AIStatusIndicator = _chunkNCXHTQH2cjs.AIStatusIndicator; exports.AIWarningsSection = _chunkNCXHTQH2cjs.AIWarningsSection; exports.ANTHROPIC_SUPPORTED_IMAGE_MIME = _chunkNCXHTQH2cjs.ANTHROPIC_SUPPORTED_IMAGE_MIME; exports.APPROVAL_STATUS = _chunkNCXHTQH2cjs.APPROVAL_STATUS; exports.ASSISTANT_TYPE = _chunkNCXHTQH2cjs.ASSISTANT_TYPE; exports.AUTHOR_TYPE = _chunkNCXHTQH2cjs.AUTHOR_TYPE; exports.AUTO_CONTINUATION_DIRECTIVE_PREFIX = _chunkNCXHTQH2cjs.AUTO_CONTINUATION_DIRECTIVE_PREFIX; exports.AboutIcon = _chunkZ4IBEIWDcjs.AboutIcon; exports.Accordion = _chunkNCXHTQH2cjs.Accordion; exports.AccordionContent = _chunkNCXHTQH2cjs.AccordionContent; exports.AccordionItem = _chunkNCXHTQH2cjs.AccordionItem; exports.AccordionTrigger = _chunkNCXHTQH2cjs.AccordionTrigger; exports.ActionsMenu = _chunk6LK4VEXEcjs.ActionsMenu; exports.ActionsMenuDropdown = _chunk6LK4VEXEcjs.ActionsMenuDropdown; exports.AdminContentCard = _chunkNCXHTQH2cjs.AdminContentCard; exports.AiRobotIcon = _chunkZ4IBEIWDcjs.AiRobotIcon; exports.Alert = _chunkNCXHTQH2cjs.Alert; exports.AlertDescription = _chunkNCXHTQH2cjs.AlertDescription; exports.AlertDialog = _chunkNCXHTQH2cjs.AlertDialog; exports.AlertDialogAction = _chunkNCXHTQH2cjs.AlertDialogAction; exports.AlertDialogCancel = _chunkNCXHTQH2cjs.AlertDialogCancel; exports.AlertDialogContent = _chunkNCXHTQH2cjs.AlertDialogContent; exports.AlertDialogDescription = _chunkNCXHTQH2cjs.AlertDialogDescription; exports.AlertDialogFooter = _chunkNCXHTQH2cjs.AlertDialogFooter; exports.AlertDialogHeader = _chunkNCXHTQH2cjs.AlertDialogHeader; exports.AlertDialogOverlay = _chunkNCXHTQH2cjs.AlertDialogOverlay; exports.AlertDialogPortal = _chunkNCXHTQH2cjs.AlertDialogPortal; exports.AlertDialogTitle = _chunkNCXHTQH2cjs.AlertDialogTitle; exports.AlertDialogTrigger = _chunkNCXHTQH2cjs.AlertDialogTrigger; exports.AlertTitle = _chunkNCXHTQH2cjs.AlertTitle; exports.AlertTriangleIcon = _chunkZ4IBEIWDcjs.AlertTriangleIcon; exports.AllowedDomainsInput = _chunkNCXHTQH2cjs.AllowedDomainsInput; exports.AnnouncementBar = AnnouncementBar; exports.AnnouncementBarSkeleton = AnnouncementBarSkeleton; exports.AppHeader = _chunkNCXHTQH2cjs.AppHeader; exports.AppLayout = _chunkNCXHTQH2cjs.AppLayout; exports.AppLayoutDrawer = _chunkNCXHTQH2cjs.AppLayoutDrawerRoot; exports.AppLayoutDrawerBody = _chunkNCXHTQH2cjs.AppLayoutDrawerBody; exports.AppLayoutDrawerClose = _chunkNCXHTQH2cjs.AppLayoutDrawerClose; exports.AppLayoutDrawerContent = _chunkNCXHTQH2cjs.AppLayoutDrawerContent; exports.AppLayoutDrawerDescription = _chunkNCXHTQH2cjs.AppLayoutDrawerDescription; exports.AppLayoutDrawerFooter = _chunkNCXHTQH2cjs.AppLayoutDrawerFooter; exports.AppLayoutDrawerHeader = _chunkNCXHTQH2cjs.AppLayoutDrawerHeader; exports.AppLayoutDrawerTitle = _chunkNCXHTQH2cjs.AppLayoutDrawerTitle; exports.AppLayoutDrawerTrigger = _chunkNCXHTQH2cjs.AppLayoutDrawerTrigger; exports.ApprovalBatchMessage = _chunkNCXHTQH2cjs.ApprovalBatchMessage; exports.ApprovalRequestMessage = _chunkNCXHTQH2cjs.ApprovalRequestMessage; exports.ApprovalRequestNotificationTile = _chunkNCXHTQH2cjs.ApprovalRequestNotificationTile; exports.ArchiveChatModal = _chunkNCXHTQH2cjs.ArchiveChatModal; exports.ArchiveIcon = _chunkZ4IBEIWDcjs.ArchiveIcon; exports.ArgRow = _chunkNCXHTQH2cjs.ArgRow; exports.ArrayEntryManager = _chunkNCXHTQH2cjs.ArrayEntryManager; exports.ArticleDetailLayout = _chunk6LK4VEXEcjs.ArticleDetailLayout; exports.ArticleLayoutSkeleton = ArticleLayoutSkeleton; exports.AspectRatio = _chunkNCXHTQH2cjs.AspectRatio; exports.AssigneeDropdown = _chunkNCXHTQH2cjs.AssigneeDropdown; exports.AuditLoggingIcon = _chunkZ4IBEIWDcjs.AuditLoggingIcon; exports.AuthProvider = AuthProvider; exports.AuthProvidersList = _chunkNCXHTQH2cjs.AuthProvidersList; exports.Autocomplete = _chunkNCXHTQH2cjs.Autocomplete; exports.AutomateEverythingIcon = _chunkZ4IBEIWDcjs.AutomateEverythingIcon; exports.AutomatedDiagnosticsIcon = _chunkZ4IBEIWDcjs.AutomatedDiagnosticsIcon; exports.Badge = _chunkNCXHTQH2cjs.Badge; exports.BashIcon = _chunkZ4IBEIWDcjs.BashIcon; exports.BenefitCard = _chunkNCXHTQH2cjs.BenefitCard; exports.BenefitCardGrid = _chunkNCXHTQH2cjs.BenefitCardGrid; exports.BlockCard = _chunkNCXHTQH2cjs.BlockCard; exports.BlogCard = _chunkNCXHTQH2cjs.BlogCard; exports.BlogCardGridSkeleton = BlogCardGridSkeleton; exports.BlogCardSkeleton = _chunkNCXHTQH2cjs.BlogCardSkeleton; exports.BlogImagePlaceholder = _chunk6LK4VEXEcjs.BlogImagePlaceholder; exports.Board = _chunkNCXHTQH2cjs.Board; exports.BoardColumn = _chunkNCXHTQH2cjs.BoardColumn; exports.BoardColumnHeader = _chunkNCXHTQH2cjs.BoardColumnHeader; exports.BotIcon = _chunkZ4IBEIWDcjs.BotIcon; exports.BrandAssociationCard = _chunkNCXHTQH2cjs.BrandAssociationCard; exports.BrandAssociationGrid = _chunkNCXHTQH2cjs.BrandAssociationGrid; exports.Breadcrumb = _chunkNCXHTQH2cjs.Breadcrumb; exports.BreadcrumbEllipsis = _chunkNCXHTQH2cjs.BreadcrumbEllipsis; exports.BreadcrumbItem = _chunkNCXHTQH2cjs.BreadcrumbItem; exports.BreadcrumbLink = _chunkNCXHTQH2cjs.BreadcrumbLink; exports.BreadcrumbList = _chunkNCXHTQH2cjs.BreadcrumbList; exports.BreadcrumbPage = _chunkNCXHTQH2cjs.BreadcrumbPage; exports.BreadcrumbSeparator = _chunkNCXHTQH2cjs.BreadcrumbSeparator; exports.BreadcrumbSkeleton = BreadcrumbSkeleton; exports.BuildingsIcon = _chunkZ4IBEIWDcjs.BuildingsIcon; exports.BulkOperationsIcon = _chunkZ4IBEIWDcjs.BulkOperationsIcon; exports.BulletList = _chunkNCXHTQH2cjs.BulletList; exports.Button = _chunkTU26IZPOcjs.Button; exports.CHAT_ATTACHMENT_CONCURRENT_UPLOADS_PER_USER = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_CONCURRENT_UPLOADS_PER_USER; exports.CHAT_ATTACHMENT_MARKDOWN_PATTERN = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_MARKDOWN_PATTERN; exports.CHAT_ATTACHMENT_MIME_TYPES = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_MIME_TYPES; exports.CHAT_ATTACHMENT_VIEW_TOKEN_QUERY_PARAM = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_VIEW_TOKEN_QUERY_PARAM; exports.CHAT_ATTACHMENT_VIEW_URL_PREFIX = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_VIEW_URL_PREFIX; exports.CHAT_ATTACHMENT_VIEW_URL_PREFIX_REGEX_ESCAPED = _chunkNCXHTQH2cjs.CHAT_ATTACHMENT_VIEW_URL_PREFIX_REGEX_ESCAPED; exports.CHAT_TYPE = _chunkNCXHTQH2cjs.CHAT_TYPE; exports.CHIP_ACTION_BUTTON_CLASS = _chunkNCXHTQH2cjs.CHIP_ACTION_BUTTON_CLASS; exports.COMPACT_CARD_ICON_SLOT = _chunk6LK4VEXEcjs.COMPACT_CARD_ICON_SLOT; exports.COMPACT_CARD_IMAGE_SLOT = _chunk6LK4VEXEcjs.COMPACT_CARD_IMAGE_SLOT; exports.COMPACT_CARD_META_ROW = _chunk6LK4VEXEcjs.COMPACT_CARD_META_ROW; exports.COMPACT_CARD_META_ROW_BOX = _chunk6LK4VEXEcjs.COMPACT_CARD_META_ROW_BOX; exports.COMPACT_CARD_OUTER = _chunk6LK4VEXEcjs.COMPACT_CARD_OUTER; exports.COMPACT_CARD_OUTER_STATIC = _chunk6LK4VEXEcjs.COMPACT_CARD_OUTER_STATIC; exports.COMPACT_CARD_ROW_FILLER = _chunk6LK4VEXEcjs.COMPACT_CARD_ROW_FILLER; exports.COMPACT_CARD_SKELETON_IMAGE_SLOT = _chunk6LK4VEXEcjs.COMPACT_CARD_SKELETON_IMAGE_SLOT; exports.COMPACT_CARD_SKELETON_OUTER = _chunk6LK4VEXEcjs.COMPACT_CARD_SKELETON_OUTER; exports.COMPACT_CARD_SUBTITLE = _chunk6LK4VEXEcjs.COMPACT_CARD_SUBTITLE; exports.COMPACT_CARD_SUMMARY = _chunk6LK4VEXEcjs.COMPACT_CARD_SUMMARY; exports.COMPACT_CARD_TEXT_COL = _chunk6LK4VEXEcjs.COMPACT_CARD_TEXT_COL; exports.COMPACT_CARD_TITLE = _chunk6LK4VEXEcjs.COMPACT_CARD_TITLE; exports.COMPACT_CARD_TITLE_ROW = _chunk6LK4VEXEcjs.COMPACT_CARD_TITLE_ROW; exports.COMPACT_HEADER_BUTTON = _chunkNCXHTQH2cjs.COMPACT_HEADER_BUTTON; exports.CONNECTION_STATUS = _chunkNCXHTQH2cjs.CONNECTION_STATUS; exports.CUSTOM_ITEM_ID = _chunkNCXHTQH2cjs.CUSTOM_ITEM_ID; exports.CUSTOM_PRESET_KEY = _chunkNCXHTQH2cjs.CUSTOM_PRESET_KEY; exports.CampaignCardAdmin = _chunkNCXHTQH2cjs.CampaignCardAdmin; exports.CampaignCardAdminSkeleton = _chunkNCXHTQH2cjs.CampaignCardAdminSkeleton; exports.CapterraIcon = _chunkZ4IBEIWDcjs.CapterraIcon; exports.Card = _chunk6LK4VEXEcjs.Card; exports.CardContent = _chunk6LK4VEXEcjs.CardContent; exports.CardDescription = _chunk6LK4VEXEcjs.CardDescription; exports.CardFooter = _chunk6LK4VEXEcjs.CardFooter; exports.CardHeader = _chunk6LK4VEXEcjs.CardHeader; exports.CardHorizontal = _chunk6LK4VEXEcjs.CardHorizontal; exports.CardLoader = _chunkNCXHTQH2cjs.CardLoader; exports.CardSkeleton = CardSkeleton; exports.CardSkeletonGrid = CardSkeletonGrid; exports.CardTitle = _chunk6LK4VEXEcjs.CardTitle; exports.CartaIcon = _chunkZ4IBEIWDcjs.CartaIcon; exports.CaseStudyCard = _chunkNCXHTQH2cjs.CaseStudyCard; exports.CaseStudyCardSkeleton = _chunkNCXHTQH2cjs.CaseStudyCardSkeleton; exports.CategoriesCart = CategoriesCart; exports.CategoryCard = CategoryCard; exports.CategoryCardSkeleton = CategoryCardSkeleton; exports.CategorySidebarSkeleton = CategorySidebarSkeleton; exports.CategoryVendorSelectorSkeleton = CategoryVendorSelectorSkeleton; exports.ChangelogManager = _chunkNCXHTQH2cjs.ChangelogManager; exports.ChangelogSectionsManager = _chunkNCXHTQH2cjs.ChangelogSectionsManager; exports.ChatArchivePage = _chunkNCXHTQH2cjs.ChatArchivePage; exports.ChatAttachmentAddButton = _chunkNCXHTQH2cjs.ChatAttachmentAddButton; exports.ChatAttachmentChipStrip = _chunkNCXHTQH2cjs.ChatAttachmentChipStrip; exports.ChatCardLoader = _chunkNCXHTQH2cjs.ChatCardLoader; exports.ChatComposer = _chunkNCXHTQH2cjs.ChatComposer; exports.ChatContainer = _chunkNCXHTQH2cjs.ChatContainer; exports.ChatContent = _chunkNCXHTQH2cjs.ChatContent; exports.ChatDialogModals = _chunkNCXHTQH2cjs.ChatDialogModals; exports.ChatFooter = _chunkNCXHTQH2cjs.ChatFooter; exports.ChatHeader = _chunkNCXHTQH2cjs.ChatHeader; exports.ChatHeaderIconButton = _chunkNCXHTQH2cjs.ChatHeaderIconButton; exports.ChatIdentityProvider = _chunkNCXHTQH2cjs.ChatIdentityProvider; exports.ChatInput = _chunkNCXHTQH2cjs.ChatInput; exports.ChatMessageEnhanced = _chunkNCXHTQH2cjs.MemoizedChatMessageEnhanced; exports.ChatMessageList = _chunkNCXHTQH2cjs.ChatMessageList; exports.ChatMessageListSkeleton = _chunkNCXHTQH2cjs.ChatMessageListSkeleton; exports.ChatMessageRow = _chunkNCXHTQH2cjs.ChatMessageRow; exports.ChatMessageRowSkeleton = _chunkNCXHTQH2cjs.ChatMessageRowSkeleton; exports.ChatMessageSkeleton = _chunkNCXHTQH2cjs.ChatMessageSkeleton; exports.ChatPanelHeader = _chunkNCXHTQH2cjs.ChatPanelHeader; exports.ChatQuickAction = _chunkNCXHTQH2cjs.ChatQuickAction; exports.ChatSidebar = _chunkNCXHTQH2cjs.ChatSidebar; exports.ChatTicketItem = _chunkNCXHTQH2cjs.ChatTicketItem; exports.ChatTicketList = _chunkNCXHTQH2cjs.ChatTicketList; exports.ChatTypingIndicator = _chunkNCXHTQH2cjs.ChatTypingIndicator; exports.ChatVideoEntityCard = _chunkNCXHTQH2cjs.ChatVideoEntityCard; exports.CheckCircleIcon = _chunkZ4IBEIWDcjs.CheckCircleIcon; exports.CheckIcon = _chunkNCXHTQH2cjs.CheckIcon; exports.Checkbox = _chunk6JINAOI7cjs.Checkbox; exports.CheckboxBlock = _chunkNCXHTQH2cjs.CheckboxBlock; exports.CheckboxWithDescription = _chunkNCXHTQH2cjs.CheckboxWithDescription; exports.ChevronButton = _chunkSGJBUL2Ycjs.ChevronButton; exports.CircularProgress = _chunkNCXHTQH2cjs.CircularProgress; exports.ClaudeIcon = _chunkZ4IBEIWDcjs.ClaudeIcon; exports.ClickUpIcon = _chunkZ4IBEIWDcjs.ClickUpIcon; exports.ClickUpTasksManager = _chunkNCXHTQH2cjs.ClickUpTasksManager; exports.ClientOnlyHeader = _chunkNCXHTQH2cjs.ClientOnlyHeader; exports.CmdIcon = _chunkZ4IBEIWDcjs.CmdIcon; exports.CoinsIcon = _chunkZ4IBEIWDcjs.CoinsIcon; exports.ColorPickerInput = _chunkNCXHTQH2cjs.ColorPickerInput; exports.ColorPresetSelect = _chunkNCXHTQH2cjs.ColorPresetSelect; exports.ColorSwatch = _chunkNCXHTQH2cjs.ColorSwatch; exports.CommandApprovalToast = _chunkELF4OOHCcjs.CommandApprovalToast; exports.CommandBox = _chunkNCXHTQH2cjs.CommandBox; exports.CommentCard = CommentCard; exports.CommentSkeleton = CommentSkeleton; exports.CommunityHubIcon = _chunkZ4IBEIWDcjs.CommunityHubIcon; exports.CommunityIcon = _chunkZ4IBEIWDcjs.CommunityIcon; exports.CompactPageLoader = _chunkNCXHTQH2cjs.CompactPageLoader; exports.CompareIcon = _chunkZ4IBEIWDcjs.CompareIcon; exports.ConfidenceBadge = _chunkNCXHTQH2cjs.ConfidenceBadge; exports.ContentLoader = _chunkNCXHTQH2cjs.ContentLoader; exports.ContentLoadingContainer = ContentLoadingContainer; exports.ContentPageContainer = _chunk6LK4VEXEcjs.ContentPageContainer; exports.ContextCompactionDisplay = _chunkNCXHTQH2cjs.ContextCompactionDisplay; exports.CopyIcon = _chunkZ4IBEIWDcjs.CopyIcon; exports.CpuIcon = _chunkZ4IBEIWDcjs.CpuIcon; exports.CursorPagination = _chunkNCXHTQH2cjs.CursorPagination; exports.CursorPaginationSimple = _chunkNCXHTQH2cjs.CursorPaginationSimple; exports.CustomExternalLinkIcon = _chunkZ4IBEIWDcjs.CustomExternalLinkIcon; exports.CustomForkIcon = _chunkZ4IBEIWDcjs.CustomForkIcon; exports.CustomLicenseIcon = _chunkZ4IBEIWDcjs.CustomLicenseIcon; exports.CustomStarIcon = _chunkZ4IBEIWDcjs.CustomStarIcon; exports.CustomTimeIcon = _chunkZ4IBEIWDcjs.CustomTimeIcon; exports.CustomerInterviewCard = _chunkNCXHTQH2cjs.CustomerInterviewCard; exports.CustomerInterviewCardSkeleton = _chunkNCXHTQH2cjs.CustomerInterviewCardSkeleton; exports.CutVendorCostsIcon = _chunkZ4IBEIWDcjs.CutVendorCostsIcon; exports.CveLink = _chunkNCXHTQH2cjs.CveLink; exports.DEFAULT_CUSTOM_STATUS_COLOR = _chunkNCXHTQH2cjs.DEFAULT_CUSTOM_STATUS_COLOR; exports.DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID = _chunk6LK4VEXEcjs.DEFAULT_DOCUMENT_TYPE_TO_TABLE_ID; exports.DEFAULT_THEME = _chunkNCXHTQH2cjs.DEFAULT_THEME; exports.DashboardIcon = _chunkZ4IBEIWDcjs.DashboardIcon; exports.DashboardInfoCard = _chunkNCXHTQH2cjs.DashboardInfoCard; exports.DataRoomDocCard = _chunkNCXHTQH2cjs.DataRoomDocCard; exports.DataRoomDocCardSkeleton = _chunkNCXHTQH2cjs.DataRoomDocCardSkeleton; exports.DataTable = _chunkNCXHTQH2cjs.DataTable; exports.DataTableBody = _chunkNCXHTQH2cjs.DataTableBody; exports.DataTableCursorFooter = _chunkNCXHTQH2cjs.DataTableCursorFooter; exports.DataTableEmpty = _chunkNCXHTQH2cjs.DataTableEmpty; exports.DataTableHeader = _chunkNCXHTQH2cjs.DataTableHeader; exports.DataTableInfiniteFooter = _chunkNCXHTQH2cjs.DataTableInfiniteFooter; exports.DataTableRoot = _chunkNCXHTQH2cjs.DataTableRoot; exports.DataTableRow = _chunkNCXHTQH2cjs.DataTableRow; exports.DataTableRowCount = _chunkNCXHTQH2cjs.DataTableRowCount; exports.DataTableSkeleton = _chunkNCXHTQH2cjs.DataTableSkeleton; exports.DatePicker = _chunkNCXHTQH2cjs.DatePicker; exports.DatePickerInput = _chunkNCXHTQH2cjs.DatePickerInput; exports.DatePickerInputSimple = _chunkNCXHTQH2cjs.DatePickerInputSimple; exports.DateTimePicker = DateTimePicker; exports.DeliveryLists = DeliveryLists; exports.DeliveryRow = _chunkPDKBCCCDcjs.DeliveryRow; exports.DeliveryTable = DeliveryTable; exports.DenoIcon = _chunkZ4IBEIWDcjs.DenoIcon; exports.DesktopIcon = _chunkZ4IBEIWDcjs.DesktopIcon; exports.DetailLoader = _chunkNCXHTQH2cjs.DetailLoader; exports.DetailPageContainer = _chunk6LK4VEXEcjs.DetailPageContainer; exports.DetailPageSkeleton = _chunkLZL6P7SNcjs.DetailPageSkeleton; exports.DevCardRowContent = _chunkPDKBCCCDcjs.DevCardRowContent; exports.DevCardRowSkeleton = _chunkPDKBCCCDcjs.DevCardRowSkeleton; exports.DevCardRowSkeletonList = _chunkPDKBCCCDcjs.DevCardRowSkeletonList; exports.DevSectionPage = _chunkPDKBCCCDcjs.DevSectionPage; exports.DevSectionView = _chunkPDKBCCCDcjs.DevSectionView; exports.DeviceCard = _chunkNCXHTQH2cjs.DeviceCard; exports.DeviceCardCompact = _chunkNCXHTQH2cjs.DeviceCardCompact; exports.DeviceCardSkeleton = DeviceCardSkeleton; exports.DeviceCardSkeletonGrid = DeviceCardSkeletonGrid; exports.DevicesIcon = _chunkZ4IBEIWDcjs.DevicesIcon; exports.Dialog = _chunkNCXHTQH2cjs.Dialog; exports.DialogClose = _chunkNCXHTQH2cjs.DialogClose; exports.DialogContent = _chunkNCXHTQH2cjs.DialogContent; exports.DialogDescription = _chunkNCXHTQH2cjs.DialogDescription; exports.DialogFooter = _chunkNCXHTQH2cjs.DialogFooter; exports.DialogHeader = _chunkNCXHTQH2cjs.DialogHeader; exports.DialogListItem = _chunkNCXHTQH2cjs.DialogListItem; exports.DialogOverlay = _chunkNCXHTQH2cjs.DialogOverlay; exports.DialogPortal = _chunkNCXHTQH2cjs.DialogPortal; exports.DialogTitle = _chunkNCXHTQH2cjs.DialogTitle; exports.DialogTrigger = _chunkNCXHTQH2cjs.DialogTrigger; exports.DocSearchBar = _chunkLZL6P7SNcjs.DocSearchBar; exports.DocSearchResultRow = _chunkLZL6P7SNcjs.DocSearchResultRow; exports.DocumentIcon = _chunkZ4IBEIWDcjs.DocumentIcon; exports.DonutIcon = _chunkZ4IBEIWDcjs.DonutIcon; exports.DoubleChevronIcon = _chunkZ4IBEIWDcjs.DoubleChevronIcon; exports.Drawer = _chunkNCXHTQH2cjs.Drawer; exports.DrawerBody = _chunkNCXHTQH2cjs.DrawerBody; exports.DrawerClose = _chunkNCXHTQH2cjs.DrawerClose; exports.DrawerContent = _chunkNCXHTQH2cjs.DrawerContent; exports.DrawerDescription = _chunkNCXHTQH2cjs.DrawerDescription; exports.DrawerFooter = _chunkNCXHTQH2cjs.DrawerFooter; exports.DrawerHeader = _chunkNCXHTQH2cjs.DrawerHeader; exports.DrawerOverlay = _chunkNCXHTQH2cjs.DrawerOverlay; exports.DrawerPortal = _chunkNCXHTQH2cjs.DrawerPortal; exports.DrawerTitle = _chunkNCXHTQH2cjs.DrawerTitle; exports.DrawerTrigger = _chunkNCXHTQH2cjs.DrawerTrigger; exports.DropdownButton = _chunkNCXHTQH2cjs.DropdownButton; exports.DropdownMenu = _chunkTU26IZPOcjs.DropdownMenu; exports.DropdownMenuCheckboxItem = _chunkTU26IZPOcjs.DropdownMenuCheckboxItem; exports.DropdownMenuContent = _chunkTU26IZPOcjs.DropdownMenuContent; exports.DropdownMenuGroup = _chunkTU26IZPOcjs.DropdownMenuGroup; exports.DropdownMenuItem = _chunkTU26IZPOcjs.DropdownMenuItem; exports.DropdownMenuLabel = _chunkTU26IZPOcjs.DropdownMenuLabel; exports.DropdownMenuPortal = _chunkTU26IZPOcjs.DropdownMenuPortal; exports.DropdownMenuRadioGroup = _chunkTU26IZPOcjs.DropdownMenuRadioGroup; exports.DropdownMenuRadioItem = _chunkTU26IZPOcjs.DropdownMenuRadioItem; exports.DropdownMenuSeparator = _chunkTU26IZPOcjs.DropdownMenuSeparator; exports.DropdownMenuShortcut = _chunkTU26IZPOcjs.DropdownMenuShortcut; exports.DropdownMenuSub = _chunkTU26IZPOcjs.DropdownMenuSub; exports.DropdownMenuSubContent = _chunkTU26IZPOcjs.DropdownMenuSubContent; exports.DropdownMenuSubTrigger = _chunkTU26IZPOcjs.DropdownMenuSubTrigger; exports.DropdownMenuTrigger = _chunkTU26IZPOcjs.DropdownMenuTrigger; exports.DynamicSkeleton = DynamicSkeleton; exports.DynamicThemeProvider = _chunkNCXHTQH2cjs.DynamicThemeProvider; exports.EMPTY_AUTHOR_PLACEHOLDER = _chunk6LK4VEXEcjs.EMPTY_AUTHOR_PLACEHOLDER; exports.EditProfileIcon = _chunkZ4IBEIWDcjs.EditProfileIcon; exports.ElestioLogo = _chunkZ4IBEIWDcjs.ElestioLogo; exports.EmbeddableChat = _chunkNCXHTQH2cjs.EmbeddableChat; exports.EmptyState = _chunkPDKBCCCDcjs.EmptyState; exports.EmptyVendorIcon = _chunkZ4IBEIWDcjs.EmptyVendorIcon; exports.EntityAuthorCard = _chunk6LK4VEXEcjs.EntityAuthorCard; exports.EntityImage = _chunkNCXHTQH2cjs.EntityImage; exports.EntityMetadataAuthorCell = _chunk6LK4VEXEcjs.EntityMetadataAuthorCell; exports.EntityMetadataValueCell = _chunk6LK4VEXEcjs.EntityMetadataValueCell; exports.EntitySummaryEditor = _chunkNCXHTQH2cjs.EntitySummaryEditor; exports.EntityTagBadges = _chunk6LK4VEXEcjs.EntityTagBadges; exports.EntityVideoSection = _chunk6LK4VEXEcjs.EntityVideoSection; exports.ErrorBoundary = _chunkNCXHTQH2cjs.ErrorBoundary; exports.ErrorIcon = _chunkZ4IBEIWDcjs.ErrorIcon; exports.ErrorMessageDisplay = _chunkNCXHTQH2cjs.ErrorMessageDisplay; exports.ErrorState = _chunk6LK4VEXEcjs.ErrorState; exports.ExpandChevron = _chunkNCXHTQH2cjs.ExpandChevron; exports.ExploreCategoriesIcon = _chunkZ4IBEIWDcjs.ExploreCategoriesIcon; exports.EyeIcon = _chunkZ4IBEIWDcjs.EyeIcon; exports.FLAMINGO_LOGO_SVG_PATH = _chunkZ4IBEIWDcjs.FLAMINGO_LOGO_SVG_PATH; exports.FLAMINGO_LOGO_VIEWBOX = _chunkZ4IBEIWDcjs.FLAMINGO_LOGO_VIEWBOX; exports.FacebookIcon = _chunkZ4IBEIWDcjs.FacebookIcon; exports.FaqAccordion = _chunk3TDLFCCScjs.FaqAccordion; exports.FaqSection = _chunk3TDLFCCScjs.FaqSection; exports.FeatureCardGrid = _chunkNCXHTQH2cjs.FeatureCardGrid; exports.FeatureList = _chunkNCXHTQH2cjs.FeatureList; exports.FeatureListSkeleton = FeatureListSkeleton; exports.FieldWrapper = _chunk6JINAOI7cjs.FieldWrapper; exports.FigmaIcon = _chunkZ4IBEIWDcjs.FigmaIcon; exports.FigmaPrototypeViewer = _chunkNCXHTQH2cjs.FigmaPrototypeViewer; exports.FileCheckIcon = _chunkZ4IBEIWDcjs.FileCheckIcon; exports.FileTextIcon = _chunkZ4IBEIWDcjs.FileTextIcon; exports.FileUpload = _chunkNCXHTQH2cjs.FileUpload; exports.FilterCheckboxItem = _chunkNCXHTQH2cjs.FilterCheckboxItem; exports.FilterChip = FilterChip; exports.FilterIcon = _chunkZ4IBEIWDcjs.FilterIcon; exports.FilterList = _chunkNCXHTQH2cjs.FilterList; exports.FilterListItem = _chunkNCXHTQH2cjs.FilterListItem; exports.FilterModal = _chunkNCXHTQH2cjs.FilterModal; exports.FilterPillRow = _chunk6LK4VEXEcjs.FilterPillRow; exports.FiltersDropdown = _chunkNCXHTQH2cjs.FiltersDropdown; exports.FlamingoLogo = _chunkZ4IBEIWDcjs.FlamingoLogo; exports.FloatingTooltip = _chunkNCXHTQH2cjs.FloatingTooltip; exports.FolderShieldIcon = _chunkZ4IBEIWDcjs.FolderShieldIcon; exports.Footer = Footer; exports.FooterWaitlistButton = FooterWaitlistButton; exports.FormLoader = _chunkNCXHTQH2cjs.FormLoader; exports.FormPageContainer = _chunk6LK4VEXEcjs.FormPageContainer; exports.FormSkeleton = FormSkeleton; exports.G2Icon = _chunkZ4IBEIWDcjs.G2Icon; exports.GenericEntityCard = _chunkNCXHTQH2cjs.GenericEntityCard; exports.GenericEntityCardSkeleton = _chunkNCXHTQH2cjs.GenericEntityCardSkeleton; exports.GetAppIcon = _chunkZ4IBEIWDcjs.GetAppIcon; exports.GitHubActivityCard = _chunkNCXHTQH2cjs.GitHubActivityCard; exports.GitHubActivityCardSkeleton = _chunkNCXHTQH2cjs.GitHubActivityCardSkeleton; exports.GitHubIcon = _chunkZ4IBEIWDcjs.GitHubIcon; exports.GitHubReleasesManager = _chunkNCXHTQH2cjs.GitHubReleasesManager; exports.GlobeIcon = _chunkZ4IBEIWDcjs.GlobeIcon; exports.GoogleGeminiIcon = _chunkZ4IBEIWDcjs.GoogleGeminiIcon; exports.GoogleLogo = _chunkZ4IBEIWDcjs.GoogleLogo; exports.GridViewIcon = _chunkZ4IBEIWDcjs.GridViewIcon; exports.GuideModeBanner = _chunkNCXHTQH2cjs.GuideModeBanner; exports.GuideWelcome = _chunkNCXHTQH2cjs.GuideWelcome; exports.HamburgerIcon = _chunkZ4IBEIWDcjs.HamburgerIcon; exports.HandDollarIcon = _chunkZ4IBEIWDcjs.HandDollarIcon; exports.Header = _chunkNCXHTQH2cjs.Header; exports.HeaderButton = _chunkNCXHTQH2cjs.HeaderButton; exports.HeaderGlobalSearch = _chunkNCXHTQH2cjs.HeaderGlobalSearch; exports.HeaderMingoButton = _chunkNCXHTQH2cjs.HeaderMingoButton; exports.HeaderOrganizationFilter = _chunkNCXHTQH2cjs.HeaderOrganizationFilter; exports.HeaderSkeleton = _chunkNCXHTQH2cjs.HeaderSkeleton; exports.HeroImageUploader = HeroImageUploader; exports.HeroSkeleton = HeroSkeleton; exports.HiddenTagsPopup = _chunk6LK4VEXEcjs.HiddenTagsPopup; exports.HighlightCard = _chunkNCXHTQH2cjs.HighlightCard; exports.HighlightCardGrid = _chunkNCXHTQH2cjs.HighlightCardGrid; exports.HighlightConfigSection = _chunkNCXHTQH2cjs.HighlightConfigSection; exports.HighlightGenerationSection = _chunkNCXHTQH2cjs.HighlightGenerationSection; exports.HighlightVideoCombinedSection = _chunkNCXHTQH2cjs.HighlightVideoCombinedSection; exports.HighlightVideoPreview = _chunkNCXHTQH2cjs.HighlightVideoPreview; exports.HighlightVideoSection = _chunkNCXHTQH2cjs.HighlightVideoSection; exports.HoneypotField = _chunkNCXHTQH2cjs.HoneypotField; exports.HotelIcon = _chunkZ4IBEIWDcjs.HotelIcon; exports.HoverCard = _chunkNCXHTQH2cjs.HoverCard; exports.HoverCardContent = _chunkNCXHTQH2cjs.HoverCardContent; exports.HoverCardTrigger = _chunkNCXHTQH2cjs.HoverCardTrigger; exports.HoverDropdown = _chunkNCXHTQH2cjs.HoverDropdown; exports.HubspotIcon = _chunkZ4IBEIWDcjs.HubspotIcon; exports.HubspotTicketCard = _chunkNCXHTQH2cjs.HubspotTicketCard; exports.HubspotTicketCardSkeleton = _chunkNCXHTQH2cjs.HubspotTicketCardSkeleton; exports.ICON_REGISTRY = _chunk6LK4VEXEcjs.ICON_REGISTRY; exports.ITIcon = _chunkZ4IBEIWDcjs.ITIcon; exports.IconsBlock = _chunkNCXHTQH2cjs.IconsBlock; exports.IconsXIcon = _chunkZ4IBEIWDcjs.XIcon; exports.ImageCropper = ImageCropper; exports.ImageGalleryModal = _chunkNCXHTQH2cjs.ImageGalleryModal; exports.ImageIcon = _chunkZ4IBEIWDcjs.ImageIcon; exports.ImageUploader = _chunkNCXHTQH2cjs.ImageUploader; exports.InfoCard = _chunkNCXHTQH2cjs.InfoCard; exports.InfoCircleIcon = _chunkZ4IBEIWDcjs.InfoCircleIcon; exports.InfoRow = _chunkNCXHTQH2cjs.InfoRow; exports.Input = _chunk6JINAOI7cjs.Input; exports.InputTrigger = _chunkNCXHTQH2cjs.InputTrigger; exports.InstagramIcon = _chunkZ4IBEIWDcjs.InstagramIcon; exports.InteractiveCard = _chunkNCXHTQH2cjs.InteractiveCard; exports.InteractiveSkeleton = InteractiveSkeleton; exports.InvestorUpdateCard = _chunkNCXHTQH2cjs.InvestorUpdateCard; exports.InvestorUpdateCardSkeleton = _chunkNCXHTQH2cjs.InvestorUpdateCardSkeleton; exports.JumpInIcon = _chunkZ4IBEIWDcjs.JumpInIcon; exports.KnowledgeBaseLinksManager = _chunkNCXHTQH2cjs.KnowledgeBaseLinksManager; exports.Label = _chunkNCXHTQH2cjs.Label; exports.LaptopIcon = _chunkZ4IBEIWDcjs.LaptopIcon; exports.LegalDocumentPage = LegalDocumentPage; exports.LinkedInIcon = _chunkZ4IBEIWDcjs.LinkedInIcon; exports.LinuxIcon = _chunkZ4IBEIWDcjs.LinuxIcon; exports.ListLoader = _chunkNCXHTQH2cjs.ListLoader; exports.ListPageContainer = _chunk6LK4VEXEcjs.ListPageContainer; exports.ListPageLayout = _chunkNCXHTQH2cjs.ListPageLayout; exports.ListSkeleton = ListSkeleton; exports.LivestormIcon = _chunkZ4IBEIWDcjs.LivestormIcon; exports.LoadError = _chunk6LK4VEXEcjs.LoadError; exports.LoadingProvider = _chunkNCXHTQH2cjs.LoadingProvider; exports.LogOutIcon = _chunkZ4IBEIWDcjs.LogOutIcon; exports.LogsIcon = _chunkZ4IBEIWDcjs.LogsIcon; exports.LowerTCOIcon = _chunkZ4IBEIWDcjs.LowerTCOIcon; exports.LucideCheckCircleIcon = _chunkNCXHTQH2cjs.CheckCircleIcon; exports.LucideXIcon = _chunkNCXHTQH2cjs.XIcon; exports.LumaIcon = _chunkZ4IBEIWDcjs.LumaIcon; exports.MESSAGE_ROLE = _chunkNCXHTQH2cjs.MESSAGE_ROLE; exports.MESSAGE_TYPE = _chunkNCXHTQH2cjs.MESSAGE_TYPE; exports.MSPDisplay = MSPDisplay; exports.MUX_IMAGE_ORIGIN = _chunk6LK4VEXEcjs.MUX_IMAGE_ORIGIN; exports.MUX_STREAM_ORIGIN = _chunk6LK4VEXEcjs.MUX_STREAM_ORIGIN; exports.MacOSIcon = _chunkZ4IBEIWDcjs.MacOSIcon; exports.MadeWithLove = MadeWithLove; exports.MarginCrisisIcon = _chunkZ4IBEIWDcjs.MarginCrisisIcon; exports.MarginReportSkeleton = MarginReportSkeleton; exports.MarkdownEditor = _chunkNCXHTQH2cjs.MarkdownEditor; exports.MediaCarousel = MediaCarousel; exports.MediaGalleryManager = _chunkNCXHTQH2cjs.MediaGalleryManager; exports.MediaSkeleton = MediaSkeleton; exports.MediaTypeSelector = _chunkNCXHTQH2cjs.MediaTypeSelector; exports.MenuIcon = _chunkZ4IBEIWDcjs.MenuIcon; exports.Menubar = _chunkNCXHTQH2cjs.Menubar; exports.MenubarCheckboxItem = _chunkNCXHTQH2cjs.MenubarCheckboxItem; exports.MenubarContent = _chunkNCXHTQH2cjs.MenubarContent; exports.MenubarGroup = _chunkNCXHTQH2cjs.MenubarGroup; exports.MenubarItem = _chunkNCXHTQH2cjs.MenubarItem; exports.MenubarLabel = _chunkNCXHTQH2cjs.MenubarLabel; exports.MenubarMenu = _chunkNCXHTQH2cjs.MenubarMenu; exports.MenubarPortal = _chunkNCXHTQH2cjs.MenubarPortal; exports.MenubarRadioGroup = _chunkNCXHTQH2cjs.MenubarRadioGroup; exports.MenubarRadioItem = _chunkNCXHTQH2cjs.MenubarRadioItem; exports.MenubarSeparator = _chunkNCXHTQH2cjs.MenubarSeparator; exports.MenubarShortcut = _chunkNCXHTQH2cjs.MenubarShortcut; exports.MenubarSub = _chunkNCXHTQH2cjs.MenubarSub; exports.MenubarSubContent = _chunkNCXHTQH2cjs.MenubarSubContent; exports.MenubarSubTrigger = _chunkNCXHTQH2cjs.MenubarSubTrigger; exports.MenubarTrigger = _chunkNCXHTQH2cjs.MenubarTrigger; exports.MessageCircleIcon = _chunkZ4IBEIWDcjs.MessageCircleIcon; exports.MessageSegmentAccumulator = _chunkNCXHTQH2cjs.MessageSegmentAccumulator; exports.MetricValue = MetricValue; exports.MiamiCyberGangLogo = _chunkZ4IBEIWDcjs.MiamiCyberGangLogo; exports.MiamiCyberGangLogoFaceOnly = _chunkZ4IBEIWDcjs.MiamiCyberGangLogoFaceOnly; exports.MicrosoftIcon = _chunkZ4IBEIWDcjs.MicrosoftIcon; exports.MingoChatHistory = _chunkNCXHTQH2cjs.MingoChatHistory; exports.MingoChatHistorySkeleton = _chunkNCXHTQH2cjs.MingoChatHistorySkeleton; exports.MingoIcon = _chunkZ4IBEIWDcjs.MingoIcon; exports.MingoOnboardingCard = _chunkNCXHTQH2cjs.MingoOnboardingCard; exports.MingoOnboardingCardSkeleton = _chunkNCXHTQH2cjs.MingoOnboardingCardSkeleton; exports.MingoOnboardingListSkeleton = _chunkNCXHTQH2cjs.MingoOnboardingListSkeleton; exports.MingoWelcome = _chunkNCXHTQH2cjs.MingoWelcome; exports.MinusCircleIcon = _chunkZ4IBEIWDcjs.MinusCircleIcon; exports.MinusIcon = _chunkNCXHTQH2cjs.MinusIcon; exports.MlgLogo = _chunkZ4IBEIWDcjs.MlgLogo; exports.MobileBurgerMenu = _chunkNCXHTQH2cjs.MobileBurgerMenu; exports.MobileNavPanel = _chunkNCXHTQH2cjs.MobileNavPanel; exports.Modal = _chunkNCXHTQH2cjs.Modal; exports.ModalContent = _chunkNCXHTQH2cjs.ModalContent; exports.ModalFooter = _chunkNCXHTQH2cjs.ModalFooter; exports.ModalHeader = _chunkNCXHTQH2cjs.ModalHeader; exports.ModalTitle = _chunkNCXHTQH2cjs.ModalTitle; exports.ModalV2 = _chunkNCXHTQH2cjs.Modal2; exports.ModalV2Content = _chunkNCXHTQH2cjs.ModalContent2; exports.ModalV2Footer = _chunkNCXHTQH2cjs.ModalFooter2; exports.ModalV2Header = _chunkNCXHTQH2cjs.ModalHeader2; exports.ModalV2Title = _chunkNCXHTQH2cjs.ModalTitle2; exports.ModelDisplay = _chunkNCXHTQH2cjs.ModelDisplay; exports.ModularHellIcon = _chunkZ4IBEIWDcjs.ModularHellIcon; exports.MoonIcon = _chunkZ4IBEIWDcjs.MoonIcon; exports.MoreAboutButton = _chunkNCXHTQH2cjs.MoreAboutButton; exports.MoreActionsMenu = _chunkNCXHTQH2cjs.MoreActionsMenu; exports.MspProfileFormSkeleton = MspProfileFormSkeleton; exports.NETWORK_CONFIG = _chunkNCXHTQH2cjs.NETWORK_CONFIG; exports.NEW_TAB_FEATURES = _chunk6LK4VEXEcjs.NEW_TAB_FEATURES; exports.NOCIcon = _chunkZ4IBEIWDcjs.NOCIcon; exports.NaturalLanguageIcon = _chunkZ4IBEIWDcjs.NaturalLanguageIcon; exports.NavLinkAnchorViaRuntime = _chunkNCXHTQH2cjs.NavLinkAnchorViaRuntime; exports.NavigationMenu = _chunkNCXHTQH2cjs.NavigationMenu; exports.NavigationMenuContent = _chunkNCXHTQH2cjs.NavigationMenuContent; exports.NavigationMenuIndicator = _chunkNCXHTQH2cjs.NavigationMenuIndicator; exports.NavigationMenuItem = _chunkNCXHTQH2cjs.NavigationMenuItem; exports.NavigationMenuLink = _chunkNCXHTQH2cjs.NavigationMenuLink; exports.NavigationMenuList = _chunkNCXHTQH2cjs.NavigationMenuList; exports.NavigationMenuTrigger = _chunkNCXHTQH2cjs.NavigationMenuTrigger; exports.NavigationMenuViewport = _chunkNCXHTQH2cjs.NavigationMenuViewport; exports.NavigationSidebar = _chunkNCXHTQH2cjs.NavigationSidebar; exports.NavigationSkeleton = NavigationSkeleton; exports.NetworkIcon = _chunkZ4IBEIWDcjs.NetworkIcon; exports.NotFoundError = _chunk6LK4VEXEcjs.NotFoundError; exports.NotificationDrawer = _chunkNCXHTQH2cjs.NotificationDrawer; exports.NotificationPopups = _chunkNCXHTQH2cjs.NotificationPopups; exports.NotificationTile = _chunkNCXHTQH2cjs.NotificationTile; exports.NotificationsProvider = _chunkNCXHTQH2cjs.NotificationsProvider; exports.NushellIcon = _chunkZ4IBEIWDcjs.NushellIcon; exports.OPENFRAME_PATHS = _chunkNCXHTQH2cjs.OPENFRAME_PATHS; exports.OPSIcon = _chunkZ4IBEIWDcjs.OPSIcon; exports.OSTypeBadge = _chunkNCXHTQH2cjs.OSTypeBadge; exports.OSTypeBadgeGroup = _chunkNCXHTQH2cjs.OSTypeBadgeGroup; exports.OSTypeIcon = _chunkNCXHTQH2cjs.OSTypeIcon; exports.OSTypeLabel = _chunkNCXHTQH2cjs.OSTypeLabel; exports.OWNER_TYPE = _chunkNCXHTQH2cjs.OWNER_TYPE; exports.OnboardingGuideCard = _chunk6LK4VEXEcjs.OnboardingGuideCard; exports.OnboardingGuideCardSkeleton = _chunk6LK4VEXEcjs.OnboardingGuideCardSkeleton; exports.OnboardingStepCard = _chunkNCXHTQH2cjs.OnboardingStepCard; exports.OnboardingWalkthrough = _chunkNCXHTQH2cjs.OnboardingWalkthrough; exports.OpenAiIcon = _chunkZ4IBEIWDcjs.OpenAiIcon; exports.OpenFrameLogo = _chunkZ4IBEIWDcjs.OpenFrameLogo; exports.OpenFrameText = _chunkZ4IBEIWDcjs.OpenFrameText; exports.OpenSourceIcon = _chunkZ4IBEIWDcjs.OpenSourceIcon; exports.OpenmspLogo = _chunkZ4IBEIWDcjs.OpenmspLogo; exports.OrganizationCard = _chunkNCXHTQH2cjs.OrganizationCard; exports.OrganizationCardSkeleton = OrganizationCardSkeleton; exports.OrganizationCardSkeletonGrid = OrganizationCardSkeletonGrid; exports.OrganizationIconSkeleton = OrganizationIconSkeleton; exports.OrganizationsIcon = _chunkZ4IBEIWDcjs.OrganizationsIcon; exports.PAGE_HEADING_CLASS = _chunkNCXHTQH2cjs.PAGE_HEADING_CLASS; exports.PRICING_STYLES = PRICING_STYLES; exports.PackageIcon = _chunkZ4IBEIWDcjs.PackageIcon; exports.PageActions = _chunk6LK4VEXEcjs.PageActions; exports.PageContainer = _chunk6LK4VEXEcjs.PageContainer; exports.PageError = _chunk6LK4VEXEcjs.PageError; exports.PageHeading = _chunkNCXHTQH2cjs.PageHeading; exports.PageLayout = _chunkNCXHTQH2cjs.PageLayout; exports.PageLoader = _chunkNCXHTQH2cjs.PageLoader; exports.PageShell = _chunk6LK4VEXEcjs.PageShell; exports.Pagination = _chunkNCXHTQH2cjs.Pagination; exports.PaginationContent = _chunkNCXHTQH2cjs.PaginationContent; exports.PaginationEllipsis = _chunkNCXHTQH2cjs.PaginationEllipsis; exports.PaginationItem = _chunkNCXHTQH2cjs.PaginationItem; exports.PaginationLink = _chunkNCXHTQH2cjs.PaginationLink; exports.PaginationNext = _chunkNCXHTQH2cjs.PaginationNext; exports.PaginationPrevious = _chunkNCXHTQH2cjs.PaginationPrevious; exports.ParagraphSkeleton = ParagraphSkeleton; exports.ParallaxImageShowcase = _chunkNCXHTQH2cjs.ParallaxImageShowcase; exports.PatchPolicyIcon = _chunkZ4IBEIWDcjs.PatchPolicyIcon; exports.PathsDisplay = _chunkNCXHTQH2cjs.PathsDisplay; exports.PersistentFilterControls = PersistentFilterControls; exports.PersistentMobileDropdown = PersistentMobileDropdown; exports.PersistentPagination = PersistentPagination; exports.PersistentPaginationWrapper = PersistentPaginationWrapper; exports.PersistentSearchContainer = PersistentSearchContainer; exports.PersistentSidebar = PersistentSidebar; exports.PhoneInput = _chunkNCXHTQH2cjs.PhoneInput; exports.PilotIcon = _chunkZ4IBEIWDcjs.PilotIcon; exports.PlatformBadge = _chunkNCXHTQH2cjs.PlatformBadge; exports.PlatformFilterComponent = _chunkNCXHTQH2cjs.PlatformFilterComponent; exports.PlatformSkeletonContainer = PlatformSkeletonContainer; exports.PlusCircleIcon = _chunkZ4IBEIWDcjs.PlusCircleIcon; exports.PodbeanIcon = _chunkZ4IBEIWDcjs.PodbeanIcon; exports.PoliciesIcon = _chunkZ4IBEIWDcjs.PoliciesIcon; exports.PolicyConfigurationPanel = _chunkNCXHTQH2cjs.PolicyConfigurationPanel; exports.PowerShellIcon = _chunkZ4IBEIWDcjs.PowerShellIcon; exports.PricingDisplay = PricingDisplay; exports.PricingSkeleton = PricingSkeleton; exports.ProductReleaseCard = _chunkNCXHTQH2cjs.ProductReleaseCard; exports.ProductReleaseCardSkeleton = _chunkNCXHTQH2cjs.ProductReleaseCardSkeleton; exports.ProductReleasesView = ProductReleasesView; exports.ProfileLoadingSkeleton = ProfileLoadingSkeleton; exports.ProfileSkeleton = ProfileSkeleton; exports.ProgramCard = _chunkNCXHTQH2cjs.ProgramCard; exports.ProgramCardSkeleton = _chunkNCXHTQH2cjs.ProgramCardSkeleton; exports.Progress = _chunkNCXHTQH2cjs.Progress; exports.ProgressBar = _chunkNCXHTQH2cjs.ProgressBar; exports.ProgressiveSkeleton = ProgressiveSkeleton; exports.ProviderButton = _chunkNCXHTQH2cjs.ProviderButton; exports.PushButtonSelector = _chunkNCXHTQH2cjs.PushButtonSelector; exports.PythonIcon = _chunkZ4IBEIWDcjs.PythonIcon; exports.QueriesIcon = _chunkZ4IBEIWDcjs.QueriesIcon; exports.QueryReportTable = _chunkNCXHTQH2cjs.QueryReportTable; exports.QueryReportTableHeader = _chunkNCXHTQH2cjs.QueryReportTableHeader; exports.QueryReportTableRow = _chunkNCXHTQH2cjs.QueryReportTableRow; exports.QueryReportTableSkeleton = _chunkNCXHTQH2cjs.QueryReportTableSkeleton; exports.RATIO_DISPLAY_GRID_CLASS = _chunk6LK4VEXEcjs.RATIO_DISPLAY_GRID_CLASS; exports.RATIO_GRID_CLASS = _chunk6LK4VEXEcjs.RATIO_GRID_CLASS; exports.ROW_HEIGHT_DESKTOP = _chunkNCXHTQH2cjs.ROW_HEIGHT_DESKTOP; exports.ROW_HEIGHT_MOBILE = _chunkNCXHTQH2cjs.ROW_HEIGHT_MOBILE; exports.RadioGroup = _chunkNCXHTQH2cjs.RadioGroup; exports.RadioGroupBlock = _chunkNCXHTQH2cjs.RadioGroupBlock; exports.RadioGroupItem = _chunkNCXHTQH2cjs.RadioGroupItem; exports.RapidInnovationIcon = _chunkZ4IBEIWDcjs.RapidInnovationIcon; exports.RatioTabs = _chunk6LK4VEXEcjs.RatioTabs; exports.ReclaimProfitsIcon = _chunkZ4IBEIWDcjs.ReclaimProfitsIcon; exports.RedditIcon = _chunkZ4IBEIWDcjs.RedditIcon; exports.RelatedContentSection = _chunkUXDWRC5Ycjs.RelatedContentSection; exports.ReleaseChangelogSection = _chunkNCXHTQH2cjs.ReleaseChangelogSection; exports.ReleaseDetailPage = ReleaseDetailPage; exports.ReleaseDetailSkeleton = ReleaseDetailSkeleton; exports.ReleaseMediaManager = _chunkNCXHTQH2cjs.ReleaseMediaManager; exports.RemoteControlIcon = _chunkZ4IBEIWDcjs.RemoteControlIcon; exports.RenameChatModal = _chunkNCXHTQH2cjs.RenameChatModal; exports.ResponsiveIconsBlock = ResponsiveIconsBlock; exports.ResultBlock = _chunkNCXHTQH2cjs.ResultBlock; exports.ResultsCount = ResultsCount; exports.ResultsHeaderSkeleton = ResultsHeaderSkeleton; exports.RoadmapCard = _chunkNCXHTQH2cjs.RoadmapCard; exports.RoadmapCardSkeleton = _chunkNCXHTQH2cjs.RoadmapCardSkeleton; exports.RoadmapGrid = RoadmapGrid; exports.RoadmapGridSkeleton = RoadmapGridSkeleton; exports.RoadmapView = RoadmapView; exports.RoadmapVoteButton = _chunkNCXHTQH2cjs.RoadmapVoteButton; exports.SCROLL_ANCHOR = _chunkNCXHTQH2cjs.SCROLL_ANCHOR; exports.SCROLL_ANCHOR_WIRE_KEY = _chunkNCXHTQH2cjs.SCROLL_ANCHOR_WIRE_KEY; exports.SEOEditorPreview = _chunkNCXHTQH2cjs.SEOEditorPreview; exports.SOCIcon = _chunkZ4IBEIWDcjs.SOCIcon; exports.SOURCE_ICON_NAMES = _chunk6LK4VEXEcjs.SOURCE_ICON_NAMES; exports.SOURCE_LABELS_BY_TABLE = _chunk6LK4VEXEcjs.SOURCE_LABELS_BY_TABLE; exports.SSOConfigurationIcon = _chunkZ4IBEIWDcjs.SSOConfigurationIcon; exports.SYNTHETIC_REALTIME_ID_PREFIXES = _chunkNCXHTQH2cjs.SYNTHETIC_REALTIME_ID_PREFIXES; exports.ScriptArguments = _chunkNCXHTQH2cjs.ScriptArguments; exports.ScriptGenerationIcon = _chunkZ4IBEIWDcjs.ScriptGenerationIcon; exports.ScriptIcon = _chunkZ4IBEIWDcjs.ScriptIcon; exports.ScriptInfoSection = _chunkNCXHTQH2cjs.ScriptInfoSection; exports.SearchContainerSkeleton = SearchContainerSkeleton; exports.SearchIcon = _chunkZ4IBEIWDcjs.SearchIcon; exports.SearchInput = _chunk6LK4VEXEcjs.SearchInput; exports.SectionSelector = _chunkNCXHTQH2cjs.SectionSelector; exports.Select = _chunkNCXHTQH2cjs.Select; exports.SelectButton = _chunkNCXHTQH2cjs.SelectButton; exports.SelectContent = _chunkNCXHTQH2cjs.SelectContent; exports.SelectGroup = _chunkNCXHTQH2cjs.SelectGroup; exports.SelectItem = _chunkNCXHTQH2cjs.SelectItem; exports.SelectLabel = _chunkNCXHTQH2cjs.SelectLabel; exports.SelectScrollDownButton = _chunkNCXHTQH2cjs.SelectScrollDownButton; exports.SelectScrollUpButton = _chunkNCXHTQH2cjs.SelectScrollUpButton; exports.SelectSeparator = _chunkNCXHTQH2cjs.SelectSeparator; exports.SelectTrigger = _chunkNCXHTQH2cjs.SelectTrigger; exports.SelectValue = _chunkNCXHTQH2cjs.SelectValue; exports.SelectionSourceBadge = SelectionSourceBadge; exports.SendIcon = _chunkZ4IBEIWDcjs.SendIcon; exports.Separator = _chunkNCXHTQH2cjs.Separator; exports.ServerIcon = _chunkZ4IBEIWDcjs.ServerIcon; exports.ServiceCard = _chunkNCXHTQH2cjs.ServiceCard; exports.SettingsIcon = _chunkZ4IBEIWDcjs.SettingsIcon; exports.ShapeCircleDashIcon = _chunkZ4IBEIWDcjs.ShapeCircleDashIcon; exports.Sheet = _chunkNCXHTQH2cjs.Sheet; exports.SheetClose = _chunkNCXHTQH2cjs.SheetClose; exports.SheetContent = _chunkNCXHTQH2cjs.SheetContent; exports.SheetDescription = _chunkNCXHTQH2cjs.SheetDescription; exports.SheetFooter = _chunkNCXHTQH2cjs.SheetFooter; exports.SheetHeader = _chunkNCXHTQH2cjs.SheetHeader; exports.SheetOverlay = _chunkNCXHTQH2cjs.SheetOverlay; exports.SheetPortal = _chunkNCXHTQH2cjs.SheetPortal; exports.SheetTitle = _chunkNCXHTQH2cjs.SheetTitle; exports.SheetTrigger = _chunkNCXHTQH2cjs.SheetTrigger; exports.ShellIcon = _chunkZ4IBEIWDcjs.ShellIcon; exports.ShellTypeBadge = _chunkNCXHTQH2cjs.ShellTypeBadge; exports.ShieldCheckIcon = _chunkZ4IBEIWDcjs.ShieldCheckIcon; exports.ShieldIcon = _chunkZ4IBEIWDcjs.ShieldIcon; exports.ShieldKeyIcon = _chunkZ4IBEIWDcjs.ShieldKeyIcon; exports.ShieldLockIcon = _chunkZ4IBEIWDcjs.ShieldLockIcon; exports.SimpleMarkdownRenderer = _chunk6LK4VEXEcjs.SimpleMarkdownRenderer; exports.Skeleton = _chunk6JINAOI7cjs.Skeleton; exports.SkeletonButton = _chunk6JINAOI7cjs.SkeletonButton; exports.SkeletonCard = _chunk6JINAOI7cjs.SkeletonCard; exports.SkeletonGrid = _chunk6JINAOI7cjs.SkeletonGrid; exports.SkeletonHeading = _chunk6JINAOI7cjs.SkeletonHeading; exports.SkeletonList = _chunk6JINAOI7cjs.SkeletonList; exports.SkeletonNavigation = _chunk6JINAOI7cjs.SkeletonNavigation; exports.SkeletonPresets = SkeletonPresets; exports.SkeletonText = _chunk6JINAOI7cjs.SkeletonText; exports.SlackCommunitySkeleton = SlackCommunitySkeleton; exports.SlackIcon = _chunkZ4IBEIWDcjs.SlackIcon; exports.SlackMessageCard = _chunkNCXHTQH2cjs.SlackMessageCard; exports.SlackMessageCardSkeleton = _chunkNCXHTQH2cjs.SlackMessageCardSkeleton; exports.SlashCommandSuggestions = _chunkNCXHTQH2cjs.SlashCommandSuggestions; exports.Slider = _chunkNCXHTQH2cjs.Slider; exports.SlidersIcon = _chunkZ4IBEIWDcjs.SlidersIcon; exports.SlidingSidebar = _chunkNCXHTQH2cjs.SlidingSidebar; exports.SmartEscalationIcon = _chunkZ4IBEIWDcjs.SmartEscalationIcon; exports.SocialIconRow = SocialIconRow; exports.SocialLinksManager = _chunkNCXHTQH2cjs.SocialLinksManager; exports.SoftwareInfo = _chunkNCXHTQH2cjs.SoftwareInfo; exports.SoftwareSourceBadge = _chunkNCXHTQH2cjs.SoftwareSourceBadge; exports.SourceActionButton = _chunkNCXHTQH2cjs.SourceActionButton; exports.SparklesIcon = _chunkZ4IBEIWDcjs.SparklesIcon; exports.SplitButton = _chunkTU26IZPOcjs.SplitButton; exports.SquareAvatar = _chunk6LK4VEXEcjs.SquareAvatar; exports.StartWithOpenFrameButton = _chunkNCXHTQH2cjs.StartWithOpenFrameButton; exports.StatsSectionSkeleton = StatsSectionSkeleton; exports.StatusBadge = _chunk6LK4VEXEcjs.StatusBadge; exports.StatusFilterComponent = _chunkNCXHTQH2cjs.StatusFilterComponent; exports.StatusIndicator = _chunkNCXHTQH2cjs.StatusIndicator; exports.StatusUpdatesIcon = _chunkZ4IBEIWDcjs.StatusUpdatesIcon; exports.StickySectionNav = _chunkNCXHTQH2cjs.StickySectionNav; exports.SunIcon = _chunkZ4IBEIWDcjs.SunIcon; exports.Switch = _chunkNCXHTQH2cjs.Switch; exports.THEME_ATTRIBUTE = _chunkNCXHTQH2cjs.THEME_ATTRIBUTE; exports.THEME_STORAGE_KEY = _chunkNCXHTQH2cjs.THEME_STORAGE_KEY; exports.TICKET_STATUS_COLOR_PRESETS = _chunkNCXHTQH2cjs.TICKET_STATUS_COLOR_PRESETS; exports.TabContent = _chunkNCXHTQH2cjs.TabContent; exports.TabNavigation = _chunkNCXHTQH2cjs.TabNavigation; exports.TabSelector = _chunkNCXHTQH2cjs.TabSelector; exports.Table = _chunkNCXHTQH2cjs.Table; exports.TableCardSkeleton = _chunkNCXHTQH2cjs.TableCardSkeleton; exports.TableCell = _chunkNCXHTQH2cjs.TableCell; exports.TableDescriptionCell = _chunkNCXHTQH2cjs.TableDescriptionCell; exports.TableEmptyState = _chunkNCXHTQH2cjs.TableEmptyState; exports.TableHeader = _chunkNCXHTQH2cjs.TableHeader; exports.TableRow = _chunkNCXHTQH2cjs.TableRow; exports.TableSkeleton = TableSkeleton; exports.TableTimestampCell = _chunkNCXHTQH2cjs.TableTimestampCell; exports.TableViewIcon = _chunkZ4IBEIWDcjs.TableViewIcon; exports.Tabs = _chunk6LK4VEXEcjs.Tabs; exports.TabsContent = _chunk6LK4VEXEcjs.TabsContent; exports.TabsList = _chunk6LK4VEXEcjs.TabsList; exports.TabsTrigger = _chunk6LK4VEXEcjs.TabsTrigger; exports.Tag = _chunk6LK4VEXEcjs.Tag; exports.TagKeyValueFilter = _chunkNCXHTQH2cjs.TagKeyValueFilter; exports.TagSearchInput = _chunkNCXHTQH2cjs.TagSearchInput; exports.TagsInput = _chunkNCXHTQH2cjs.TagsInput; exports.TagsManager = _chunkNCXHTQH2cjs.TagsManager; exports.TagsSelector = _chunkNCXHTQH2cjs.TagsSelector; exports.TaskTypeIcon = _chunkNCXHTQH2cjs.TaskTypeIcon; exports.TelegramIcon = _chunkZ4IBEIWDcjs.TelegramIcon; exports.TextSkeleton = TextSkeleton; exports.Textarea = _chunkNCXHTQH2cjs.Textarea; exports.ThemeProvider = _chunkNCXHTQH2cjs.ThemeProvider; exports.ThinkingDisplay = _chunkNCXHTQH2cjs.ThinkingDisplay; exports.ThumbsDownIcon = _chunkZ4IBEIWDcjs.ThumbsDownIcon; exports.ThumbsUpIcon = _chunkZ4IBEIWDcjs.ThumbsUpIcon; exports.TicketAttachmentsList = _chunkNCXHTQH2cjs.TicketAttachmentsList; exports.TicketCard = _chunkNCXHTQH2cjs.TicketCard; exports.TicketCardSkeleton = _chunkNCXHTQH2cjs.TicketCardSkeleton; exports.TicketDetailSection = _chunkNCXHTQH2cjs.TicketDetailSection; exports.TicketInfoSection = _chunkNCXHTQH2cjs.TicketInfoSection; exports.TicketNoteCard = _chunkNCXHTQH2cjs.TicketNoteCard; exports.TicketNotesSection = _chunkNCXHTQH2cjs.TicketNotesSection; exports.TicketStatusConfigList = _chunkNCXHTQH2cjs.TicketStatusConfigList; exports.TicketStatusConfigRow = _chunkNCXHTQH2cjs.TicketStatusConfigRow; exports.TicketStatusTag = _chunkNCXHTQH2cjs.TicketStatusTag; exports.TimelineSkeleton = TimelineSkeleton; exports.TitleBlock = _chunkNCXHTQH2cjs.TitleBlock; exports.TitleContentBlock = _chunkNCXHTQH2cjs.TitleContentBlock; exports.ToastCard = _chunkELF4OOHCcjs.ToastCard; exports.Toaster = _chunkELF4OOHCcjs.Toaster; exports.Toggle = _chunkNCXHTQH2cjs.Toggle; exports.ToggleGroup = _chunkNCXHTQH2cjs.ToggleGroup; exports.ToggleGroupItem = _chunkNCXHTQH2cjs.ToggleGroupItem; exports.ToolBadge = _chunkNCXHTQH2cjs.ToolBadge; exports.ToolExecutionDisplay = _chunkNCXHTQH2cjs.ToolExecutionDisplay; exports.Tooltip = _chunkNCXHTQH2cjs.Tooltip; exports.TooltipContent = _chunkNCXHTQH2cjs.TooltipContent; exports.TooltipProvider = _chunkNCXHTQH2cjs.TooltipProvider; exports.TooltipTrigger = _chunkNCXHTQH2cjs.TooltipTrigger; exports.TranscribeAndSummarizeCombinedSection = _chunkNCXHTQH2cjs.TranscribeAndSummarizeCombinedSection; exports.TranscribeSummarizeSection = _chunkNCXHTQH2cjs.TranscribeSummarizeSection; exports.TranscriptSummaryEditor = _chunkNCXHTQH2cjs.TranscriptSummaryEditor; exports.TransparentTrustedIcon = _chunkZ4IBEIWDcjs.TransparentTrustedIcon; exports.TruncateText = _chunkNCXHTQH2cjs.TruncateText; exports.TrustpilotIcon = _chunkZ4IBEIWDcjs.TrustpilotIcon; exports.TwoColumnLayoutSkeleton = TwoColumnLayoutSkeleton; exports.UnarchiveChatModal = _chunkNCXHTQH2cjs.UnarchiveChatModal; exports.UnifiedPagination = _chunkPDKBCCCDcjs.UnifiedPagination; exports.UnifiedSkeleton = UnifiedSkeleton; exports.UserDisplay = UserDisplay; exports.UserIcon = _chunkZ4IBEIWDcjs.UserIcon; exports.UsersGridSkeleton = UsersGridSkeleton; exports.UsersGroupIcon = _chunkZ4IBEIWDcjs.UsersGroupIcon; exports.UsersIcon = _chunkZ4IBEIWDcjs.UsersIcon; exports.VendorDetailLayoutSkeleton = VendorDetailLayoutSkeleton; exports.VendorDirectoryIcon = _chunkZ4IBEIWDcjs.VendorDirectoryIcon; exports.VendorDisplayButton = VendorDisplayButton; exports.VendorGridSkeleton = VendorGridSkeleton; exports.VendorIcon = VendorIcon; exports.VendorPageSkeleton = VendorPageSkeleton; exports.VendorShowcaseMainIcon = _chunkZ4IBEIWDcjs.VendorShowcaseMainIcon; exports.VendorTag = VendorTag; exports.VendorsIcon = _chunkZ4IBEIWDcjs.VendorsIcon; exports.Video = _chunk6LK4VEXEcjs.Video; exports.VideoBiteCard = _chunk6LK4VEXEcjs.VideoBiteCard; exports.VideoBitesDisplay = _chunk6LK4VEXEcjs.VideoBitesDisplay; exports.VideoClipsSection = _chunkNCXHTQH2cjs.VideoClipsSection; exports.VideoSourceSelector = _chunkNCXHTQH2cjs.VideoSourceSelector; exports.ViewToggle = _chunkNCXHTQH2cjs.ViewToggle; exports.WaitlistForm = _chunkNCXHTQH2cjs.WaitlistForm; exports.WhatsAppIcon = _chunkZ4IBEIWDcjs.WhatsAppIcon; exports.WindowsIcon = _chunkZ4IBEIWDcjs.WindowsIcon; exports.WizardLayoutSkeleton = WizardLayoutSkeleton; exports.XCircleIcon = _chunkNCXHTQH2cjs.XCircleIcon; exports.XLogo = _chunkZ4IBEIWDcjs.XLogo; exports.YesNoDisplay = YesNoDisplay; exports.YouTubeIcon = _chunkZ4IBEIWDcjs.YouTubeIcon; exports.alignJustify = _chunkNCXHTQH2cjs.alignJustify; exports.applyProxyAuth = _chunkNCXHTQH2cjs.applyProxyAuth; exports.badgeVariants = _chunkNCXHTQH2cjs.badgeVariants; exports.blogFilterConfig = blogFilterConfig; exports.buildAnchorProps = _chunk6LK4VEXEcjs.buildAnchorProps; exports.buildAutoContinuationDirective = _chunkNCXHTQH2cjs.buildAutoContinuationDirective; exports.buildChatAttachmentViewUrl = _chunkNCXHTQH2cjs.buildChatAttachmentViewUrl; exports.buildChatRefKey = _chunkNCXHTQH2cjs.buildChatRefKey; exports.buildDiscussAddendum = _chunkNCXHTQH2cjs.buildDiscussAddendum; exports.buildNatsWsUrl = _chunkNCXHTQH2cjs.buildNatsWsUrl; exports.buildProductReleaseCardProps = _chunkNCXHTQH2cjs.buildProductReleaseCardProps; exports.buttonVariants = _chunkTU26IZPOcjs.buttonVariants; exports.chatAuthedFetch = _chunkNCXHTQH2cjs.embedAuthedFetch; exports.chatChipClass = _chunkNCXHTQH2cjs.chatChipClass; exports.clearChatProxyAuth = _chunkNCXHTQH2cjs.clearEmbedProxyAuth; exports.clickupTaskUrl = _chunkNCXHTQH2cjs.clickupTaskUrl; exports.columnFromTicketStatus = _chunkNCXHTQH2cjs.columnFromTicketStatus; exports.computeHistoryPrepend = _chunkNCXHTQH2cjs.computeHistoryPrepend; exports.computeIsNewTab = _chunk6LK4VEXEcjs.computeIsNewTab; exports.createColumnHelper = _chunkNCXHTQH2cjs.createColumnHelper; exports.createMessageSegmentAccumulator = _chunkNCXHTQH2cjs.createMessageSegmentAccumulator; exports.decideNewTab = _chunk6LK4VEXEcjs.decideNewTab; exports.defaultBuildProductReleaseCardProps = _chunkNCXHTQH2cjs.defaultBuildProductReleaseCardProps; exports.defaultTableIdForDocumentType = _chunk6LK4VEXEcjs.defaultTableIdForDocumentType; exports.deriveColumns = _chunkNCXHTQH2cjs.deriveColumns; exports.detectAspectRatio = _chunk6LK4VEXEcjs.detectAspectRatio; exports.dotColorByVariant = _chunkELF4OOHCcjs.dotColorByVariant; exports.escapeMarkdownInline = _chunkNCXHTQH2cjs.escapeMarkdownInline; exports.evaluateFeatureValue = evaluateFeatureValue; exports.executeNavigation = _chunkNCXHTQH2cjs.executeNavigation; exports.executeNavigationImperative = _chunkNCXHTQH2cjs.executeNavigationImperative; exports.exportToCSV = _chunkNCXHTQH2cjs.exportToCSV; exports.extractEntityIdFilter = _chunkNCXHTQH2cjs.extractEntityIdFilter; exports.extractErrorMessages = _chunkNCXHTQH2cjs.extractErrorMessages; exports.extractIncompleteMessageState = _chunkNCXHTQH2cjs.extractIncompleteMessageState; exports.extractTextFromChunk = _chunkNCXHTQH2cjs.extractTextFromChunk; exports.extractYouTubeId = _chunk6LK4VEXEcjs.extractYouTubeId; exports.fetchSlashCommands = _chunkNCXHTQH2cjs.fetchSlashCommands; exports.flattenAssistantContent = _chunkNCXHTQH2cjs.flattenAssistantContent; exports.flattenMessagePagesChronological = _chunkNCXHTQH2cjs.flattenMessagePagesChronological; exports.flexRender = _chunkNCXHTQH2cjs.flexRender; exports.formatChatAttachmentMarkdownForBubble = _chunkNCXHTQH2cjs.formatChatAttachmentMarkdownForBubble; exports.formatInvestorUpdatePeriod = _chunkNCXHTQH2cjs.formatInvestorUpdatePeriod; exports.formatPricingForDisplay = formatPricingForDisplay; exports.formatRelativePath = _chunkLZL6P7SNcjs.formatRelativePath; exports.formatSingularLookupInvocation = _chunkNCXHTQH2cjs.formatSingularLookupInvocation; exports.getApprovalMeta = _chunkNCXHTQH2cjs.getApprovalMeta; exports.getCaptionsUrl = _chunk6LK4VEXEcjs.getCaptionsUrl; exports.getChatProxyAuth = _chunkNCXHTQH2cjs.getEmbedProxyAuth; exports.getCommandText = _chunkNCXHTQH2cjs.getCommandText; exports.getCoreRowModel = _chunkNCXHTQH2cjs.getCoreRowModel; exports.getDeviceTypeIcon = _chunkZ4IBEIWDcjs.getDeviceTypeIcon; exports.getDynamicIcon = _chunk6LK4VEXEcjs.getDynamicIcon; exports.getExpandedRowModel = _chunkNCXHTQH2cjs.getExpandedRowModel; exports.getFacetedRowModel = _chunkNCXHTQH2cjs.getFacetedRowModel; exports.getFacetedUniqueValues = _chunkNCXHTQH2cjs.getFacetedUniqueValues; exports.getFilteredRowModel = _chunkNCXHTQH2cjs.getFilteredRowModel; exports.getGroupedRowModel = _chunkNCXHTQH2cjs.getGroupedRowModel; exports.getHideClasses = _chunkNCXHTQH2cjs.getHideClasses; exports.getIconComponent = _chunk6LK4VEXEcjs.getIconComponent; exports.getOpenFramePaths = _chunkNCXHTQH2cjs.getOpenFramePaths; exports.getPaginationRowModel = _chunkNCXHTQH2cjs.getPaginationRowModel; exports.getPersistedProxyEmail = _chunkNCXHTQH2cjs.getPersistedProxyEmail; exports.getSortedRowModel = _chunkNCXHTQH2cjs.getSortedRowModel; exports.getSourceIconName = _chunk6LK4VEXEcjs.getSourceIconName; exports.getSourceLabel = _chunk6LK4VEXEcjs.getSourceLabel; exports.getStatusColorScheme = _chunkNCXHTQH2cjs.getStatusColorScheme; exports.getTabById = _chunkNCXHTQH2cjs.getTabById; exports.getTabComponent = _chunkNCXHTQH2cjs.getTabComponent; exports.getTaskTypeLabel = _chunkNCXHTQH2cjs.getTaskTypeLabel; exports.getTicketStatusConfig = _chunkNCXHTQH2cjs.getTicketStatusConfig; exports.getTicketStatusTag = _chunkNCXHTQH2cjs.getTicketStatusTag; exports.groupByAspectRatio = _chunk6LK4VEXEcjs.groupByAspectRatio; exports.groupTicketsByStatus = _chunkNCXHTQH2cjs.groupTicketsByStatus; exports.handleChatNavClick = _chunkNCXHTQH2cjs.handleChatNavClick; exports.isApprovalNotification = _chunkNCXHTQH2cjs.isApprovalNotification; exports.isControlChunk = _chunkNCXHTQH2cjs.isControlChunk; exports.isCrossOriginUrl = _chunk6LK4VEXEcjs.isCrossOriginUrl; exports.isErrorChunk = _chunkNCXHTQH2cjs.isErrorChunk; exports.isMetadataChunk = _chunkNCXHTQH2cjs.isMetadataChunk; exports.isModifierClick = _chunk6LK4VEXEcjs.isModifierClick; exports.isStructuredContent = _chunkNCXHTQH2cjs.isStructuredContent; exports.kindToCanonicalStatus = _chunkNCXHTQH2cjs.kindToCanonicalStatus; exports.mapDocSearchResults = _chunkLZL6P7SNcjs.mapDocSearchResults; exports.maxPersistedStreamSeq = _chunkNCXHTQH2cjs.maxPersistedStreamSeq; exports.mergeHistoryWithRealtime = _chunkNCXHTQH2cjs.mergeHistoryWithRealtime; exports.multiSelectFilterFn = _chunkNCXHTQH2cjs.multiSelectFilterFn; exports.navigationMenuTriggerStyle = _chunkNCXHTQH2cjs.navigationMenuTriggerStyle; exports.newTabAnchorAttrs = _chunk6LK4VEXEcjs.newTabAnchorAttrs; exports.normalizeContent = _chunkNCXHTQH2cjs.normalizeContent; exports.normalizeIconKey = _chunk6LK4VEXEcjs.normalizeIconKey; exports.parseChunkToAction = _chunkNCXHTQH2cjs.parseChunkToAction; exports.parseScrollAnchor = _chunkNCXHTQH2cjs.parseScrollAnchor; exports.parseWireCommandOverride = _chunkNCXHTQH2cjs.parseWireCommandOverride; exports.processHistoricalMessages = _chunkNCXHTQH2cjs.processHistoricalMessages; exports.processHistoricalMessagesWithErrors = _chunkNCXHTQH2cjs.processHistoricalMessagesWithErrors; exports.progressColorByVariant = _chunkELF4OOHCcjs.progressColorByVariant; exports.ratioToCategory = _chunk6LK4VEXEcjs.ratioToCategory; exports.remarkCardLinks = _chunkNCXHTQH2cjs.remarkCardLinks; exports.renderChatInlineEntityCard = _chunkNCXHTQH2cjs.renderChatInlineEntityCard; exports.renderSvgIcon = _chunkZ4IBEIWDcjs.renderSvgIcon; exports.resolveExternalNavigation = _chunk6LK4VEXEcjs.resolveExternalNavigation; exports.resolveSearchResultAction = _chunkLZL6P7SNcjs.resolveSearchResultAction; exports.resolveSourceIcon = _chunk6LK4VEXEcjs.resolveSourceIcon; exports.resolveSourceRowCTA = _chunk6LK4VEXEcjs.resolveSourceRowCTA; exports.resolveStatusTagProps = _chunkNCXHTQH2cjs.resolveStatusTagProps; exports.resolveTicketStatus = _chunkNCXHTQH2cjs.resolveTicketStatus; exports.safeHref = _chunk6LK4VEXEcjs.safeHref; exports.sanitizeTitleForChat = _chunkNCXHTQH2cjs.sanitizeTitleForChat; exports.setChatProxyAuth = _chunkNCXHTQH2cjs.setEmbedProxyAuth; exports.setRealAuthHook = setRealAuthHook; exports.showCommandApprovalToast = _chunkELF4OOHCcjs.showCommandApprovalToast; exports.showToast = _chunkELF4OOHCcjs.showToast; exports.statusBadgeVariants = _chunk6LK4VEXEcjs.statusBadgeVariants; exports.stripChatAttachmentMarkdown = _chunkNCXHTQH2cjs.stripChatAttachmentMarkdown; exports.stripSameOriginToPath = _chunk6LK4VEXEcjs.stripSameOriginToPath; exports.tagVariants = _chunk6LK4VEXEcjs.tagVariants; exports.tintOnDark = _chunkNCXHTQH2cjs.tintOnDark; exports.toggleVariants = _chunkNCXHTQH2cjs.toggleVariants; exports.transformEventToProgram = _chunkNCXHTQH2cjs.transformEventToProgram; exports.transformPodcastToProgram = _chunkNCXHTQH2cjs.transformPodcastToProgram; exports.transformWebinarToProgram = _chunkNCXHTQH2cjs.transformWebinarToProgram; exports.useAppLayoutDrawerContainer = _chunkNCXHTQH2cjs.useAppLayoutDrawerContainer; exports.useAuth = useAuth; exports.useBoardCollapse = _chunkNCXHTQH2cjs.useBoardCollapse; exports.useChat = _chunkNCXHTQH2cjs.useChat; exports.useChatAttachmentImageGallery = _chunkNCXHTQH2cjs.useChatAttachmentImageGallery; exports.useChatAttachments = _chunkNCXHTQH2cjs.useChatAttachments; exports.useChatCardItem = _chunkNCXHTQH2cjs.useChatCardItem; exports.useChatIdentity = _chunkNCXHTQH2cjs.useChatIdentity; exports.useChunkCatchup = _chunkNCXHTQH2cjs.useChunkCatchup; exports.useCloseOnNavigation = _chunkNCXHTQH2cjs.useCloseOnNavigation; exports.useCollapsible = _chunkNCXHTQH2cjs.useCollapsible; exports.useContentLoading = useContentLoading; exports.useDataTable = _chunkNCXHTQH2cjs.useDataTable; exports.useDataTableContext = _chunkNCXHTQH2cjs.useDataTableContext; exports.useDocSearch = _chunkLZL6P7SNcjs.useDocSearch; exports.useDynamicTheme = _chunkNCXHTQH2cjs.useDynamicTheme; exports.useEmbeddedChat = _chunkNCXHTQH2cjs.useSseChatAdapter; exports.useFiltersDropdown = _chunkNCXHTQH2cjs.useFiltersDropdown; exports.useJetStreamDialogSubscription = _chunkNCXHTQH2cjs.useJetStreamDialogSubscription; exports.useLegalDocs = useLegalDocs; exports.useLoading = _chunkNCXHTQH2cjs.useLoading; exports.useNatsChatAdapter = _chunkNCXHTQH2cjs.useNatsChatAdapter; exports.useNatsDialogSubscription = _chunkNCXHTQH2cjs.useNatsDialogSubscription; exports.useNotifications = _chunkNCXHTQH2cjs.useNotifications; exports.useOnboardingState = _chunkELF4OOHCcjs.useOnboardingState; exports.useOptionalNotifications = _chunkNCXHTQH2cjs.useOptionalNotifications; exports.usePageActionsBottomPadding = _chunk6LK4VEXEcjs.usePageActionsBottomPadding; exports.usePaginationLoading = usePaginationLoading; exports.useProxiedImageUrl = _chunkNCXHTQH2cjs.useProxiedImageUrl; exports.useRealtimeChunkProcessor = _chunkNCXHTQH2cjs.useRealtimeChunkProcessor; exports.useRoadmapVoting = useRoadmapVoting; exports.useSSE = _chunkNCXHTQH2cjs.useSSE; exports.useSectionNavigation = _chunkNCXHTQH2cjs.useSectionNavigation; exports.useSlashCommandRegistry = _chunkNCXHTQH2cjs.useSlashCommandRegistry; exports.useSlashCommands = _chunkNCXHTQH2cjs.useSlashCommands; exports.useSseChatAdapter = _chunkNCXHTQH2cjs.useSseChatAdapter; exports.useTheme = _chunkNCXHTQH2cjs.useTheme; exports.useThemeToggle = _chunkNCXHTQH2cjs.useThemeToggle; exports.useUnifiedChat = _chunkNCXHTQH2cjs.useUnifiedChat; exports.useUnifiedFiltering = useUnifiedFiltering; exports.useVideoOriginPreconnect = _chunk6LK4VEXEcjs.useVideoOriginPreconnect; exports.useVideoWarmup = _chunk6LK4VEXEcjs.useVideoWarmup; exports.usesCanonicalStatusStyle = _chunkNCXHTQH2cjs.usesCanonicalStatusStyle; exports.vendorFilterConfig = vendorFilterConfig;
|
|
7841
7841
|
//# sourceMappingURL=index.cjs.map
|
package/dist/components/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true});"use client";
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var _chunkUXDWRC5Ycjs = require('../../chunk-UXDWRC5Y.cjs');
|
|
5
5
|
require('../../chunk-T7AJBKZP.cjs');
|
|
6
6
|
require('../../chunk-NCXHTQH2.cjs');
|
|
7
7
|
require('../../chunk-ELF4OOHC.cjs');
|
|
@@ -25,5 +25,5 @@ require('../../chunk-XQFFGR6U.cjs');
|
|
|
25
25
|
require('../../chunk-VRHGVLSL.cjs');
|
|
26
26
|
|
|
27
27
|
|
|
28
|
-
exports.RelatedContentSection =
|
|
28
|
+
exports.RelatedContentSection = _chunkUXDWRC5Ycjs.RelatedContentSection;
|
|
29
29
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"related-content-section.d.ts","sourceRoot":"","sources":["../../../src/components/related-content/related-content-section.tsx"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAkB,MAAM,OAAO,CAAC;AAOvC,OAAO,KAAK,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAuBhF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAI5E;;kDAEkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,GAAG,CAAC,EAAE,qBAAqB,CAAC;IAC5B,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;CAC5D;AAED;;;;6EAI6E;AAC7E,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,EAAE,CAAC,SAAS,EAAE,mBAAmB,GAAG,IAAI,KAAK,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;CAChF;AACD,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAAC,aAAa,CAAC,qBAAqB,CAAC,CAAC;AAuB1E;;8DAE8D;AAC9D,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,QAAQ,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC7C,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,IAAI,CAAC,EAAE,SAAS,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;CAC5D;
|
|
1
|
+
{"version":3,"file":"related-content-section.d.ts","sourceRoot":"","sources":["../../../src/components/related-content/related-content-section.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -200,7 +200,6 @@ function CardForType({
|
|
|
200
200
|
}: {
|
|
201
201
|
type: string;
|
|
202
202
|
item: any;
|
|
203
|
-
contentRef: ContentRef;
|
|
204
203
|
size: CardSize;
|
|
205
204
|
href: string;
|
|
206
205
|
targetPlatform: string | null;
|
|
@@ -352,6 +351,7 @@ function ContentGroup({
|
|
|
352
351
|
LinkProvider,
|
|
353
352
|
extras,
|
|
354
353
|
adminCampaignCard,
|
|
354
|
+
heading,
|
|
355
355
|
}: {
|
|
356
356
|
type: string;
|
|
357
357
|
refs: ContentRef[];
|
|
@@ -361,6 +361,10 @@ function ContentGroup({
|
|
|
361
361
|
LinkProvider: CardLinkProvider;
|
|
362
362
|
extras?: ChatCardDispatchExtras;
|
|
363
363
|
adminCampaignCard?: AdminCampaignCardSlot;
|
|
364
|
+
/** Group heading, rendered INSIDE the group so a group that resolves to
|
|
365
|
+
* nothing (fetch miss / unsupported type / missing program config) drops
|
|
366
|
+
* its heading too — no orphaned titles. */
|
|
367
|
+
heading: React.ReactNode;
|
|
364
368
|
}) {
|
|
365
369
|
const { items, isLoading } = useGroupItems(type, refs, buildUrl);
|
|
366
370
|
const config = resolveGroupConfig(type);
|
|
@@ -374,10 +378,15 @@ function ContentGroup({
|
|
|
374
378
|
const skeletons = refs.map((r) => (
|
|
375
379
|
<div key={r.id}>{renderSkeletonForType(type, cardSize, adminCampaignCard)}</div>
|
|
376
380
|
));
|
|
377
|
-
return
|
|
378
|
-
<div className="space-y-4">
|
|
379
|
-
|
|
380
|
-
|
|
381
|
+
return (
|
|
382
|
+
<div className="space-y-4">
|
|
383
|
+
{heading}
|
|
384
|
+
{isListLayout ? (
|
|
385
|
+
<div className="space-y-4">{skeletons}</div>
|
|
386
|
+
) : (
|
|
387
|
+
<div className={gridClassFor(columns)}>{skeletons}</div>
|
|
388
|
+
)}
|
|
389
|
+
</div>
|
|
381
390
|
);
|
|
382
391
|
}
|
|
383
392
|
|
|
@@ -413,7 +422,6 @@ function ContentGroup({
|
|
|
413
422
|
<CardForType
|
|
414
423
|
type={type}
|
|
415
424
|
item={item}
|
|
416
|
-
contentRef={contentRef}
|
|
417
425
|
size={cardSize}
|
|
418
426
|
href={href}
|
|
419
427
|
targetPlatform={targetPlatform}
|
|
@@ -430,10 +438,15 @@ function ContentGroup({
|
|
|
430
438
|
|
|
431
439
|
if (cards.length === 0) return null;
|
|
432
440
|
|
|
433
|
-
return
|
|
434
|
-
<div className="space-y-4">
|
|
435
|
-
|
|
436
|
-
|
|
441
|
+
return (
|
|
442
|
+
<div className="space-y-4">
|
|
443
|
+
{heading}
|
|
444
|
+
{isListLayout ? (
|
|
445
|
+
<div className="space-y-4">{cards}</div>
|
|
446
|
+
) : (
|
|
447
|
+
<div className={gridClassFor(columns)}>{cards}</div>
|
|
448
|
+
)}
|
|
449
|
+
</div>
|
|
437
450
|
);
|
|
438
451
|
}
|
|
439
452
|
|
|
@@ -540,14 +553,15 @@ export function RelatedContentSection({
|
|
|
540
553
|
// even []) or when the entity scope is incomplete.
|
|
541
554
|
// `includeTypes: []` is an explicit "nothing participates" — skip the fetch
|
|
542
555
|
// entirely (an empty-string `types=` param would be dropped by the URL
|
|
543
|
-
// builder and read server-side as "all candidates").
|
|
556
|
+
// builder and read server-side as "all candidates") AND ignore SSR refs.
|
|
557
|
+
const suggestionsDisabled = includeTypes?.length === 0;
|
|
544
558
|
const suggestUrl =
|
|
545
559
|
contentRefs === undefined &&
|
|
546
560
|
entityType &&
|
|
547
561
|
entityId !== undefined &&
|
|
548
562
|
entityId !== null &&
|
|
549
563
|
entityId !== '' &&
|
|
550
|
-
|
|
564
|
+
!suggestionsDisabled
|
|
551
565
|
? buildSuggestionUrl('/api/related-content', {
|
|
552
566
|
apiBaseUrl,
|
|
553
567
|
entityType,
|
|
@@ -564,8 +578,11 @@ export function RelatedContentSection({
|
|
|
564
578
|
// and a fresh per-render object would loop setState under re-rendering
|
|
565
579
|
// parents (the latent FaqSection bug, fixed there in the same change).
|
|
566
580
|
const initialData = useMemo<RelatedContentResponse | undefined>(
|
|
567
|
-
|
|
568
|
-
|
|
581
|
+
// An explicitly disabled rail (includeTypes: []) must ignore SSR-hydrated
|
|
582
|
+
// refs too — otherwise useSelfFetch(null, {initialData}) keeps serving
|
|
583
|
+
// initialItems and the "nothing participates" contract silently breaks.
|
|
584
|
+
() => (!suggestionsDisabled && initialItems ? { refs: initialItems } : undefined),
|
|
585
|
+
[initialItems, suggestionsDisabled],
|
|
569
586
|
);
|
|
570
587
|
const { data } = useSelfFetch<RelatedContentResponse>(suggestUrl, { initialData });
|
|
571
588
|
|
|
@@ -603,9 +620,13 @@ export function RelatedContentSection({
|
|
|
603
620
|
// the shared alias canonicalizer (blog_post_existing ↔ blog_post).
|
|
604
621
|
let orderedTypes = orderContentRefTypes(Object.keys(grouped));
|
|
605
622
|
if (entityType) {
|
|
606
|
-
|
|
623
|
+
// Canonicalize BOTH sides — hosts pass registry vocab ('blog_post') but
|
|
624
|
+
// rail-vocab aliases ('blog_post_existing') are also legal inputs; a raw
|
|
625
|
+
// comparison would silently lose the same-type-first hoist for aliases.
|
|
626
|
+
const canonicalEntityType = canonicalContentRefType(entityType);
|
|
627
|
+
const sameType = orderedTypes.filter((t) => canonicalContentRefType(t) === canonicalEntityType);
|
|
607
628
|
if (sameType.length > 0) {
|
|
608
|
-
orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !==
|
|
629
|
+
orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !== canonicalEntityType)];
|
|
609
630
|
}
|
|
610
631
|
}
|
|
611
632
|
|
|
@@ -613,21 +634,22 @@ export function RelatedContentSection({
|
|
|
613
634
|
<div className="space-y-8">
|
|
614
635
|
<h2 className="text-2xl font-bold text-ods-text-primary">{title}</h2>
|
|
615
636
|
{orderedTypes.map((type) => (
|
|
616
|
-
<
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
637
|
+
<ContentGroup
|
|
638
|
+
key={type}
|
|
639
|
+
type={type}
|
|
640
|
+
refs={grouped[type]}
|
|
641
|
+
columns={columns}
|
|
642
|
+
buildUrl={effectiveBuildListUrl}
|
|
643
|
+
resolveHref={resolveHref}
|
|
644
|
+
LinkProvider={LinkProvider}
|
|
645
|
+
extras={extras}
|
|
646
|
+
adminCampaignCard={adminCampaignCard}
|
|
647
|
+
heading={
|
|
648
|
+
<h3 className="font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider">
|
|
649
|
+
{getContentRefLabelOrTitleCase(type)}
|
|
650
|
+
</h3>
|
|
651
|
+
}
|
|
652
|
+
/>
|
|
631
653
|
))}
|
|
632
654
|
</div>
|
|
633
655
|
);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-PDYT7T6K.cjs","../src/components/related-content/related-content-section.tsx"],"names":["buildListUrl"],"mappings":"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","file":"/home/runner/work/openframe-oss-lib/openframe-oss-lib/openframe-frontend-core/dist/chunk-PDYT7T6K.cjs","sourcesContent":[null,"\"use client\";\n\n/**\n * RelatedContentSection\n *\n * Renders content references grouped by type using the canonical card\n * components. MOVED from the hub (`components/shared/related-content-card.tsx`)\n * so any consuming app can embed it; the hub keeps a thin wrapper that\n * pre-binds its host-specific injections (nav hook, URL recomposition,\n * program configs, admin campaign card).\n *\n * THREE data modes (precedence top-down):\n * 1. CONTROLLED — `contentRefs` provided (even `[]`): render exactly those\n * refs, no suggestion fetch (the original investor-update behavior).\n * 2. SUGGESTION — `entityType` + `entityId` provided: self-fetch\n * `GET {apiBaseUrl}/api/related-content?entityType&entityId[&count][&excludeTypes]`\n * (the generic 5-tier engine's second web service). `minResults` maps to\n * `count`; absent → param not sent (server default applies). Each ref\n * carries a `reason` (data-only — never rendered, matching the\n * FaqSection/FaqWithReason precedent).\n * 3. SSR-HYDRATED suggestion — also pass `initialItems` (the server page\n * called the engine directly); the first client fetch is skipped per the\n * `useSelfFetch` initialData contract.\n *\n * Group layout (list vs grid) + card size (lg vs default) come from\n * `CONTENT_REF_GROUPS` in `../../utils/content-ref-groups` — single source of\n * truth, no per-type logic in this file. Skeletons come from\n * `renderSkeletonForType` so the placeholder height matches the loaded card\n * exactly (zero layout shift on resolve).\n *\n * One API call per content type via the shared list-URL builder\n * (`buildListUrl` — injectable; defaults to the lib's byte-parity-tested\n * builder prefixed with `apiBaseUrl`). Fetching uses `useSelfFetch` (plain\n * fetch, NO react-query) so third-party embedders need no QueryClientProvider;\n * cards are imported via DEEP module paths (not the chat barrel) so this\n * chunk never reaches `@tanstack/react-query`.\n *\n * LOCKSTEP NOTE: this file's per-type card/skeleton dispatch is the SIZED\n * sibling of the chat-side `CHAT_CARD_REGISTRY` (`../chat/entity-cards/\n * dispatch.tsx`), which renders compact `size='sm'` cards wired to the chat\n * runtime. Two dispatchers by design — when registering a new fetch-mode\n * content type, add it BOTH there and here (cards + skeleton + list URL).\n */\n\nimport React, { useMemo } from 'react';\nimport {\n CONTENT_REF_GROUPS,\n getContentRefLabelOrTitleCase,\n orderContentRefTypes,\n type ContentRefGroupConfig,\n} from '../../utils/content-ref-groups';\nimport type { ContentRef, ContentRefWithReason } from '../../types/content-ref';\nimport { useSelfFetch } from '../../hooks/use-self-fetch';\nimport { extractItems, extractItemId } from '../../utils/extract-items';\nimport { buildListUrl as libBuildListUrl, canonicalContentRefType } from '../../utils/list-url';\nimport { buildSuggestionUrl } from '../../utils/suggestion-url';\nimport { decideNewTab } from '../chat/utils/decide-new-tab';\n// DEEP card imports — NOT the `../chat` barrel (the barrel statically reaches\n// @tanstack/react-query via embeddable-chat + its hooks). Deep paths keep this\n// component's SOURCE graph react-query-free. Note: tsup's shared-chunk\n// splitting may still colocate the cards with chat hooks in one dist chunk\n// (react-query is a required peerDep, so resolution always succeeds) — the\n// guarantee that matters here is the RUNTIME one: nothing on this path ever\n// instantiates a QueryClient, so embedders need NO QueryClientProvider.\nimport { BlogCard, BlogCardSkeleton } from '../chat/entity-cards/blog-card';\nimport { CaseStudyCard, CaseStudyCardSkeleton } from '../chat/entity-cards/case-study-card';\nimport { CustomerInterviewCard, CustomerInterviewCardSkeleton } from '../chat/entity-cards/customer-interview-card';\nimport { ProductReleaseCard, ProductReleaseCardSkeleton } from '../chat/entity-cards/product-release-card';\nimport { buildProductReleaseCardProps } from '../chat/entity-cards/product-release-card-defaults';\nimport { ProgramCard, ProgramCardSkeleton } from '../chat/entity-cards/program-card';\nimport { InvestorUpdateCard, InvestorUpdateCardSkeleton } from '../chat/entity-cards/investor-update-card';\nimport { OnboardingGuideCard, OnboardingGuideCardSkeleton } from '../chat/entity-cards/onboarding-guide-card';\nimport { RoadmapCard, RoadmapCardSkeleton } from '../chat/entity-cards/roadmap-card';\n// Type-only — erased at build, no runtime dependency on the dispatch module.\nimport type { ChatCardDispatchExtras } from '../chat/entity-cards/dispatch';\n\ntype CardSize = 'lg' | 'default' | 'sm';\n\n/** Anchor prop bundle the per-card link surface receives — same shape the\n * hub's `useNavLink` returns and the chat dispatcher's anchor builders\n * produce. `null` = non-anchor mode (no URL). */\nexport interface CardLinkAnchorProps {\n href: string;\n target?: '_blank';\n rel?: 'noopener noreferrer';\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/** Render-prop component injection for the navigation decision — keeps hook\n * calls legal (hooks live INSIDE the injected component; `CardForType`\n * itself calls zero hooks). The hub injects a `useNavLink`-backed provider;\n * the default is hook-free (pure `decideNewTab`). MUST be defined at module\n * scope by hosts — an inline arrow would remount every card each render. */\nexport interface CardLinkProviderProps {\n href: string | null;\n targetPlatform: string | null;\n children: (linkProps: CardLinkAnchorProps | null) => React.ReactElement | null;\n}\nexport type CardLinkProvider = React.ComponentType<CardLinkProviderProps>;\n\n/** Default link provider for standalone embeds: relative/-same-origin hrefs\n * stay same-tab, cross-origin pops a new tab (pure `decideNewTab` with no\n * platform context — `currentSource: ''` falls through to the origin\n * check). No router integration, no hooks. */\nfunction DefaultLinkPropsProvider({ href, targetPlatform, children }: CardLinkProviderProps): React.ReactElement | null {\n if (!href) return children(null);\n const newTab = decideNewTab({ href, targetPlatform, currentSource: '' });\n return children(\n newTab\n ? { href, target: '_blank', rel: 'noopener noreferrer' }\n : { href },\n );\n}\n\n/** Default href resolution: trust the ref's stored url/targetPlatform as the\n * API composed them. The hub overrides this with its `buildContentURL`\n * re-composition so dev gets localhost and prod gets platform domains. */\nfunction defaultResolveHref(ref: ContentRef): { href: string | null; targetPlatform: string | null } {\n return { href: ref.url || null, targetPlatform: ref.targetPlatform ?? null };\n}\n\n/** Host-injected renderer pair for the admin-only `marketing_campaign` type.\n * Absent (every non-hub embed) → the type renders nothing (its list URL\n * hits `/api/admin`, unreachable outside the hub anyway). */\nexport interface AdminCampaignCardSlot {\n Card: React.ComponentType<{ campaign: any }>;\n Skeleton: React.ComponentType<{ size?: 'default' | 'sm' }>;\n}\n\n/**\n * Per-type skeleton dispatch — returns the SAME colocated skeleton the\n * resolved card renders, sized to match (zero layout shift on resolve).\n * The chat-side `CHAT_CARD_REGISTRY` already does this via\n * `entry.skeleton()`; this surface exposes the same discipline to the\n * related-content rail.\n */\nfunction renderSkeletonForType(\n type: string,\n size: CardSize,\n adminCampaignCard?: AdminCampaignCardSlot,\n): React.ReactNode {\n // Most card skeletons accept only `{default, sm}`. `'lg'` collapses to\n // `'default'`. ProductReleaseCardSkeleton uses lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n switch (type) {\n case 'blog_post_existing':\n return <BlogCardSkeleton size={legacySize} />;\n case 'case_study':\n return <CaseStudyCardSkeleton size={legacySize} />;\n case 'customer_interview':\n return <CustomerInterviewCardSkeleton size={legacySize} />;\n case 'product_release':\n return <ProductReleaseCardSkeleton size={size === 'sm' ? 'sm' : 'lg'} />;\n case 'podcast':\n case 'webinar':\n case 'event':\n return <ProgramCardSkeleton size={legacySize} />;\n case 'investor_update':\n return <InvestorUpdateCardSkeleton size={legacySize} />;\n case 'onboarding_guide':\n // The rich catalog variant (hero + author grid, clamped description) —\n // the step-numbered 'default' variant is for the guide detail page's\n // \"More in section\" rail, not this full-width row.\n return <OnboardingGuideCardSkeleton size={size === 'sm' ? 'sm' : 'catalog'} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Skeleton size={legacySize} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return <RoadmapCardSkeleton size={legacySize} />;\n default:\n return null;\n }\n}\n\n/**\n * Per-type card dispatch — renders the right card with the right size.\n * Sized cards (`'lg'` / `'default'`) are unique to this rail — the chat\n * dispatcher only renders `'sm'`, so we go directly through the per-type\n * cards here.\n *\n * PURE FUNCTION COMPONENT WITH ZERO HOOK CALLS: the placeholder comes from a\n * plain `extras.buildOgPlaceholderUrl` call (the chat `dispatch.tsx`\n * pattern) and the anchor-prop bundle arrives via the `LinkProvider`\n * render-prop from the parent — so per-card hook legality is owned by the\n * injected provider component, not by this switch.\n *\n * `href` comes from the host's `resolveHref(ref)` (hub: live\n * `buildContentURL` recomposition; default: the ref's stored url).\n */\nfunction CardForType({\n type,\n item,\n size,\n href,\n targetPlatform,\n linkProps,\n extras,\n adminCampaignCard,\n}: {\n type: string;\n item: any;\n contentRef: ContentRef;\n size: CardSize;\n href: string;\n targetPlatform: string | null;\n linkProps: CardLinkAnchorProps | null;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n}): React.ReactNode {\n // Most card variants accept only `{default, sm}`. `'lg'` collapses to\n // `'default'` for those. ProductReleaseCard uses its own lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n // OG placeholder URL — injected into the pure-presentation cards so they\n // render a branded fallback when the row's featured image is null. Plain\n // function call (NOT a hook). Title is the universal field across all card\n // item shapes used here.\n const placeholderUrl =\n extras?.buildOgPlaceholderUrl?.((item?.title as string | undefined) ?? '') ?? undefined;\n\n // Top-level target/rel for cards that take them as separate props\n // (BlogCard, CaseStudyCard, …). ProductReleaseCard takes the bundle as a\n // single `anchorProps={...}` and uses `linkProps` directly. When the host\n // didn't surface a URL, `linkProps` is null and the card stays in\n // non-anchor mode.\n const anchorAttrs: Pick<CardLinkAnchorProps, 'target' | 'rel'> = linkProps\n ? { target: linkProps.target, rel: linkProps.rel }\n : {};\n\n switch (type) {\n case 'blog_post_existing':\n return <BlogCard post={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'case_study':\n return <CaseStudyCard study={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'customer_interview':\n return <CustomerInterviewCard interview={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'product_release': {\n // Anchor-prop pattern: build product-release lg-variant props from the\n // shared `buildProductReleaseCardProps` so this rail and the /releases\n // catalog page render byte-identically. The card wraps in\n // `<a {...anchorProps}>` ONLY when `anchorProps.href` is set — pass\n // `undefined` (not an empty object) when href is empty so the card\n // stays in non-anchor mode without rendering a dead <a> tag.\n const releaseSize = size === 'sm' ? 'sm' : 'lg';\n const buildReleaseProps = extras?.buildProductReleaseCardProps ?? buildProductReleaseCardProps;\n const releaseProps = buildReleaseProps(item);\n return (\n <ProductReleaseCard\n size={releaseSize}\n title={item.title}\n summary={item.summary}\n version={item.version}\n {...releaseProps}\n anchorProps={linkProps ?? undefined}\n />\n );\n }\n case 'podcast':\n return extras?.programConfigs?.podcast\n ? <ProgramCard config={extras.programConfigs.podcast} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'webinar':\n return extras?.programConfigs?.webinar\n ? <ProgramCard config={extras.programConfigs.webinar} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'event':\n return extras?.programConfigs?.event\n ? <ProgramCard config={extras.programConfigs.event} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'investor_update':\n return <InvestorUpdateCard update={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'onboarding_guide':\n // Catalog variant (see skeleton note) — full-width rich card with a\n // line-clamped description instead of the step-numbered rail card.\n return <OnboardingGuideCard guide={item} size={size === 'sm' ? 'sm' : 'catalog'} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Card campaign={item} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return (\n <RoadmapCard\n item={item}\n href={href ?? ''}\n targetPlatform={targetPlatform}\n userVote={null}\n onVote={() => {}}\n size={legacySize}\n cardType={type as 'roadmap_item' | 'delivery_item' | 'internal_task'}\n {...anchorAttrs}\n />\n );\n default:\n return null;\n }\n}\n\n// =============================================================================\n// Fetch all items for a type in ONE server-sorted call, via the injectable\n// list-URL builder. `useSelfFetch` (URL = cache key) replaces the hub's old\n// react-query usage: `enabled` ≙ `url === null`, `!res.ok`/network error ≙\n// `error → items null → group renders nothing`. Accepted deltas vs\n// react-query: no retry/backoff, no focus refetch, no cross-mount cache.\n// =============================================================================\n\nfunction useGroupItems(\n type: string,\n refs: ContentRef[],\n buildUrl: (type: string, ids: string[]) => string | null,\n) {\n const ids = refs.map((r) => r.id);\n const url = ids.length > 0 ? buildUrl(type, ids) : null;\n const { data, isLoading } = useSelfFetch<unknown>(url);\n const items = data != null ? extractItems(data) : null;\n return { items, isLoading };\n}\n\n// =============================================================================\n// Per-group renderer — one API call, server-sorted, then render cards via the\n// dispatcher with per-type skeletons + per-type layout from CONTENT_REF_GROUPS.\n// =============================================================================\n\n/** Map columns prop → tailwind grid class. Only consulted for grid-layout\n * groups; list-layout groups stack vertically. */\nfunction gridClassFor(columns: 2 | 3): string {\n return columns === 3\n ? 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6'\n : 'grid grid-cols-1 sm:grid-cols-2 gap-6';\n}\n\n/** Resolve the group config for a type, falling back to a grid layout with\n * the default card size for unregistered types so the section still renders\n * rather than silently dropping them. The `label` field on the fallback is\n * intentionally a placeholder — the section heading goes through\n * `getContentRefLabelOrTitleCase(type)` instead so cross-surface labels\n * stay consistent between this rail and the investor-email builder. */\nfunction resolveGroupConfig(type: string): ContentRefGroupConfig {\n return CONTENT_REF_GROUPS[type] ?? {\n label: type,\n order: 999,\n layout: 'grid',\n gridSize: 'default',\n };\n}\n\nfunction ContentGroup({\n type,\n refs,\n columns,\n buildUrl,\n resolveHref,\n LinkProvider,\n extras,\n adminCampaignCard,\n}: {\n type: string;\n refs: ContentRef[];\n columns: 2 | 3;\n buildUrl: (type: string, ids: string[]) => string | null;\n resolveHref: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n LinkProvider: CardLinkProvider;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n}) {\n const { items, isLoading } = useGroupItems(type, refs, buildUrl);\n const config = resolveGroupConfig(type);\n const isListLayout = config.layout === 'list';\n const cardSize = config.gridSize;\n\n // Skeleton gate: `isLoading && !items` — SSR HTML and the client's first\n // paint render identical skeletons (useSelfFetch starts isLoading=true on\n // both sides), and once items exist they are never replaced by skeletons.\n if (isLoading && !items) {\n const skeletons = refs.map((r) => (\n <div key={r.id}>{renderSkeletonForType(type, cardSize, adminCampaignCard)}</div>\n ));\n return isListLayout ? (\n <div className=\"space-y-4\">{skeletons}</div>\n ) : (\n <div className={gridClassFor(columns)}>{skeletons}</div>\n );\n }\n\n if (!items || items.length === 0) return null;\n\n // Index fetched rows by id, then render in REF order — refs carry the\n // intended sequence (suggestion mode: the engine's tier order, so\n // same-platform/tag-matched items lead; controlled mode: the curated\n // display_order). The list APIs return rows date-sorted, which would\n // otherwise scramble that ordering (same-platform items sinking below\n // newer cross-platform ones).\n // Shared extractor (NOT raw `.id`) — some API shapes key items differently\n // (e.g. external_id types); raw access would silently drop valid items.\n const itemById = new Map(\n (items as any[]).map((it) => [extractItemId(type, it) ?? String((it as any)?.id), it]),\n );\n\n const cards = refs\n .map((contentRef) => {\n const itemId = String(contentRef.id);\n const item = itemById.get(itemId);\n if (!item) return null;\n // Re-compose the URL via the host's resolver (hub: buildContentURL so\n // dev gets localhost and prod the right platform domain; default: the\n // ref's stored url as the API composed it).\n const resolved = resolveHref(contentRef);\n const href = resolved.href ?? '';\n const targetPlatform = resolved.targetPlatform ?? contentRef.targetPlatform ?? null;\n return (\n <div key={itemId}>\n <LinkProvider href={href || null} targetPlatform={targetPlatform}>\n {(linkProps) => (\n <CardForType\n type={type}\n item={item}\n contentRef={contentRef}\n size={cardSize}\n href={href}\n targetPlatform={targetPlatform}\n linkProps={linkProps}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n />\n )}\n </LinkProvider>\n </div>\n );\n })\n .filter(Boolean);\n\n if (cards.length === 0) return null;\n\n return isListLayout ? (\n <div className=\"space-y-4\">{cards}</div>\n ) : (\n <div className={gridClassFor(columns)}>{cards}</div>\n );\n}\n\n// =============================================================================\n// Main component\n// =============================================================================\n\ninterface RelatedContentResponse {\n refs: ContentRefWithReason[];\n}\n\nexport interface RelatedContentSectionProps {\n /** CONTROLLED mode (the original behavior). When defined — even `[]` — no\n * suggestion fetch runs and exactly these refs render. */\n contentRefs?: ContentRef[];\n /** SUGGESTION mode (with `entityId`): self-fetch suggestions for this host\n * entity from `{apiBaseUrl}/api/related-content`. Ignored when\n * `contentRefs` is provided. */\n entityType?: string;\n entityId?: number | string;\n /** Maps to the suggestion API's `count` param — the PER-TYPE fill target\n * for every candidate type EXCEPT the host's own. Absent → param not sent\n * (server default applies). */\n minResults?: number;\n /** Maps to the suggestion API's `sameTypeCount` param — the budget for the\n * candidate type MATCHING the host's own `entityType` (same-type boost:\n * a blog post's rail leads with more blog posts). Absent → param not\n * sent (host's type uses the server's `count`). */\n sameTypeMinResults?: number;\n /** SSR hydrate for suggestion mode — the server page ran the engine and\n * drills the refs here; the first client fetch is skipped (useSelfFetch\n * initialData contract). */\n initialItems?: ContentRefWithReason[];\n /** Section title (default: \"Related Content\") */\n title?: string;\n /**\n * Grid columns at desktop. 2 = denser cards / wider summary (original\n * investor-update layout); 3 = more cards per row for dashboards.\n * Only consulted for grid-layout groups. Default: 2.\n */\n columns?: 2 | 3;\n /**\n * ContentRef.type values to exclude. Honored in ALL modes — controlled\n * mode post-filters (original behavior); suggestion mode ALSO forwards the\n * list verbatim as the API's `excludeTypes=` param so excluded types never\n * consume engine fill slots (`minResults` stays honored). The subtraction\n * happens SERVER-side — this component never mirrors the hub's candidate\n * list.\n */\n excludeTypes?: string[];\n /**\n * SUGGESTION-mode allow-list (rail vocabulary): which content types\n * participate in this rail. Sent verbatim as the API's `types=` param —\n * the SERVER intersects it with its own allowed candidate set, and\n * platform policy gates (e.g. internal-only types) ALWAYS win: the client\n * cannot request its way past them. Absent → all server-side candidates.\n */\n includeTypes?: string[];\n /** Fetch-URL prefix for third-party embeds / reverse proxies\n * ('' = same-origin). Applied to BOTH the suggestion fetch and the\n * default per-group list fetches. */\n apiBaseUrl?: string;\n /** Host injection bundle — REUSES the chat dispatcher's\n * `ChatCardDispatchExtras` (programConfigs, buildOgPlaceholderUrl,\n * buildProductReleaseCardProps override). Program groups render nothing\n * when their config is absent. */\n extras?: ChatCardDispatchExtras;\n /** Hub injects its `buildContentURL` recomposition; default uses the\n * ref's stored `url`/`targetPlatform` as the API composed them. */\n resolveHref?: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n /** Hub injects its registry-driven entity-list-api builder; default = the\n * lib's `buildListUrl(type, ids, apiBaseUrl)`. */\n buildListUrl?: (type: string, ids: string[]) => string | null;\n /** Hub injects a `useNavLink`-backed render-prop provider; default = pure\n * anchor via `decideNewTab`. MUST be a module-scope component. */\n LinkProvider?: CardLinkProvider;\n /** Renderer pair for the admin-only `marketing_campaign` type. Absent →\n * the type renders nothing. */\n adminCampaignCard?: AdminCampaignCardSlot;\n}\n\nexport function RelatedContentSection({\n contentRefs,\n entityType,\n entityId,\n minResults,\n sameTypeMinResults,\n includeTypes,\n initialItems,\n title = 'Related Content',\n columns = 2,\n excludeTypes,\n apiBaseUrl = '',\n extras,\n resolveHref = defaultResolveHref,\n buildListUrl,\n LinkProvider = DefaultLinkPropsProvider,\n adminCampaignCard,\n}: RelatedContentSectionProps) {\n // ── Hooks above EVERY early return (the original `if (!contentRefs.length)\n // return null` guard moved below them). ──\n\n // Suggestion-mode fetch URL — null in controlled mode (contentRefs defined,\n // even []) or when the entity scope is incomplete.\n // `includeTypes: []` is an explicit \"nothing participates\" — skip the fetch\n // entirely (an empty-string `types=` param would be dropped by the URL\n // builder and read server-side as \"all candidates\").\n const suggestUrl =\n contentRefs === undefined &&\n entityType &&\n entityId !== undefined &&\n entityId !== null &&\n entityId !== '' &&\n includeTypes?.length !== 0\n ? buildSuggestionUrl('/api/related-content', {\n apiBaseUrl,\n entityType,\n entityId,\n count: minResults,\n extraParams: {\n sameTypeCount: sameTypeMinResults !== undefined ? String(sameTypeMinResults) : undefined,\n types: includeTypes !== undefined ? includeTypes.join(',') : undefined,\n excludeTypes: excludeTypes && excludeTypes.length > 0 ? excludeTypes.join(',') : undefined,\n },\n })\n : null;\n // Memoize the initialData wrapper — useSelfFetch re-syncs on [initialData],\n // and a fresh per-render object would loop setState under re-rendering\n // parents (the latent FaqSection bug, fixed there in the same change).\n const initialData = useMemo<RelatedContentResponse | undefined>(\n () => (initialItems ? { refs: initialItems } : undefined),\n [initialItems],\n );\n const { data } = useSelfFetch<RelatedContentResponse>(suggestUrl, { initialData });\n\n // Default group fetcher: the lib's byte-parity-tested builder, prefixed for\n // embeds. Memoized so group-fetch URLs stay value-stable across renders.\n const effectiveBuildListUrl = useMemo(\n () => buildListUrl ?? ((type: string, ids: string[]) => libBuildListUrl(type, ids, apiBaseUrl)),\n [buildListUrl, apiBaseUrl],\n );\n\n const refs: ContentRef[] = contentRefs ?? data?.refs ?? [];\n\n // Per-consumer type gating — drops refs whose `type` is in the exclude\n // list. In suggestion mode the server already subtracted these (the param\n // is forwarded above); the client filter stays as an idempotent guard and\n // IS the mechanism in controlled mode (original behavior).\n const exclude = new Set(excludeTypes || []);\n const visibleRefs = exclude.size > 0 ? refs.filter((r) => !exclude.has(r.type)) : refs;\n // Zero refs (still loading in suggestion mode, or genuinely empty) → no\n // empty shell.\n if (!visibleRefs.length) return null;\n\n const grouped: Record<string, ContentRef[]> = {};\n for (const ref of visibleRefs) {\n if (!grouped[ref.type]) grouped[ref.type] = [];\n grouped[ref.type].push(ref);\n }\n\n // Registered types in CONTENT_REF_GROUPS order, then any unregistered\n // types appended (same shape the investor-email builder uses — both\n // consume `orderContentRefTypes` so cross-surface ordering matches).\n // SAME-TYPE FIRST: when a host entityType is known (suggestion / SSR\n // modes), its own content-type group is hoisted to the top — a blog\n // post's rail leads with blog posts. Rail group keys are compared via\n // the shared alias canonicalizer (blog_post_existing ↔ blog_post).\n let orderedTypes = orderContentRefTypes(Object.keys(grouped));\n if (entityType) {\n const sameType = orderedTypes.filter((t) => canonicalContentRefType(t) === entityType);\n if (sameType.length > 0) {\n orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !== entityType)];\n }\n }\n\n return (\n <div className=\"space-y-8\">\n <h2 className=\"text-2xl font-bold text-ods-text-primary\">{title}</h2>\n {orderedTypes.map((type) => (\n <div key={type} className=\"space-y-4\">\n <h3 className=\"font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider\">\n {getContentRefLabelOrTitleCase(type)}\n </h3>\n <ContentGroup\n type={type}\n refs={grouped[type]}\n columns={columns}\n buildUrl={effectiveBuildListUrl}\n resolveHref={resolveHref}\n LinkProvider={LinkProvider}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n />\n </div>\n ))}\n </div>\n );\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/related-content/related-content-section.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * RelatedContentSection\n *\n * Renders content references grouped by type using the canonical card\n * components. MOVED from the hub (`components/shared/related-content-card.tsx`)\n * so any consuming app can embed it; the hub keeps a thin wrapper that\n * pre-binds its host-specific injections (nav hook, URL recomposition,\n * program configs, admin campaign card).\n *\n * THREE data modes (precedence top-down):\n * 1. CONTROLLED — `contentRefs` provided (even `[]`): render exactly those\n * refs, no suggestion fetch (the original investor-update behavior).\n * 2. SUGGESTION — `entityType` + `entityId` provided: self-fetch\n * `GET {apiBaseUrl}/api/related-content?entityType&entityId[&count][&excludeTypes]`\n * (the generic 5-tier engine's second web service). `minResults` maps to\n * `count`; absent → param not sent (server default applies). Each ref\n * carries a `reason` (data-only — never rendered, matching the\n * FaqSection/FaqWithReason precedent).\n * 3. SSR-HYDRATED suggestion — also pass `initialItems` (the server page\n * called the engine directly); the first client fetch is skipped per the\n * `useSelfFetch` initialData contract.\n *\n * Group layout (list vs grid) + card size (lg vs default) come from\n * `CONTENT_REF_GROUPS` in `../../utils/content-ref-groups` — single source of\n * truth, no per-type logic in this file. Skeletons come from\n * `renderSkeletonForType` so the placeholder height matches the loaded card\n * exactly (zero layout shift on resolve).\n *\n * One API call per content type via the shared list-URL builder\n * (`buildListUrl` — injectable; defaults to the lib's byte-parity-tested\n * builder prefixed with `apiBaseUrl`). Fetching uses `useSelfFetch` (plain\n * fetch, NO react-query) so third-party embedders need no QueryClientProvider;\n * cards are imported via DEEP module paths (not the chat barrel) so this\n * chunk never reaches `@tanstack/react-query`.\n *\n * LOCKSTEP NOTE: this file's per-type card/skeleton dispatch is the SIZED\n * sibling of the chat-side `CHAT_CARD_REGISTRY` (`../chat/entity-cards/\n * dispatch.tsx`), which renders compact `size='sm'` cards wired to the chat\n * runtime. Two dispatchers by design — when registering a new fetch-mode\n * content type, add it BOTH there and here (cards + skeleton + list URL).\n */\n\nimport React, { useMemo } from 'react';\nimport {\n CONTENT_REF_GROUPS,\n getContentRefLabelOrTitleCase,\n orderContentRefTypes,\n type ContentRefGroupConfig,\n} from '../../utils/content-ref-groups';\nimport type { ContentRef, ContentRefWithReason } from '../../types/content-ref';\nimport { useSelfFetch } from '../../hooks/use-self-fetch';\nimport { extractItems, extractItemId } from '../../utils/extract-items';\nimport { buildListUrl as libBuildListUrl, canonicalContentRefType } from '../../utils/list-url';\nimport { buildSuggestionUrl } from '../../utils/suggestion-url';\nimport { decideNewTab } from '../chat/utils/decide-new-tab';\n// DEEP card imports — NOT the `../chat` barrel (the barrel statically reaches\n// @tanstack/react-query via embeddable-chat + its hooks). Deep paths keep this\n// component's SOURCE graph react-query-free. Note: tsup's shared-chunk\n// splitting may still colocate the cards with chat hooks in one dist chunk\n// (react-query is a required peerDep, so resolution always succeeds) — the\n// guarantee that matters here is the RUNTIME one: nothing on this path ever\n// instantiates a QueryClient, so embedders need NO QueryClientProvider.\nimport { BlogCard, BlogCardSkeleton } from '../chat/entity-cards/blog-card';\nimport { CaseStudyCard, CaseStudyCardSkeleton } from '../chat/entity-cards/case-study-card';\nimport { CustomerInterviewCard, CustomerInterviewCardSkeleton } from '../chat/entity-cards/customer-interview-card';\nimport { ProductReleaseCard, ProductReleaseCardSkeleton } from '../chat/entity-cards/product-release-card';\nimport { buildProductReleaseCardProps } from '../chat/entity-cards/product-release-card-defaults';\nimport { ProgramCard, ProgramCardSkeleton } from '../chat/entity-cards/program-card';\nimport { InvestorUpdateCard, InvestorUpdateCardSkeleton } from '../chat/entity-cards/investor-update-card';\nimport { OnboardingGuideCard, OnboardingGuideCardSkeleton } from '../chat/entity-cards/onboarding-guide-card';\nimport { RoadmapCard, RoadmapCardSkeleton } from '../chat/entity-cards/roadmap-card';\n// Type-only — erased at build, no runtime dependency on the dispatch module.\nimport type { ChatCardDispatchExtras } from '../chat/entity-cards/dispatch';\n\ntype CardSize = 'lg' | 'default' | 'sm';\n\n/** Anchor prop bundle the per-card link surface receives — same shape the\n * hub's `useNavLink` returns and the chat dispatcher's anchor builders\n * produce. `null` = non-anchor mode (no URL). */\nexport interface CardLinkAnchorProps {\n href: string;\n target?: '_blank';\n rel?: 'noopener noreferrer';\n onClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n}\n\n/** Render-prop component injection for the navigation decision — keeps hook\n * calls legal (hooks live INSIDE the injected component; `CardForType`\n * itself calls zero hooks). The hub injects a `useNavLink`-backed provider;\n * the default is hook-free (pure `decideNewTab`). MUST be defined at module\n * scope by hosts — an inline arrow would remount every card each render. */\nexport interface CardLinkProviderProps {\n href: string | null;\n targetPlatform: string | null;\n children: (linkProps: CardLinkAnchorProps | null) => React.ReactElement | null;\n}\nexport type CardLinkProvider = React.ComponentType<CardLinkProviderProps>;\n\n/** Default link provider for standalone embeds: relative/-same-origin hrefs\n * stay same-tab, cross-origin pops a new tab (pure `decideNewTab` with no\n * platform context — `currentSource: ''` falls through to the origin\n * check). No router integration, no hooks. */\nfunction DefaultLinkPropsProvider({ href, targetPlatform, children }: CardLinkProviderProps): React.ReactElement | null {\n if (!href) return children(null);\n const newTab = decideNewTab({ href, targetPlatform, currentSource: '' });\n return children(\n newTab\n ? { href, target: '_blank', rel: 'noopener noreferrer' }\n : { href },\n );\n}\n\n/** Default href resolution: trust the ref's stored url/targetPlatform as the\n * API composed them. The hub overrides this with its `buildContentURL`\n * re-composition so dev gets localhost and prod gets platform domains. */\nfunction defaultResolveHref(ref: ContentRef): { href: string | null; targetPlatform: string | null } {\n return { href: ref.url || null, targetPlatform: ref.targetPlatform ?? null };\n}\n\n/** Host-injected renderer pair for the admin-only `marketing_campaign` type.\n * Absent (every non-hub embed) → the type renders nothing (its list URL\n * hits `/api/admin`, unreachable outside the hub anyway). */\nexport interface AdminCampaignCardSlot {\n Card: React.ComponentType<{ campaign: any }>;\n Skeleton: React.ComponentType<{ size?: 'default' | 'sm' }>;\n}\n\n/**\n * Per-type skeleton dispatch — returns the SAME colocated skeleton the\n * resolved card renders, sized to match (zero layout shift on resolve).\n * The chat-side `CHAT_CARD_REGISTRY` already does this via\n * `entry.skeleton()`; this surface exposes the same discipline to the\n * related-content rail.\n */\nfunction renderSkeletonForType(\n type: string,\n size: CardSize,\n adminCampaignCard?: AdminCampaignCardSlot,\n): React.ReactNode {\n // Most card skeletons accept only `{default, sm}`. `'lg'` collapses to\n // `'default'`. ProductReleaseCardSkeleton uses lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n switch (type) {\n case 'blog_post_existing':\n return <BlogCardSkeleton size={legacySize} />;\n case 'case_study':\n return <CaseStudyCardSkeleton size={legacySize} />;\n case 'customer_interview':\n return <CustomerInterviewCardSkeleton size={legacySize} />;\n case 'product_release':\n return <ProductReleaseCardSkeleton size={size === 'sm' ? 'sm' : 'lg'} />;\n case 'podcast':\n case 'webinar':\n case 'event':\n return <ProgramCardSkeleton size={legacySize} />;\n case 'investor_update':\n return <InvestorUpdateCardSkeleton size={legacySize} />;\n case 'onboarding_guide':\n // The rich catalog variant (hero + author grid, clamped description) —\n // the step-numbered 'default' variant is for the guide detail page's\n // \"More in section\" rail, not this full-width row.\n return <OnboardingGuideCardSkeleton size={size === 'sm' ? 'sm' : 'catalog'} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Skeleton size={legacySize} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return <RoadmapCardSkeleton size={legacySize} />;\n default:\n return null;\n }\n}\n\n/**\n * Per-type card dispatch — renders the right card with the right size.\n * Sized cards (`'lg'` / `'default'`) are unique to this rail — the chat\n * dispatcher only renders `'sm'`, so we go directly through the per-type\n * cards here.\n *\n * PURE FUNCTION COMPONENT WITH ZERO HOOK CALLS: the placeholder comes from a\n * plain `extras.buildOgPlaceholderUrl` call (the chat `dispatch.tsx`\n * pattern) and the anchor-prop bundle arrives via the `LinkProvider`\n * render-prop from the parent — so per-card hook legality is owned by the\n * injected provider component, not by this switch.\n *\n * `href` comes from the host's `resolveHref(ref)` (hub: live\n * `buildContentURL` recomposition; default: the ref's stored url).\n */\nfunction CardForType({\n type,\n item,\n size,\n href,\n targetPlatform,\n linkProps,\n extras,\n adminCampaignCard,\n}: {\n type: string;\n item: any;\n contentRef: ContentRef;\n size: CardSize;\n href: string;\n targetPlatform: string | null;\n linkProps: CardLinkAnchorProps | null;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n}): React.ReactNode {\n // Most card variants accept only `{default, sm}`. `'lg'` collapses to\n // `'default'` for those. ProductReleaseCard uses its own lg/sm pair.\n const legacySize: 'default' | 'sm' = size === 'sm' ? 'sm' : 'default';\n // OG placeholder URL — injected into the pure-presentation cards so they\n // render a branded fallback when the row's featured image is null. Plain\n // function call (NOT a hook). Title is the universal field across all card\n // item shapes used here.\n const placeholderUrl =\n extras?.buildOgPlaceholderUrl?.((item?.title as string | undefined) ?? '') ?? undefined;\n\n // Top-level target/rel for cards that take them as separate props\n // (BlogCard, CaseStudyCard, …). ProductReleaseCard takes the bundle as a\n // single `anchorProps={...}` and uses `linkProps` directly. When the host\n // didn't surface a URL, `linkProps` is null and the card stays in\n // non-anchor mode.\n const anchorAttrs: Pick<CardLinkAnchorProps, 'target' | 'rel'> = linkProps\n ? { target: linkProps.target, rel: linkProps.rel }\n : {};\n\n switch (type) {\n case 'blog_post_existing':\n return <BlogCard post={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'case_study':\n return <CaseStudyCard study={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'customer_interview':\n return <CustomerInterviewCard interview={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'product_release': {\n // Anchor-prop pattern: build product-release lg-variant props from the\n // shared `buildProductReleaseCardProps` so this rail and the /releases\n // catalog page render byte-identically. The card wraps in\n // `<a {...anchorProps}>` ONLY when `anchorProps.href` is set — pass\n // `undefined` (not an empty object) when href is empty so the card\n // stays in non-anchor mode without rendering a dead <a> tag.\n const releaseSize = size === 'sm' ? 'sm' : 'lg';\n const buildReleaseProps = extras?.buildProductReleaseCardProps ?? buildProductReleaseCardProps;\n const releaseProps = buildReleaseProps(item);\n return (\n <ProductReleaseCard\n size={releaseSize}\n title={item.title}\n summary={item.summary}\n version={item.version}\n {...releaseProps}\n anchorProps={linkProps ?? undefined}\n />\n );\n }\n case 'podcast':\n return extras?.programConfigs?.podcast\n ? <ProgramCard config={extras.programConfigs.podcast} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'webinar':\n return extras?.programConfigs?.webinar\n ? <ProgramCard config={extras.programConfigs.webinar} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'event':\n return extras?.programConfigs?.event\n ? <ProgramCard config={extras.programConfigs.event} item={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />\n : null;\n case 'investor_update':\n return <InvestorUpdateCard update={item} size={legacySize} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'onboarding_guide':\n // Catalog variant (see skeleton note) — full-width rich card with a\n // line-clamped description instead of the step-numbered rail card.\n return <OnboardingGuideCard guide={item} size={size === 'sm' ? 'sm' : 'catalog'} href={href} targetPlatform={targetPlatform} placeholderUrl={placeholderUrl} {...anchorAttrs} />;\n case 'marketing_campaign':\n return adminCampaignCard ? <adminCampaignCard.Card campaign={item} /> : null;\n case 'roadmap_item':\n case 'delivery_item':\n case 'internal_task':\n return (\n <RoadmapCard\n item={item}\n href={href ?? ''}\n targetPlatform={targetPlatform}\n userVote={null}\n onVote={() => {}}\n size={legacySize}\n cardType={type as 'roadmap_item' | 'delivery_item' | 'internal_task'}\n {...anchorAttrs}\n />\n );\n default:\n return null;\n }\n}\n\n// =============================================================================\n// Fetch all items for a type in ONE server-sorted call, via the injectable\n// list-URL builder. `useSelfFetch` (URL = cache key) replaces the hub's old\n// react-query usage: `enabled` ≙ `url === null`, `!res.ok`/network error ≙\n// `error → items null → group renders nothing`. Accepted deltas vs\n// react-query: no retry/backoff, no focus refetch, no cross-mount cache.\n// =============================================================================\n\nfunction useGroupItems(\n type: string,\n refs: ContentRef[],\n buildUrl: (type: string, ids: string[]) => string | null,\n) {\n const ids = refs.map((r) => r.id);\n const url = ids.length > 0 ? buildUrl(type, ids) : null;\n const { data, isLoading } = useSelfFetch<unknown>(url);\n const items = data != null ? extractItems(data) : null;\n return { items, isLoading };\n}\n\n// =============================================================================\n// Per-group renderer — one API call, server-sorted, then render cards via the\n// dispatcher with per-type skeletons + per-type layout from CONTENT_REF_GROUPS.\n// =============================================================================\n\n/** Map columns prop → tailwind grid class. Only consulted for grid-layout\n * groups; list-layout groups stack vertically. */\nfunction gridClassFor(columns: 2 | 3): string {\n return columns === 3\n ? 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-6'\n : 'grid grid-cols-1 sm:grid-cols-2 gap-6';\n}\n\n/** Resolve the group config for a type, falling back to a grid layout with\n * the default card size for unregistered types so the section still renders\n * rather than silently dropping them. The `label` field on the fallback is\n * intentionally a placeholder — the section heading goes through\n * `getContentRefLabelOrTitleCase(type)` instead so cross-surface labels\n * stay consistent between this rail and the investor-email builder. */\nfunction resolveGroupConfig(type: string): ContentRefGroupConfig {\n return CONTENT_REF_GROUPS[type] ?? {\n label: type,\n order: 999,\n layout: 'grid',\n gridSize: 'default',\n };\n}\n\nfunction ContentGroup({\n type,\n refs,\n columns,\n buildUrl,\n resolveHref,\n LinkProvider,\n extras,\n adminCampaignCard,\n}: {\n type: string;\n refs: ContentRef[];\n columns: 2 | 3;\n buildUrl: (type: string, ids: string[]) => string | null;\n resolveHref: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n LinkProvider: CardLinkProvider;\n extras?: ChatCardDispatchExtras;\n adminCampaignCard?: AdminCampaignCardSlot;\n}) {\n const { items, isLoading } = useGroupItems(type, refs, buildUrl);\n const config = resolveGroupConfig(type);\n const isListLayout = config.layout === 'list';\n const cardSize = config.gridSize;\n\n // Skeleton gate: `isLoading && !items` — SSR HTML and the client's first\n // paint render identical skeletons (useSelfFetch starts isLoading=true on\n // both sides), and once items exist they are never replaced by skeletons.\n if (isLoading && !items) {\n const skeletons = refs.map((r) => (\n <div key={r.id}>{renderSkeletonForType(type, cardSize, adminCampaignCard)}</div>\n ));\n return isListLayout ? (\n <div className=\"space-y-4\">{skeletons}</div>\n ) : (\n <div className={gridClassFor(columns)}>{skeletons}</div>\n );\n }\n\n if (!items || items.length === 0) return null;\n\n // Index fetched rows by id, then render in REF order — refs carry the\n // intended sequence (suggestion mode: the engine's tier order, so\n // same-platform/tag-matched items lead; controlled mode: the curated\n // display_order). The list APIs return rows date-sorted, which would\n // otherwise scramble that ordering (same-platform items sinking below\n // newer cross-platform ones).\n // Shared extractor (NOT raw `.id`) — some API shapes key items differently\n // (e.g. external_id types); raw access would silently drop valid items.\n const itemById = new Map(\n (items as any[]).map((it) => [extractItemId(type, it) ?? String((it as any)?.id), it]),\n );\n\n const cards = refs\n .map((contentRef) => {\n const itemId = String(contentRef.id);\n const item = itemById.get(itemId);\n if (!item) return null;\n // Re-compose the URL via the host's resolver (hub: buildContentURL so\n // dev gets localhost and prod the right platform domain; default: the\n // ref's stored url as the API composed it).\n const resolved = resolveHref(contentRef);\n const href = resolved.href ?? '';\n const targetPlatform = resolved.targetPlatform ?? contentRef.targetPlatform ?? null;\n return (\n <div key={itemId}>\n <LinkProvider href={href || null} targetPlatform={targetPlatform}>\n {(linkProps) => (\n <CardForType\n type={type}\n item={item}\n contentRef={contentRef}\n size={cardSize}\n href={href}\n targetPlatform={targetPlatform}\n linkProps={linkProps}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n />\n )}\n </LinkProvider>\n </div>\n );\n })\n .filter(Boolean);\n\n if (cards.length === 0) return null;\n\n return isListLayout ? (\n <div className=\"space-y-4\">{cards}</div>\n ) : (\n <div className={gridClassFor(columns)}>{cards}</div>\n );\n}\n\n// =============================================================================\n// Main component\n// =============================================================================\n\ninterface RelatedContentResponse {\n refs: ContentRefWithReason[];\n}\n\nexport interface RelatedContentSectionProps {\n /** CONTROLLED mode (the original behavior). When defined — even `[]` — no\n * suggestion fetch runs and exactly these refs render. */\n contentRefs?: ContentRef[];\n /** SUGGESTION mode (with `entityId`): self-fetch suggestions for this host\n * entity from `{apiBaseUrl}/api/related-content`. Ignored when\n * `contentRefs` is provided. */\n entityType?: string;\n entityId?: number | string;\n /** Maps to the suggestion API's `count` param — the PER-TYPE fill target\n * for every candidate type EXCEPT the host's own. Absent → param not sent\n * (server default applies). */\n minResults?: number;\n /** Maps to the suggestion API's `sameTypeCount` param — the budget for the\n * candidate type MATCHING the host's own `entityType` (same-type boost:\n * a blog post's rail leads with more blog posts). Absent → param not\n * sent (host's type uses the server's `count`). */\n sameTypeMinResults?: number;\n /** SSR hydrate for suggestion mode — the server page ran the engine and\n * drills the refs here; the first client fetch is skipped (useSelfFetch\n * initialData contract). */\n initialItems?: ContentRefWithReason[];\n /** Section title (default: \"Related Content\") */\n title?: string;\n /**\n * Grid columns at desktop. 2 = denser cards / wider summary (original\n * investor-update layout); 3 = more cards per row for dashboards.\n * Only consulted for grid-layout groups. Default: 2.\n */\n columns?: 2 | 3;\n /**\n * ContentRef.type values to exclude. Honored in ALL modes — controlled\n * mode post-filters (original behavior); suggestion mode ALSO forwards the\n * list verbatim as the API's `excludeTypes=` param so excluded types never\n * consume engine fill slots (`minResults` stays honored). The subtraction\n * happens SERVER-side — this component never mirrors the hub's candidate\n * list.\n */\n excludeTypes?: string[];\n /**\n * SUGGESTION-mode allow-list (rail vocabulary): which content types\n * participate in this rail. Sent verbatim as the API's `types=` param —\n * the SERVER intersects it with its own allowed candidate set, and\n * platform policy gates (e.g. internal-only types) ALWAYS win: the client\n * cannot request its way past them. Absent → all server-side candidates.\n */\n includeTypes?: string[];\n /** Fetch-URL prefix for third-party embeds / reverse proxies\n * ('' = same-origin). Applied to BOTH the suggestion fetch and the\n * default per-group list fetches. */\n apiBaseUrl?: string;\n /** Host injection bundle — REUSES the chat dispatcher's\n * `ChatCardDispatchExtras` (programConfigs, buildOgPlaceholderUrl,\n * buildProductReleaseCardProps override). Program groups render nothing\n * when their config is absent. */\n extras?: ChatCardDispatchExtras;\n /** Hub injects its `buildContentURL` recomposition; default uses the\n * ref's stored `url`/`targetPlatform` as the API composed them. */\n resolveHref?: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };\n /** Hub injects its registry-driven entity-list-api builder; default = the\n * lib's `buildListUrl(type, ids, apiBaseUrl)`. */\n buildListUrl?: (type: string, ids: string[]) => string | null;\n /** Hub injects a `useNavLink`-backed render-prop provider; default = pure\n * anchor via `decideNewTab`. MUST be a module-scope component. */\n LinkProvider?: CardLinkProvider;\n /** Renderer pair for the admin-only `marketing_campaign` type. Absent →\n * the type renders nothing. */\n adminCampaignCard?: AdminCampaignCardSlot;\n}\n\nexport function RelatedContentSection({\n contentRefs,\n entityType,\n entityId,\n minResults,\n sameTypeMinResults,\n includeTypes,\n initialItems,\n title = 'Related Content',\n columns = 2,\n excludeTypes,\n apiBaseUrl = '',\n extras,\n resolveHref = defaultResolveHref,\n buildListUrl,\n LinkProvider = DefaultLinkPropsProvider,\n adminCampaignCard,\n}: RelatedContentSectionProps) {\n // ── Hooks above EVERY early return (the original `if (!contentRefs.length)\n // return null` guard moved below them). ──\n\n // Suggestion-mode fetch URL — null in controlled mode (contentRefs defined,\n // even []) or when the entity scope is incomplete.\n // `includeTypes: []` is an explicit \"nothing participates\" — skip the fetch\n // entirely (an empty-string `types=` param would be dropped by the URL\n // builder and read server-side as \"all candidates\").\n const suggestUrl =\n contentRefs === undefined &&\n entityType &&\n entityId !== undefined &&\n entityId !== null &&\n entityId !== '' &&\n includeTypes?.length !== 0\n ? buildSuggestionUrl('/api/related-content', {\n apiBaseUrl,\n entityType,\n entityId,\n count: minResults,\n extraParams: {\n sameTypeCount: sameTypeMinResults !== undefined ? String(sameTypeMinResults) : undefined,\n types: includeTypes !== undefined ? includeTypes.join(',') : undefined,\n excludeTypes: excludeTypes && excludeTypes.length > 0 ? excludeTypes.join(',') : undefined,\n },\n })\n : null;\n // Memoize the initialData wrapper — useSelfFetch re-syncs on [initialData],\n // and a fresh per-render object would loop setState under re-rendering\n // parents (the latent FaqSection bug, fixed there in the same change).\n const initialData = useMemo<RelatedContentResponse | undefined>(\n () => (initialItems ? { refs: initialItems } : undefined),\n [initialItems],\n );\n const { data } = useSelfFetch<RelatedContentResponse>(suggestUrl, { initialData });\n\n // Default group fetcher: the lib's byte-parity-tested builder, prefixed for\n // embeds. Memoized so group-fetch URLs stay value-stable across renders.\n const effectiveBuildListUrl = useMemo(\n () => buildListUrl ?? ((type: string, ids: string[]) => libBuildListUrl(type, ids, apiBaseUrl)),\n [buildListUrl, apiBaseUrl],\n );\n\n const refs: ContentRef[] = contentRefs ?? data?.refs ?? [];\n\n // Per-consumer type gating — drops refs whose `type` is in the exclude\n // list. In suggestion mode the server already subtracted these (the param\n // is forwarded above); the client filter stays as an idempotent guard and\n // IS the mechanism in controlled mode (original behavior).\n const exclude = new Set(excludeTypes || []);\n const visibleRefs = exclude.size > 0 ? refs.filter((r) => !exclude.has(r.type)) : refs;\n // Zero refs (still loading in suggestion mode, or genuinely empty) → no\n // empty shell.\n if (!visibleRefs.length) return null;\n\n const grouped: Record<string, ContentRef[]> = {};\n for (const ref of visibleRefs) {\n if (!grouped[ref.type]) grouped[ref.type] = [];\n grouped[ref.type].push(ref);\n }\n\n // Registered types in CONTENT_REF_GROUPS order, then any unregistered\n // types appended (same shape the investor-email builder uses — both\n // consume `orderContentRefTypes` so cross-surface ordering matches).\n // SAME-TYPE FIRST: when a host entityType is known (suggestion / SSR\n // modes), its own content-type group is hoisted to the top — a blog\n // post's rail leads with blog posts. Rail group keys are compared via\n // the shared alias canonicalizer (blog_post_existing ↔ blog_post).\n let orderedTypes = orderContentRefTypes(Object.keys(grouped));\n if (entityType) {\n const sameType = orderedTypes.filter((t) => canonicalContentRefType(t) === entityType);\n if (sameType.length > 0) {\n orderedTypes = [...sameType, ...orderedTypes.filter((t) => canonicalContentRefType(t) !== entityType)];\n }\n }\n\n return (\n <div className=\"space-y-8\">\n <h2 className=\"text-2xl font-bold text-ods-text-primary\">{title}</h2>\n {orderedTypes.map((type) => (\n <div key={type} className=\"space-y-4\">\n <h3 className=\"font-['Azeret_Mono'] text-[14px] font-semibold uppercase text-ods-text-secondary tracking-wider\">\n {getContentRefLabelOrTitleCase(type)}\n </h3>\n <ContentGroup\n type={type}\n refs={grouped[type]}\n columns={columns}\n buildUrl={effectiveBuildListUrl}\n resolveHref={resolveHref}\n LinkProvider={LinkProvider}\n extras={extras}\n adminCampaignCard={adminCampaignCard}\n />\n </div>\n ))}\n </div>\n );\n}\n"],"mappings":"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","names":["buildListUrl"]}
|