@flamingo-stack/openframe-frontend-core 0.0.274 → 0.0.275

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/{chunk-XDGDCO3I.cjs → chunk-5LOLBUZG.cjs} +45 -44
  2. package/dist/chunk-5LOLBUZG.cjs.map +1 -0
  3. package/dist/{chunk-4YKGXZ7W.js → chunk-7AH75KFQ.js} +1 -1
  4. package/dist/chunk-7AH75KFQ.js.map +1 -0
  5. package/dist/{chunk-CYMMGPPV.js → chunk-CTBL56EC.js} +41 -5
  6. package/dist/chunk-CTBL56EC.js.map +1 -0
  7. package/dist/{chunk-2KHFSSFZ.cjs → chunk-DBJZF2OV.cjs} +15 -15
  8. package/dist/{chunk-2KHFSSFZ.cjs.map → chunk-DBJZF2OV.cjs.map} +1 -1
  9. package/dist/{chunk-4DYXV3E7.cjs → chunk-DEAWHNYW.cjs} +1177 -1223
  10. package/dist/chunk-DEAWHNYW.cjs.map +1 -0
  11. package/dist/{chunk-WU6PMH5L.cjs → chunk-E6RCVOQG.cjs} +41 -43
  12. package/dist/chunk-E6RCVOQG.cjs.map +1 -0
  13. package/dist/{chunk-FLIWL6V4.js → chunk-EINXNG5D.js} +4 -4
  14. package/dist/{chunk-OPSZNW3I.js → chunk-EKWPIEHH.js} +3031 -3077
  15. package/dist/chunk-EKWPIEHH.js.map +1 -0
  16. package/dist/{chunk-N5MCKGAB.js → chunk-FDHKJJPK.js} +34 -33
  17. package/dist/{chunk-N5MCKGAB.js.map → chunk-FDHKJJPK.js.map} +1 -1
  18. package/dist/{chunk-BSOHVQ7X.js → chunk-GHWOQUB4.js} +366 -391
  19. package/dist/chunk-GHWOQUB4.js.map +1 -0
  20. package/dist/{chunk-T7AJBKZP.cjs → chunk-GVSTRN36.cjs} +5 -2
  21. package/dist/chunk-GVSTRN36.cjs.map +1 -0
  22. package/dist/{chunk-L4LAAA5Q.js → chunk-IMNGGLKL.js} +5 -2
  23. package/dist/chunk-IMNGGLKL.js.map +1 -0
  24. package/dist/{chunk-VASNLWPZ.js → chunk-NY7OG2OJ.js} +5 -7
  25. package/dist/{chunk-VASNLWPZ.js.map → chunk-NY7OG2OJ.js.map} +1 -1
  26. package/dist/{chunk-5QJQAFTP.cjs → chunk-OKDCUJOZ.cjs} +48 -12
  27. package/dist/chunk-OKDCUJOZ.cjs.map +1 -0
  28. package/dist/{chunk-MEAR2WHS.cjs → chunk-PC7YOZ4I.cjs} +1 -1
  29. package/dist/chunk-PC7YOZ4I.cjs.map +1 -0
  30. package/dist/{chunk-QLWBBCI5.cjs → chunk-Q2ITV3NY.cjs} +5 -4
  31. package/dist/chunk-Q2ITV3NY.cjs.map +1 -0
  32. package/dist/chunk-RGALV4UX.js +433 -0
  33. package/dist/chunk-RGALV4UX.js.map +1 -0
  34. package/dist/{chunk-W5KBDFCR.cjs → chunk-SA4ZTD3G.cjs} +30 -30
  35. package/dist/{chunk-W5KBDFCR.cjs.map → chunk-SA4ZTD3G.cjs.map} +1 -1
  36. package/dist/{chunk-GL5X6VVC.js → chunk-T4XXYAYY.js} +4 -4
  37. package/dist/{chunk-ZMFT5XOB.js → chunk-UXJCZOLA.js} +4 -3
  38. package/dist/chunk-UXJCZOLA.js.map +1 -0
  39. package/dist/{chunk-7NJUPRN6.cjs → chunk-XCPBD2PG.cjs} +183 -208
  40. package/dist/chunk-XCPBD2PG.cjs.map +1 -0
  41. package/dist/chunk-ZSUNQJRO.cjs +433 -0
  42. package/dist/chunk-ZSUNQJRO.cjs.map +1 -0
  43. package/dist/components/chat/chat-message-row.d.ts +1 -1
  44. package/dist/components/chat/chat-message-row.d.ts.map +1 -1
  45. package/dist/components/chat/index.cjs +10 -11
  46. package/dist/components/chat/index.cjs.map +1 -1
  47. package/dist/components/chat/index.js +12 -13
  48. package/dist/components/contact/index.cjs +7 -9
  49. package/dist/components/contact/index.cjs.map +1 -1
  50. package/dist/components/contact/index.js +6 -8
  51. package/dist/components/faq/faq-document-page.d.ts +21 -0
  52. package/dist/components/faq/faq-document-page.d.ts.map +1 -0
  53. package/dist/components/faq/index.cjs +22 -5
  54. package/dist/components/faq/index.cjs.map +1 -1
  55. package/dist/components/faq/index.d.ts +1 -0
  56. package/dist/components/faq/index.d.ts.map +1 -1
  57. package/dist/components/faq/index.js +21 -4
  58. package/dist/components/features/index.cjs +6 -8
  59. package/dist/components/features/index.cjs.map +1 -1
  60. package/dist/components/features/index.js +5 -7
  61. package/dist/components/index.cjs +304 -309
  62. package/dist/components/index.cjs.map +1 -1
  63. package/dist/components/index.js +249 -254
  64. package/dist/components/index.js.map +1 -1
  65. package/dist/components/layout/article-detail-layout.d.ts +21 -9
  66. package/dist/components/layout/article-detail-layout.d.ts.map +1 -1
  67. package/dist/components/navigation/index.cjs +6 -8
  68. package/dist/components/navigation/index.cjs.map +1 -1
  69. package/dist/components/navigation/index.js +5 -7
  70. package/dist/components/onboarding-guides/index.cjs +33 -46
  71. package/dist/components/onboarding-guides/index.cjs.map +1 -1
  72. package/dist/components/onboarding-guides/index.js +11 -24
  73. package/dist/components/onboarding-guides/index.js.map +1 -1
  74. package/dist/components/onboarding-guides/onboarding-guide-detail-view.d.ts.map +1 -1
  75. package/dist/components/related-content/index.cjs +8 -10
  76. package/dist/components/related-content/index.cjs.map +1 -1
  77. package/dist/components/related-content/index.js +7 -9
  78. package/dist/components/shared/delivery/delivery-lists.d.ts.map +1 -1
  79. package/dist/components/shared/detail-page-skeleton.d.ts +6 -1
  80. package/dist/components/shared/detail-page-skeleton.d.ts.map +1 -1
  81. package/dist/components/shared/legal-document/use-legal-docs.d.ts.map +1 -1
  82. package/dist/components/shared/product-release/release-detail-page.d.ts.map +1 -1
  83. package/dist/components/shared/roadmap/roadmap-grid.d.ts.map +1 -1
  84. package/dist/components/shared/roadmap/use-roadmap-voting.d.ts.map +1 -1
  85. package/dist/components/tickets/help-center-list.d.ts +9 -1
  86. package/dist/components/tickets/help-center-list.d.ts.map +1 -1
  87. package/dist/components/tickets/hooks/use-ticket-actions.d.ts.map +1 -1
  88. package/dist/components/tickets/hooks/use-ticket-engagements.d.ts.map +1 -1
  89. package/dist/components/tickets/hooks/use-tickets-list.d.ts.map +1 -1
  90. package/dist/components/tickets/index.cjs +81 -76
  91. package/dist/components/tickets/index.cjs.map +1 -1
  92. package/dist/components/tickets/index.js +27 -22
  93. package/dist/components/tickets/index.js.map +1 -1
  94. package/dist/components/ui/index.cjs +12 -15
  95. package/dist/components/ui/index.cjs.map +1 -1
  96. package/dist/components/ui/index.js +24 -27
  97. package/dist/contexts/chat-runtime-context.d.ts +9 -0
  98. package/dist/contexts/chat-runtime-context.d.ts.map +1 -1
  99. package/dist/contexts/index.cjs +2 -2
  100. package/dist/contexts/index.js +1 -1
  101. package/dist/hooks/index.cjs +3 -3
  102. package/dist/hooks/index.js +2 -2
  103. package/dist/hooks/use-contact-submission.d.ts.map +1 -1
  104. package/dist/hooks/use-self-fetch.d.ts.map +1 -1
  105. package/dist/index.cjs +11 -15
  106. package/dist/index.cjs.map +1 -1
  107. package/dist/index.js +32 -36
  108. package/dist/utils/embed-authed-fetch.d.ts +7 -0
  109. package/dist/utils/embed-authed-fetch.d.ts.map +1 -1
  110. package/dist/utils/embed-content-fetch.d.ts +2 -0
  111. package/dist/utils/embed-content-fetch.d.ts.map +1 -0
  112. package/dist/utils/index.cjs.map +1 -1
  113. package/dist/utils/index.js.map +1 -1
  114. package/package.json +1 -1
  115. package/src/components/chat/chat-message-row.tsx +12 -2
  116. package/src/components/faq/faq-document-page.tsx +69 -0
  117. package/src/components/faq/index.ts +1 -0
  118. package/src/components/layout/article-detail-layout.tsx +24 -11
  119. package/src/components/onboarding-guides/onboarding-guide-detail-view.tsx +21 -16
  120. package/src/components/shared/delivery/delivery-lists.tsx +3 -2
  121. package/src/components/shared/detail-page-skeleton.tsx +18 -10
  122. package/src/components/shared/legal-document/use-legal-docs.ts +2 -1
  123. package/src/components/shared/product-release/release-detail-page.tsx +27 -17
  124. package/src/components/shared/roadmap/roadmap-grid.tsx +2 -1
  125. package/src/components/shared/roadmap/use-roadmap-voting.ts +3 -2
  126. package/src/components/tickets/help-center-list.tsx +12 -4
  127. package/src/components/tickets/hooks/use-ticket-actions.ts +7 -2
  128. package/src/components/tickets/hooks/use-ticket-engagements.ts +6 -1
  129. package/src/components/tickets/hooks/use-tickets-list.ts +7 -1
  130. package/src/components/tickets/ticket-detail-drawer.tsx +1 -0
  131. package/src/contexts/chat-runtime-context.tsx +9 -0
  132. package/src/hooks/use-contact-submission.ts +2 -1
  133. package/src/hooks/use-self-fetch.ts +2 -1
  134. package/src/styles/index.css +1 -0
  135. package/src/styles/ods-page-shell.css +29 -0
  136. package/src/utils/embed-authed-fetch.ts +10 -0
  137. package/src/utils/embed-content-fetch.ts +30 -0
  138. package/dist/chunk-4DYXV3E7.cjs.map +0 -1
  139. package/dist/chunk-4YKGXZ7W.js.map +0 -1
  140. package/dist/chunk-5QJQAFTP.cjs.map +0 -1
  141. package/dist/chunk-722TTRIJ.cjs +0 -29
  142. package/dist/chunk-722TTRIJ.cjs.map +0 -1
  143. package/dist/chunk-7NJUPRN6.cjs.map +0 -1
  144. package/dist/chunk-BSOHVQ7X.js.map +0 -1
  145. package/dist/chunk-CYMMGPPV.js.map +0 -1
  146. package/dist/chunk-DAAFVOTL.cjs +0 -172
  147. package/dist/chunk-DAAFVOTL.cjs.map +0 -1
  148. package/dist/chunk-L4LAAA5Q.js.map +0 -1
  149. package/dist/chunk-MEAR2WHS.cjs.map +0 -1
  150. package/dist/chunk-OO4ZGDRO.js +0 -29
  151. package/dist/chunk-OO4ZGDRO.js.map +0 -1
  152. package/dist/chunk-OPSZNW3I.js.map +0 -1
  153. package/dist/chunk-QLWBBCI5.cjs.map +0 -1
  154. package/dist/chunk-T2URJAX2.js +0 -169
  155. package/dist/chunk-T2URJAX2.js.map +0 -1
  156. package/dist/chunk-T7AJBKZP.cjs.map +0 -1
  157. package/dist/chunk-WU6PMH5L.cjs.map +0 -1
  158. package/dist/chunk-XDGDCO3I.cjs.map +0 -1
  159. package/dist/chunk-Y2B6WDU6.cjs +0 -169
  160. package/dist/chunk-Y2B6WDU6.cjs.map +0 -1
  161. package/dist/chunk-ZMFT5XOB.js.map +0 -1
  162. package/dist/chunk-ZXZJSTNV.js +0 -172
  163. package/dist/chunk-ZXZJSTNV.js.map +0 -1
  164. /package/dist/{chunk-FLIWL6V4.js.map → chunk-EINXNG5D.js.map} +0 -0
  165. /package/dist/{chunk-GL5X6VVC.js.map → chunk-T4XXYAYY.js.map} +0 -0
@@ -4,16 +4,13 @@ import {
4
4
  useDebounce,
5
5
  useNearViewport,
6
6
  useOgPlaceholder
7
- } from "./chunk-ZXZJSTNV.js";
7
+ } from "./chunk-RGALV4UX.js";
8
8
  import {
9
9
  useChatRuntime
10
- } from "./chunk-4YKGXZ7W.js";
10
+ } from "./chunk-7AH75KFQ.js";
11
11
  import {
12
12
  next_image_default
13
13
  } from "./chunk-LXC6P2EO.js";
14
- import {
15
- SECTION_HEADING_CLASS
16
- } from "./chunk-OO4ZGDRO.js";
17
14
  import {
18
15
  Button,
19
16
  DropdownMenu,
@@ -2328,8 +2325,29 @@ function YouTubeFacadeInner({
2328
2325
  ) });
2329
2326
  }
2330
2327
 
2331
- // src/components/features/video-ratio-tabs.tsx
2328
+ // src/components/layout/page-heading.tsx
2332
2329
  import { Fragment as Fragment2, jsx as jsx12, jsxs as jsxs9 } from "react/jsx-runtime";
2330
+ var PAGE_HEADING_CLASS = "text-h1 text-ods-text-primary";
2331
+ var SECTION_HEADING_CLASS = "text-h2 text-ods-text-primary";
2332
+ var DESCRIPTION_CLASS = "mt-6 max-w-[640px] font-['DM_Sans'] text-[16px] md:text-[18px] leading-[24px] md:leading-[28px] text-ods-text-secondary";
2333
+ function PageHeading({
2334
+ children,
2335
+ as: Tag2 = "h1",
2336
+ description,
2337
+ className,
2338
+ descriptionClassName
2339
+ }) {
2340
+ const headingClass = className ? `${PAGE_HEADING_CLASS} ${className}` : PAGE_HEADING_CLASS;
2341
+ const descClass = descriptionClassName ? `${DESCRIPTION_CLASS} ${descriptionClassName}` : DESCRIPTION_CLASS;
2342
+ const hasDescription = description != null && description !== "" && typeof description !== "boolean";
2343
+ return /* @__PURE__ */ jsxs9(Fragment2, { children: [
2344
+ /* @__PURE__ */ jsx12(Tag2, { className: headingClass, children }),
2345
+ hasDescription && /* @__PURE__ */ jsx12("p", { className: descClass, children: description })
2346
+ ] });
2347
+ }
2348
+
2349
+ // src/components/features/video-ratio-tabs.tsx
2350
+ import { Fragment as Fragment3, jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
2333
2351
  var TAB_TRIGGER_CLASS = "rounded-none border-b-2 border-transparent data-[state=active]:border-ods-accent data-[state=active]:bg-transparent data-[state=active]:shadow-none px-4 py-2 text-sm text-ods-text-secondary data-[state=active]:text-ods-text-primary";
2334
2352
  var RATIO_GRID_CLASS = {
2335
2353
  portrait: "grid grid-cols-2 md:grid-cols-3 gap-4",
@@ -2354,17 +2372,17 @@ function RatioTabs({
2354
2372
  const activeTabs = RATIO_TAB_CONFIG.filter((t) => groups[t.key].count > 0);
2355
2373
  if (activeTabs.length <= 1) {
2356
2374
  const active = activeTabs[0];
2357
- return active ? /* @__PURE__ */ jsx12(Fragment2, { children: groups[active.key].render() }) : null;
2375
+ return active ? /* @__PURE__ */ jsx13(Fragment3, { children: groups[active.key].render() }) : null;
2358
2376
  }
2359
2377
  const firstTab = defaultTab && groups[defaultTab].count > 0 ? defaultTab : activeTabs[0].key;
2360
- return /* @__PURE__ */ jsxs9(Tabs, { defaultValue: firstTab, className: `w-full ${className}`, children: [
2361
- /* @__PURE__ */ jsx12(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0 mb-2", children: activeTabs.map((t) => /* @__PURE__ */ jsxs9(TabsTrigger, { value: t.key, className: TAB_TRIGGER_CLASS, children: [
2378
+ return /* @__PURE__ */ jsxs10(Tabs, { defaultValue: firstTab, className: `w-full ${className}`, children: [
2379
+ /* @__PURE__ */ jsx13(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0 mb-2", children: activeTabs.map((t) => /* @__PURE__ */ jsxs10(TabsTrigger, { value: t.key, className: TAB_TRIGGER_CLASS, children: [
2362
2380
  t.label,
2363
2381
  " (",
2364
2382
  groups[t.key].count,
2365
2383
  ")"
2366
2384
  ] }, t.key)) }),
2367
- activeTabs.map((t) => /* @__PURE__ */ jsx12(
2385
+ activeTabs.map((t) => /* @__PURE__ */ jsx13(
2368
2386
  TabsContent,
2369
2387
  {
2370
2388
  value: t.key,
@@ -2407,7 +2425,7 @@ function groupByAspectRatio(items, getAspectRatio) {
2407
2425
 
2408
2426
  // src/components/features/video-bites-display.tsx
2409
2427
  import { useMemo as useMemo4 } from "react";
2410
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
2428
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
2411
2429
  var RATIO_TO_CSS_ASPECT = {
2412
2430
  portrait: "9 / 16",
2413
2431
  square: "1 / 1",
@@ -2415,7 +2433,7 @@ var RATIO_TO_CSS_ASPECT = {
2415
2433
  };
2416
2434
  function LazyBite({ ratio, children }) {
2417
2435
  const { ref, isNear } = useNearViewport("500px");
2418
- return /* @__PURE__ */ jsx13("div", { ref, style: { aspectRatio: RATIO_TO_CSS_ASPECT[ratio] }, children: isNear ? children : /* @__PURE__ */ jsx13("div", { className: "w-full h-full bg-ods-card rounded-md" }) });
2436
+ return /* @__PURE__ */ jsx14("div", { ref, style: { aspectRatio: RATIO_TO_CSS_ASPECT[ratio] }, children: isNear ? children : /* @__PURE__ */ jsx14("div", { className: "w-full h-full bg-ods-card rounded-md" }) });
2419
2437
  }
2420
2438
  function VideoBitesDisplay({
2421
2439
  bites,
@@ -2438,27 +2456,27 @@ function VideoBitesDisplay({
2438
2456
  }, [bites, filterPublished]);
2439
2457
  const totalCount = grouped.portrait.length + grouped.square.length + grouped.landscape.length;
2440
2458
  if (totalCount === 0) return null;
2441
- return /* @__PURE__ */ jsxs10("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
2442
- showTitle && /* @__PURE__ */ jsx13("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: title }),
2443
- grouped.hasMultiple ? /* @__PURE__ */ jsx13(
2459
+ return /* @__PURE__ */ jsxs11("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
2460
+ showTitle && /* @__PURE__ */ jsx14("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: title }),
2461
+ grouped.hasMultiple ? /* @__PURE__ */ jsx14(
2444
2462
  RatioTabs,
2445
2463
  {
2446
2464
  groups: {
2447
2465
  portrait: {
2448
2466
  count: grouped.portrait.length,
2449
- render: () => /* @__PURE__ */ jsx13(BiteGrid, { bites: grouped.portrait, ratio: "portrait" })
2467
+ render: () => /* @__PURE__ */ jsx14(BiteGrid, { bites: grouped.portrait, ratio: "portrait" })
2450
2468
  },
2451
2469
  square: {
2452
2470
  count: grouped.square.length,
2453
- render: () => /* @__PURE__ */ jsx13(BiteGrid, { bites: grouped.square, ratio: "square" })
2471
+ render: () => /* @__PURE__ */ jsx14(BiteGrid, { bites: grouped.square, ratio: "square" })
2454
2472
  },
2455
2473
  landscape: {
2456
2474
  count: grouped.landscape.length,
2457
- render: () => /* @__PURE__ */ jsx13(BiteGrid, { bites: grouped.landscape, ratio: "landscape" })
2475
+ render: () => /* @__PURE__ */ jsx14(BiteGrid, { bites: grouped.landscape, ratio: "landscape" })
2458
2476
  }
2459
2477
  }
2460
2478
  }
2461
- ) : /* @__PURE__ */ jsx13(
2479
+ ) : /* @__PURE__ */ jsx14(
2462
2480
  BiteGrid,
2463
2481
  {
2464
2482
  bites: grouped.portrait.length > 0 ? grouped.portrait : grouped.square.length > 0 ? grouped.square : grouped.landscape,
@@ -2468,17 +2486,17 @@ function VideoBitesDisplay({
2468
2486
  ] });
2469
2487
  }
2470
2488
  function BiteGrid({ bites, ratio }) {
2471
- return /* @__PURE__ */ jsx13("div", { className: RATIO_DISPLAY_GRID_CLASS[ratio], children: bites.map((bite, index) => /* @__PURE__ */ jsx13(LazyBite, { ratio, children: /* @__PURE__ */ jsx13(VideoBiteCard, { url: bite.url, title: bite.title, thumbnailUrl: bite.thumbnail_url }) }, bite.url || index)) });
2489
+ return /* @__PURE__ */ jsx14("div", { className: RATIO_DISPLAY_GRID_CLASS[ratio], children: bites.map((bite, index) => /* @__PURE__ */ jsx14(LazyBite, { ratio, children: /* @__PURE__ */ jsx14(VideoBiteCard, { url: bite.url, title: bite.title, thumbnailUrl: bite.thumbnail_url }) }, bite.url || index)) });
2472
2490
  }
2473
2491
  function VideoBiteCard({ url, title, thumbnailUrl }) {
2474
- return /* @__PURE__ */ jsxs10(Card, { className: "overflow-hidden border border-ods-border bg-ods-card hover:border-ods-accent transition-colors flex flex-col h-full", children: [
2475
- /* @__PURE__ */ jsx13("div", { className: "relative flex-1 min-h-0", children: /* @__PURE__ */ jsx13(Video, { url, poster: thumbnailUrl || void 0, layout: "fill" }) }),
2476
- title && /* @__PURE__ */ jsx13("div", { className: "p-4", children: /* @__PURE__ */ jsx13("p", { className: "text-h4 text-ods-text-primary line-clamp-2", title, children: title }) })
2492
+ return /* @__PURE__ */ jsxs11(Card, { className: "overflow-hidden border border-ods-border bg-ods-card hover:border-ods-accent transition-colors flex flex-col h-full", children: [
2493
+ /* @__PURE__ */ jsx14("div", { className: "relative flex-1 min-h-0", children: /* @__PURE__ */ jsx14(Video, { url, poster: thumbnailUrl || void 0, layout: "fill" }) }),
2494
+ title && /* @__PURE__ */ jsx14("div", { className: "p-4", children: /* @__PURE__ */ jsx14("p", { className: "text-h4 text-ods-text-primary line-clamp-2", title, children: title }) })
2477
2495
  ] });
2478
2496
  }
2479
2497
 
2480
2498
  // src/components/features/entity-video-section.tsx
2481
- import { Fragment as Fragment3, jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
2499
+ import { Fragment as Fragment4, jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
2482
2500
  function EntityVideoSection({
2483
2501
  mainVideoUrl,
2484
2502
  youtubeUrl,
@@ -2503,10 +2521,10 @@ function EntityVideoSection({
2503
2521
  }
2504
2522
  const fullVideoUrl = youtubeUrl || mainVideoUrl || null;
2505
2523
  const fullVideoKind = youtubeUrl ? "youtube" : "auto";
2506
- return /* @__PURE__ */ jsxs11(Fragment3, { children: [
2507
- hasVideo && (hasFullVideo && hasHighlight ? /* @__PURE__ */ jsxs11(Tabs, { defaultValue: "full-video", className: "w-full", children: [
2508
- /* @__PURE__ */ jsxs11(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0", children: [
2509
- /* @__PURE__ */ jsx14(
2524
+ return /* @__PURE__ */ jsxs12(Fragment4, { children: [
2525
+ hasVideo && (hasFullVideo && hasHighlight ? /* @__PURE__ */ jsxs12(Tabs, { defaultValue: "full-video", className: "w-full", children: [
2526
+ /* @__PURE__ */ jsxs12(TabsList, { className: "inline-flex justify-start rounded-none bg-transparent h-auto p-0 gap-0", children: [
2527
+ /* @__PURE__ */ jsx15(
2510
2528
  TabsTrigger,
2511
2529
  {
2512
2530
  value: "full-video",
@@ -2514,7 +2532,7 @@ function EntityVideoSection({
2514
2532
  children: "Full Video"
2515
2533
  }
2516
2534
  ),
2517
- /* @__PURE__ */ jsx14(
2535
+ /* @__PURE__ */ jsx15(
2518
2536
  TabsTrigger,
2519
2537
  {
2520
2538
  value: "highlights",
@@ -2523,7 +2541,7 @@ function EntityVideoSection({
2523
2541
  }
2524
2542
  )
2525
2543
  ] }),
2526
- /* @__PURE__ */ jsx14(TabsContent, { value: "full-video", className: "mt-4", children: /* @__PURE__ */ jsx14(
2544
+ /* @__PURE__ */ jsx15(TabsContent, { value: "full-video", className: "mt-4", children: /* @__PURE__ */ jsx15(
2527
2545
  Video,
2528
2546
  {
2529
2547
  kind: fullVideoKind,
@@ -2536,7 +2554,7 @@ function EntityVideoSection({
2536
2554
  priority
2537
2555
  }
2538
2556
  ) }),
2539
- /* @__PURE__ */ jsx14(TabsContent, { value: "highlights", className: "mt-4", children: /* @__PURE__ */ jsx14(
2557
+ /* @__PURE__ */ jsx15(TabsContent, { value: "highlights", className: "mt-4", children: /* @__PURE__ */ jsx15(
2540
2558
  Video,
2541
2559
  {
2542
2560
  url: highlightVideoUrl,
@@ -2544,7 +2562,7 @@ function EntityVideoSection({
2544
2562
  layout: "centered"
2545
2563
  }
2546
2564
  ) })
2547
- ] }) : hasFullVideo ? /* @__PURE__ */ jsx14(
2565
+ ] }) : hasFullVideo ? /* @__PURE__ */ jsx15(
2548
2566
  Video,
2549
2567
  {
2550
2568
  kind: fullVideoKind,
@@ -2556,7 +2574,7 @@ function EntityVideoSection({
2556
2574
  layout: "centered",
2557
2575
  priority
2558
2576
  }
2559
- ) : /* @__PURE__ */ jsx14(
2577
+ ) : /* @__PURE__ */ jsx15(
2560
2578
  Video,
2561
2579
  {
2562
2580
  url: highlightVideoUrl,
@@ -2565,11 +2583,11 @@ function EntityVideoSection({
2565
2583
  priority
2566
2584
  }
2567
2585
  )),
2568
- videoSummary && MarkdownRenderer && /* @__PURE__ */ jsxs11("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
2569
- /* @__PURE__ */ jsx14("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: "Summary" }),
2570
- /* @__PURE__ */ jsx14("div", { className: "text-h4 text-ods-text-primary break-words overflow-hidden", children: /* @__PURE__ */ jsx14(MarkdownRenderer, { content: videoSummary }) })
2586
+ videoSummary && MarkdownRenderer && /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-6 w-full min-w-0", children: [
2587
+ /* @__PURE__ */ jsx15("h2", { className: `${SECTION_HEADING_CLASS} break-words`, children: "Summary" }),
2588
+ /* @__PURE__ */ jsx15("div", { className: "text-h4 text-ods-text-primary break-words overflow-hidden", children: /* @__PURE__ */ jsx15(MarkdownRenderer, { content: videoSummary }) })
2571
2589
  ] }),
2572
- videoBites && videoBites.length > 0 && /* @__PURE__ */ jsx14(
2590
+ videoBites && videoBites.length > 0 && /* @__PURE__ */ jsx15(
2573
2591
  VideoBitesDisplay,
2574
2592
  {
2575
2593
  bites: videoBites,
@@ -2654,7 +2672,7 @@ function useEntityCardPlaceholder({
2654
2672
  }
2655
2673
 
2656
2674
  // src/components/chat/entity-cards/onboarding-guide-card.tsx
2657
- import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
2675
+ import { jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
2658
2676
  function stripMarkdownPreview(text) {
2659
2677
  return text.replace(/```[\s\S]*?```/g, " ").replace(/^#{1,6}\s+/gm, "").replace(/!?\[([^\]]*)\]\([^)]*\)/g, "$1").replace(/[*_~`>]/g, "").replace(/^\s*[-+]\s+/gm, "").replace(/-{3,}/g, " ").replace(/\s+/g, " ").trim().replace(/^([\s\S]{240})[\s\S]+$/, "$1\u2026");
2660
2678
  }
@@ -2668,64 +2686,64 @@ var HORIZONTAL_SIZE_TOKENS = {
2668
2686
  };
2669
2687
  function OnboardingGuideCardSkeleton({ size = "default" }) {
2670
2688
  if (size === "catalog") {
2671
- return /* @__PURE__ */ jsxs12("div", { className: "bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse", children: [
2672
- /* @__PURE__ */ jsxs12("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2673
- /* @__PURE__ */ jsx15("div", { className: "w-full md:w-[256px] aspect-[1200/630] bg-ods-border rounded-lg flex-shrink-0" }),
2674
- /* @__PURE__ */ jsxs12("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2675
- /* @__PURE__ */ jsxs12("div", { className: "min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3", children: [
2676
- /* @__PURE__ */ jsx15("div", { className: "h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" }),
2677
- /* @__PURE__ */ jsx15("div", { className: "h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" })
2689
+ return /* @__PURE__ */ jsxs13("div", { className: "bg-ods-system-greys-black border border-ods-border rounded-lg overflow-hidden flex flex-col p-6 gap-4 animate-pulse", children: [
2690
+ /* @__PURE__ */ jsxs13("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2691
+ /* @__PURE__ */ jsx16("div", { className: "w-full md:w-[256px] aspect-[1200/630] bg-ods-border rounded-lg flex-shrink-0" }),
2692
+ /* @__PURE__ */ jsxs13("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2693
+ /* @__PURE__ */ jsxs13("div", { className: "min-h-[60px] md:min-h-[72px] flex flex-col gap-1.5 justify-start mb-3", children: [
2694
+ /* @__PURE__ */ jsx16("div", { className: "h-[25px] md:h-[30px] w-3/4 bg-ods-border rounded" }),
2695
+ /* @__PURE__ */ jsx16("div", { className: "h-[25px] md:h-[30px] w-1/2 bg-ods-border rounded" })
2678
2696
  ] }),
2679
- /* @__PURE__ */ jsxs12("div", { className: "min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start", children: [
2680
- /* @__PURE__ */ jsx15("div", { className: "h-3 w-full bg-ods-border/70 rounded" }),
2681
- /* @__PURE__ */ jsx15("div", { className: "h-3 w-5/6 bg-ods-border/70 rounded" })
2697
+ /* @__PURE__ */ jsxs13("div", { className: "min-h-[46px] md:min-h-[52px] flex flex-col gap-2 justify-start", children: [
2698
+ /* @__PURE__ */ jsx16("div", { className: "h-3 w-full bg-ods-border/70 rounded" }),
2699
+ /* @__PURE__ */ jsx16("div", { className: "h-3 w-5/6 bg-ods-border/70 rounded" })
2682
2700
  ] })
2683
2701
  ] })
2684
2702
  ] }),
2685
- /* @__PURE__ */ jsxs12("div", { className: "grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full", children: [
2686
- [0, 1].map((i) => /* @__PURE__ */ jsx15(
2703
+ /* @__PURE__ */ jsxs13("div", { className: "grid grid-cols-1 md:grid-cols-3 border border-ods-border rounded-md overflow-hidden w-full", children: [
2704
+ [0, 1].map((i) => /* @__PURE__ */ jsx16(
2687
2705
  "div",
2688
2706
  {
2689
2707
  className: "bg-ods-card p-4 flex flex-col gap-3 border-b md:border-b-0 md:border-r border-ods-border",
2690
- children: /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-2", children: [
2691
- /* @__PURE__ */ jsx15("div", { className: "h-6 w-32 bg-ods-bg rounded" }),
2692
- /* @__PURE__ */ jsx15("div", { className: "h-3 w-20 bg-ods-bg/60 rounded" })
2708
+ children: /* @__PURE__ */ jsxs13("div", { className: "flex flex-col gap-2", children: [
2709
+ /* @__PURE__ */ jsx16("div", { className: "h-6 w-32 bg-ods-bg rounded" }),
2710
+ /* @__PURE__ */ jsx16("div", { className: "h-3 w-20 bg-ods-bg/60 rounded" })
2693
2711
  ] })
2694
2712
  },
2695
2713
  `cell-${i}`
2696
2714
  )),
2697
- /* @__PURE__ */ jsxs12("div", { className: "bg-ods-card p-4 flex items-center gap-3", children: [
2698
- /* @__PURE__ */ jsx15("div", { className: "h-10 w-10 rounded-full bg-ods-bg shrink-0" }),
2699
- /* @__PURE__ */ jsxs12("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2700
- /* @__PURE__ */ jsx15("div", { className: "h-4 w-3/4 bg-ods-bg rounded" }),
2701
- /* @__PURE__ */ jsx15("div", { className: "h-3 w-1/2 bg-ods-bg/60 rounded" })
2715
+ /* @__PURE__ */ jsxs13("div", { className: "bg-ods-card p-4 flex items-center gap-3", children: [
2716
+ /* @__PURE__ */ jsx16("div", { className: "h-10 w-10 rounded-full bg-ods-bg shrink-0" }),
2717
+ /* @__PURE__ */ jsxs13("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2718
+ /* @__PURE__ */ jsx16("div", { className: "h-4 w-3/4 bg-ods-bg rounded" }),
2719
+ /* @__PURE__ */ jsx16("div", { className: "h-3 w-1/2 bg-ods-bg/60 rounded" })
2702
2720
  ] })
2703
2721
  ] })
2704
2722
  ] })
2705
2723
  ] });
2706
2724
  }
2707
2725
  if (size === "sm") {
2708
- return /* @__PURE__ */ jsxs12("span", { className: COMPACT_CARD_SKELETON_OUTER, children: [
2709
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_SKELETON_IMAGE_SLOT }),
2710
- /* @__PURE__ */ jsxs12("span", { className: COMPACT_CARD_TEXT_COL, children: [
2711
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx15("span", { className: "h-3.5 w-3/5 rounded bg-ods-bg" }) }),
2712
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx15("span", { className: "h-3 w-2/5 rounded bg-ods-bg/70" }) }),
2713
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx15("span", { className: "h-3 w-11/12 rounded bg-ods-bg/40" }) })
2726
+ return /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_SKELETON_OUTER, children: [
2727
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_SKELETON_IMAGE_SLOT }),
2728
+ /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_TEXT_COL, children: [
2729
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx16("span", { className: "h-3.5 w-3/5 rounded bg-ods-bg" }) }),
2730
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: "h-3 w-2/5 rounded bg-ods-bg/70" }) }),
2731
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: "h-3 w-11/12 rounded bg-ods-bg/40" }) })
2714
2732
  ] }),
2715
- /* @__PURE__ */ jsx15("span", { className: "flex shrink-0 items-center self-start h-5", children: /* @__PURE__ */ jsx15("span", { className: "h-3.5 w-3.5 rounded bg-ods-bg" }) })
2733
+ /* @__PURE__ */ jsx16("span", { className: "flex shrink-0 items-center self-start h-5", children: /* @__PURE__ */ jsx16("span", { className: "h-3.5 w-3.5 rounded bg-ods-bg" }) })
2716
2734
  ] });
2717
2735
  }
2718
2736
  const t = HORIZONTAL_SIZE_TOKENS.default;
2719
- return /* @__PURE__ */ jsxs12(
2737
+ return /* @__PURE__ */ jsxs13(
2720
2738
  "span",
2721
2739
  {
2722
2740
  className: `flex items-start gap-3 rounded-md border border-ods-border bg-ods-card ${t.padding} animate-pulse`,
2723
2741
  children: [
2724
- /* @__PURE__ */ jsx15("span", { className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}` }),
2725
- /* @__PURE__ */ jsxs12("span", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2726
- /* @__PURE__ */ jsx15("span", { className: "block h-4 w-2/3 rounded bg-ods-bg" }),
2727
- /* @__PURE__ */ jsx15("span", { className: "block h-3 w-1/3 rounded bg-ods-bg/70" }),
2728
- /* @__PURE__ */ jsx15("span", { className: "block h-3 w-full rounded bg-ods-bg/40" })
2742
+ /* @__PURE__ */ jsx16("span", { className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-bg ${t.step}` }),
2743
+ /* @__PURE__ */ jsxs13("span", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
2744
+ /* @__PURE__ */ jsx16("span", { className: "block h-4 w-2/3 rounded bg-ods-bg" }),
2745
+ /* @__PURE__ */ jsx16("span", { className: "block h-3 w-1/3 rounded bg-ods-bg/70" }),
2746
+ /* @__PURE__ */ jsx16("span", { className: "block h-3 w-full rounded bg-ods-bg/40" })
2729
2747
  ] })
2730
2748
  ]
2731
2749
  }
@@ -2757,7 +2775,7 @@ function OnboardingGuideCard({
2757
2775
  const hasVideoCover = !!(guide.main_video_thumbnail || guide.highlight_video_thumbnail);
2758
2776
  const stepLabel = typeof guide.step_order === "number" ? String(guide.step_order).padStart(2, "0") : "\u2014";
2759
2777
  const durationLabel = typeof guide.highlight_video_duration_ms === "number" && guide.highlight_video_duration_ms > 0 ? formatDurationMMSS(Math.floor(guide.highlight_video_duration_ms / 1e3)) : "";
2760
- return /* @__PURE__ */ jsx15(
2778
+ return /* @__PURE__ */ jsx16(
2761
2779
  next_link_default,
2762
2780
  {
2763
2781
  href,
@@ -2773,10 +2791,10 @@ function OnboardingGuideCard({
2773
2791
  className
2774
2792
  ),
2775
2793
  "aria-label": `Open ${guide.title}`,
2776
- children: /* @__PURE__ */ jsxs12("div", { className: "flex flex-col p-6 gap-4", children: [
2777
- /* @__PURE__ */ jsxs12("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2778
- /* @__PURE__ */ jsx15("div", { className: "w-full md:w-[256px] flex-shrink-0", children: /* @__PURE__ */ jsxs12("div", { className: "relative rounded-lg overflow-hidden w-full aspect-[1200/630] bg-ods-bg", children: [
2779
- coverImage ? /* @__PURE__ */ jsx15(
2794
+ children: /* @__PURE__ */ jsxs13("div", { className: "flex flex-col p-6 gap-4", children: [
2795
+ /* @__PURE__ */ jsxs13("div", { className: "flex flex-col md:flex-row gap-4 md:gap-6", children: [
2796
+ /* @__PURE__ */ jsx16("div", { className: "w-full md:w-[256px] flex-shrink-0", children: /* @__PURE__ */ jsxs13("div", { className: "relative rounded-lg overflow-hidden w-full aspect-[1200/630] bg-ods-bg", children: [
2797
+ coverImage ? /* @__PURE__ */ jsx16(
2780
2798
  next_image_default,
2781
2799
  {
2782
2800
  src: coverImage,
@@ -2786,7 +2804,7 @@ function OnboardingGuideCard({
2786
2804
  className: "object-cover",
2787
2805
  unoptimized: true
2788
2806
  }
2789
- ) : /* @__PURE__ */ jsx15(
2807
+ ) : /* @__PURE__ */ jsx16(
2790
2808
  BlogImagePlaceholder,
2791
2809
  {
2792
2810
  title: guide.title,
@@ -2794,18 +2812,18 @@ function OnboardingGuideCard({
2794
2812
  className: "absolute inset-0"
2795
2813
  }
2796
2814
  ),
2797
- hasVideoCover && coverImage && /* @__PURE__ */ jsx15("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx15(Play, { className: "w-10 h-10 text-white", fill: "white" }) }),
2798
- durationLabel && /* @__PURE__ */ jsxs12("span", { className: "absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono", children: [
2799
- /* @__PURE__ */ jsx15(Clock, { className: "w-3 h-3" }),
2815
+ hasVideoCover && coverImage && /* @__PURE__ */ jsx16("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx16(Play, { className: "w-10 h-10 text-white", fill: "white" }) }),
2816
+ durationLabel && /* @__PURE__ */ jsxs13("span", { className: "absolute bottom-2 right-2 inline-flex items-center gap-1 px-2 py-1 rounded bg-black/60 text-white text-xs font-medium font-mono", children: [
2817
+ /* @__PURE__ */ jsx16(Clock, { className: "w-3 h-3" }),
2800
2818
  durationLabel
2801
2819
  ] })
2802
2820
  ] }) }),
2803
- /* @__PURE__ */ jsxs12("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2804
- /* @__PURE__ */ jsx15("div", { className: "min-h-[60px] md:min-h-[72px] flex items-start mb-3", children: /* @__PURE__ */ jsx15("h3", { className: "font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2", children: guide.title }) }),
2805
- /* @__PURE__ */ jsx15("div", { className: "min-h-[46px] md:min-h-[52px]", children: /* @__PURE__ */ jsx15("p", { className: "font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2", children: stripMarkdownPreview(guide.video_summary || guide.content || "") }) })
2821
+ /* @__PURE__ */ jsxs13("div", { className: "flex-1 min-w-0 flex flex-col", children: [
2822
+ /* @__PURE__ */ jsx16("div", { className: "min-h-[60px] md:min-h-[72px] flex items-start mb-3", children: /* @__PURE__ */ jsx16("h3", { className: "font-['Azeret_Mono'] font-semibold text-xl md:text-2xl text-ods-text-primary leading-tight line-clamp-2", children: guide.title }) }),
2823
+ /* @__PURE__ */ jsx16("div", { className: "min-h-[46px] md:min-h-[52px]", children: /* @__PURE__ */ jsx16("p", { className: "font-['DM_Sans'] text-sm md:text-base text-ods-text-secondary leading-relaxed line-clamp-2", children: stripMarkdownPreview(guide.video_summary || guide.content || "") }) })
2806
2824
  ] })
2807
2825
  ] }),
2808
- /* @__PURE__ */ jsx15(
2826
+ /* @__PURE__ */ jsx16(
2809
2827
  EntityAuthorCard,
2810
2828
  {
2811
2829
  author: guide.author,
@@ -2835,9 +2853,9 @@ function OnboardingGuideCard({
2835
2853
  guide.section,
2836
2854
  author
2837
2855
  ].filter((s) => typeof s === "string" && s.length > 0);
2838
- return /* @__PURE__ */ jsxs12(next_link_default, { href, target, rel, prefetch: false, className: cn(COMPACT_CARD_OUTER, className), children: [
2839
- /* @__PURE__ */ jsxs12("span", { className: COMPACT_CARD_IMAGE_SLOT, children: [
2840
- compactCover ? /* @__PURE__ */ jsx15(
2856
+ return /* @__PURE__ */ jsxs13(next_link_default, { href, target, rel, prefetch: false, className: cn(COMPACT_CARD_OUTER, className), children: [
2857
+ /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_IMAGE_SLOT, children: [
2858
+ compactCover ? /* @__PURE__ */ jsx16(
2841
2859
  next_image_default,
2842
2860
  {
2843
2861
  src: compactCover,
@@ -2847,20 +2865,20 @@ function OnboardingGuideCard({
2847
2865
  className: "object-contain",
2848
2866
  unoptimized: true
2849
2867
  }
2850
- ) : /* @__PURE__ */ jsx15("span", { className: "flex h-full w-full items-center justify-center text-ods-accent", children: /* @__PURE__ */ jsx15(GraduationCap, { className: "w-4 h-4" }) }),
2851
- hasVideoCover && compactCover && /* @__PURE__ */ jsx15("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx15(Play, { className: "h-4 w-4 text-white", fill: "white" }) })
2868
+ ) : /* @__PURE__ */ jsx16("span", { className: "flex h-full w-full items-center justify-center text-ods-accent", children: /* @__PURE__ */ jsx16(GraduationCap, { className: "w-4 h-4" }) }),
2869
+ hasVideoCover && compactCover && /* @__PURE__ */ jsx16("span", { className: "absolute inset-0 flex items-center justify-center bg-black/30", children: /* @__PURE__ */ jsx16(Play, { className: "h-4 w-4 text-white", fill: "white" }) })
2852
2870
  ] }),
2853
- /* @__PURE__ */ jsxs12("span", { className: COMPACT_CARD_TEXT_COL, children: [
2854
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx15("span", { className: cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']"), children: guide.title }) }),
2855
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx15("span", { className: "truncate text-[11px] leading-4 text-[var(--color-accent-primary)]", children: subtitleParts.join(" \xB7 ") }) }),
2856
- /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx15("span", { className: COMPACT_CARD_SUMMARY, children: summary2 || COMPACT_CARD_ROW_FILLER }) })
2871
+ /* @__PURE__ */ jsxs13("span", { className: COMPACT_CARD_TEXT_COL, children: [
2872
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_TITLE_ROW, children: /* @__PURE__ */ jsx16("span", { className: cn(COMPACT_CARD_TITLE, "font-['Azeret_Mono']"), children: guide.title }) }),
2873
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: "truncate text-[11px] leading-4 text-[var(--color-accent-primary)]", children: subtitleParts.join(" \xB7 ") }) }),
2874
+ /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_META_ROW_BOX, children: /* @__PURE__ */ jsx16("span", { className: COMPACT_CARD_SUMMARY, children: summary2 || COMPACT_CARD_ROW_FILLER }) })
2857
2875
  ] }),
2858
- /* @__PURE__ */ jsx15("span", { className: "flex shrink-0 items-center self-start h-5 text-ods-text-secondary", children: /* @__PURE__ */ jsx15(ExternalLink, { className: "w-3.5 h-3.5" }) })
2876
+ /* @__PURE__ */ jsx16("span", { className: "flex shrink-0 items-center self-start h-5 text-ods-text-secondary", children: /* @__PURE__ */ jsx16(ExternalLink, { className: "w-3.5 h-3.5" }) })
2859
2877
  ] });
2860
2878
  }
2861
2879
  const t = HORIZONTAL_SIZE_TOKENS.default;
2862
2880
  const summary = stripMarkdownPreview(guide.video_summary || guide.content || "");
2863
- return /* @__PURE__ */ jsxs12(
2881
+ return /* @__PURE__ */ jsxs13(
2864
2882
  next_link_default,
2865
2883
  {
2866
2884
  href,
@@ -2872,7 +2890,7 @@ function OnboardingGuideCard({
2872
2890
  className
2873
2891
  ),
2874
2892
  children: [
2875
- /* @__PURE__ */ jsx15(
2893
+ /* @__PURE__ */ jsx16(
2876
2894
  "span",
2877
2895
  {
2878
2896
  className: `shrink-0 inline-flex items-center justify-center rounded-full bg-ods-accent/10 text-ods-accent font-semibold ${t.step}`,
@@ -2880,13 +2898,13 @@ function OnboardingGuideCard({
2880
2898
  children: guide.step_order
2881
2899
  }
2882
2900
  ),
2883
- /* @__PURE__ */ jsxs12("span", { className: "flex flex-col gap-0.5 flex-1 min-w-0", children: [
2884
- /* @__PURE__ */ jsx15("span", { className: `block ${t.title} text-ods-text-primary truncate`, children: guide.title }),
2885
- /* @__PURE__ */ jsxs12("span", { className: "inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary", children: [
2886
- /* @__PURE__ */ jsx15(GraduationCap, { className: "h-3 w-3 shrink-0" }),
2887
- /* @__PURE__ */ jsx15("span", { className: "truncate", children: guide.section })
2901
+ /* @__PURE__ */ jsxs13("span", { className: "flex flex-col gap-0.5 flex-1 min-w-0", children: [
2902
+ /* @__PURE__ */ jsx16("span", { className: `block ${t.title} text-ods-text-primary truncate`, children: guide.title }),
2903
+ /* @__PURE__ */ jsxs13("span", { className: "inline-flex items-center gap-1 font-['DM_Sans'] text-[12px] leading-[16px] text-ods-text-secondary", children: [
2904
+ /* @__PURE__ */ jsx16(GraduationCap, { className: "h-3 w-3 shrink-0" }),
2905
+ /* @__PURE__ */ jsx16("span", { className: "truncate", children: guide.section })
2888
2906
  ] }),
2889
- summary && /* @__PURE__ */ jsx15("span", { className: `font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`, children: summary })
2907
+ summary && /* @__PURE__ */ jsx16("span", { className: `font-['DM_Sans'] text-[14px] leading-[20px] text-ods-text-secondary ${t.summaryClamp}`, children: summary })
2890
2908
  ] })
2891
2909
  ]
2892
2910
  }
@@ -3305,7 +3323,7 @@ function resolveSourceIcon(input, ctx = {}) {
3305
3323
  init_cn();
3306
3324
  import React11 from "react";
3307
3325
  init_button();
3308
- import { Fragment as Fragment4, jsx as jsx16, jsxs as jsxs13 } from "react/jsx-runtime";
3326
+ import { Fragment as Fragment5, jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
3309
3327
  function actionKey(action, idx) {
3310
3328
  return `${action.label ?? action.ariaLabel ?? "action"}-${idx}`;
3311
3329
  }
@@ -3337,7 +3355,7 @@ function actionToMenuItems(action, idx) {
3337
3355
  }
3338
3356
  function renderActionButton(action, opts = {}) {
3339
3357
  if (action.iconAction) {
3340
- return /* @__PURE__ */ jsx16(
3358
+ return /* @__PURE__ */ jsx17(
3341
3359
  SplitButton,
3342
3360
  {
3343
3361
  variant: action.variant ?? void 0,
@@ -3355,18 +3373,18 @@ function renderActionButton(action, opts = {}) {
3355
3373
  );
3356
3374
  }
3357
3375
  if (action.submenu && action.submenu.length > 0) {
3358
- return /* @__PURE__ */ jsx16(
3376
+ return /* @__PURE__ */ jsx17(
3359
3377
  ActionsMenuDropdown,
3360
3378
  {
3361
3379
  groups: [{ items: action.submenu }],
3362
- customTrigger: /* @__PURE__ */ jsx16(
3380
+ customTrigger: /* @__PURE__ */ jsx17(
3363
3381
  Button,
3364
3382
  {
3365
3383
  variant: "outline",
3366
3384
  disabled: action.disabled,
3367
3385
  loading: action.loading,
3368
3386
  leftIcon: action.icon,
3369
- splitIcon: /* @__PURE__ */ jsx16(Chevron02DownIcon, { className: "h-4 w-4" }),
3387
+ splitIcon: /* @__PURE__ */ jsx17(Chevron02DownIcon, { className: "h-4 w-4" }),
3370
3388
  className: opts.fullWidth ? "flex-1" : void 0,
3371
3389
  children: action.label
3372
3390
  }
@@ -3376,8 +3394,8 @@ function renderActionButton(action, opts = {}) {
3376
3394
  }
3377
3395
  const isIconOnly = opts.iconOnly || !action.label || action.iconOnlyOnDesktop;
3378
3396
  if (isIconOnly) {
3379
- const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */ jsx16("span", { className: "inline-flex [&_svg]:!text-ods-text-primary", children: action.icon }) : action.icon;
3380
- return /* @__PURE__ */ jsx16(
3397
+ const iconNode = action.iconOnlyOnDesktop ? /* @__PURE__ */ jsx17("span", { className: "inline-flex [&_svg]:!text-ods-text-primary", children: action.icon }) : action.icon;
3398
+ return /* @__PURE__ */ jsx17(
3381
3399
  Button,
3382
3400
  {
3383
3401
  variant: action.variant,
@@ -3393,7 +3411,7 @@ function renderActionButton(action, opts = {}) {
3393
3411
  }
3394
3412
  );
3395
3413
  }
3396
- return /* @__PURE__ */ jsx16(
3414
+ return /* @__PURE__ */ jsx17(
3397
3415
  Button,
3398
3416
  {
3399
3417
  variant: action.variant,
@@ -3418,12 +3436,12 @@ function PageActions({
3418
3436
  className
3419
3437
  }) {
3420
3438
  if (variant === "icon-buttons") {
3421
- return /* @__PURE__ */ jsx16(IconButtonsVariant, { actions, menuActions, selector, className });
3439
+ return /* @__PURE__ */ jsx17(IconButtonsVariant, { actions, menuActions, selector, className });
3422
3440
  }
3423
3441
  if (variant === "menu-primary") {
3424
- return /* @__PURE__ */ jsx16(MenuPrimaryVariant, { actions, menuActions: menuActions || [], selector, className });
3442
+ return /* @__PURE__ */ jsx17(MenuPrimaryVariant, { actions, menuActions: menuActions || [], selector, className });
3425
3443
  }
3426
- return /* @__PURE__ */ jsx16(PrimaryButtonsVariant, { actions, className });
3444
+ return /* @__PURE__ */ jsx17(PrimaryButtonsVariant, { actions, className });
3427
3445
  }
3428
3446
  function IconButtonsVariant({
3429
3447
  actions,
@@ -3436,13 +3454,13 @@ function IconButtonsVariant({
3436
3454
  const isSingleAction = actions.length === 1 && !actions[0].submenu?.length;
3437
3455
  const singleAction = isSingleAction ? actions[0] : null;
3438
3456
  const useSingleActionMobile = isSingleAction && !hasMenuActions;
3439
- return /* @__PURE__ */ jsxs13(Fragment4, { children: [
3440
- /* @__PURE__ */ jsxs13("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
3457
+ return /* @__PURE__ */ jsxs14(Fragment5, { children: [
3458
+ /* @__PURE__ */ jsxs14("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
3441
3459
  selector,
3442
- desktopActions.map((action, idx) => /* @__PURE__ */ jsx16(React11.Fragment, { children: renderActionButton(action) }, actionKey(action, idx))),
3443
- hasMenuActions && /* @__PURE__ */ jsx16(ActionsMenuDropdown, { groups: menuActions })
3460
+ desktopActions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton(action) }, actionKey(action, idx))),
3461
+ hasMenuActions && /* @__PURE__ */ jsx17(ActionsMenuDropdown, { groups: menuActions })
3444
3462
  ] }),
3445
- /* @__PURE__ */ jsx16("div", { className: cn("flex md:hidden", className), children: useSingleActionMobile && singleAction ? renderActionButton(singleAction, { iconOnly: true }) : /* @__PURE__ */ jsx16(
3463
+ /* @__PURE__ */ jsx17("div", { className: cn("flex md:hidden", className), children: useSingleActionMobile && singleAction ? renderActionButton(singleAction, { iconOnly: true }) : /* @__PURE__ */ jsx17(
3446
3464
  ActionsMenuDropdown,
3447
3465
  {
3448
3466
  groups: [
@@ -3463,9 +3481,9 @@ function PrimaryButtonsVariant({
3463
3481
  return 0;
3464
3482
  });
3465
3483
  const desktopActions = sortedActions.filter((a) => !a.showOnlyMobile);
3466
- return /* @__PURE__ */ jsxs13(Fragment4, { children: [
3467
- /* @__PURE__ */ jsx16("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: desktopActions.map((action, idx) => /* @__PURE__ */ jsx16(React11.Fragment, { children: renderActionButton(action) }, `desktop-${actionKey(action, idx)}`)) }),
3468
- /* @__PURE__ */ jsx16(MobileBottomActions, { actions: sortedActions })
3484
+ return /* @__PURE__ */ jsxs14(Fragment5, { children: [
3485
+ /* @__PURE__ */ jsx17("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: desktopActions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton(action) }, `desktop-${actionKey(action, idx)}`)) }),
3486
+ /* @__PURE__ */ jsx17(MobileBottomActions, { actions: sortedActions })
3469
3487
  ] });
3470
3488
  }
3471
3489
  function MenuPrimaryVariant({
@@ -3476,13 +3494,13 @@ function MenuPrimaryVariant({
3476
3494
  }) {
3477
3495
  const desktopActions = actions.filter((a) => !a.showOnlyMobile);
3478
3496
  const hasMenuActions = menuActions.some((g) => g.items.length > 0);
3479
- return /* @__PURE__ */ jsxs13(Fragment4, { children: [
3480
- /* @__PURE__ */ jsxs13("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
3497
+ return /* @__PURE__ */ jsxs14(Fragment5, { children: [
3498
+ /* @__PURE__ */ jsxs14("div", { className: cn("hidden md:flex items-center", ACTIONS_GAP, className), children: [
3481
3499
  selector,
3482
- hasMenuActions && /* @__PURE__ */ jsx16(ActionsMenuDropdown, { groups: menuActions }),
3483
- desktopActions.map((action, idx) => /* @__PURE__ */ jsx16(React11.Fragment, { children: renderActionButton({ ...action, variant: action.variant || "accent" }) }, `desktop-${actionKey(action, idx)}`))
3500
+ hasMenuActions && /* @__PURE__ */ jsx17(ActionsMenuDropdown, { groups: menuActions }),
3501
+ desktopActions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton({ ...action, variant: action.variant || "accent" }) }, `desktop-${actionKey(action, idx)}`))
3484
3502
  ] }),
3485
- /* @__PURE__ */ jsx16("div", { className: cn("flex md:hidden", className), children: /* @__PURE__ */ jsx16(
3503
+ /* @__PURE__ */ jsx17("div", { className: cn("flex md:hidden", className), children: /* @__PURE__ */ jsx17(
3486
3504
  ActionsMenuDropdown,
3487
3505
  {
3488
3506
  groups: [
@@ -3494,25 +3512,63 @@ function MenuPrimaryVariant({
3494
3512
  ] });
3495
3513
  }
3496
3514
  function MobileBottomActions({ actions }) {
3497
- return /* @__PURE__ */ jsx16("div", { className: cn(
3515
+ return /* @__PURE__ */ jsx17("div", { className: cn(
3498
3516
  "fixed md:hidden bottom-0 left-0 right-0 z-50",
3499
3517
  "bg-ods-card border-t border-ods-border",
3500
3518
  "flex items-start pt-6 pb-6 px-6",
3501
3519
  ACTIONS_GAP
3502
- ), children: actions.map((action, idx) => /* @__PURE__ */ jsx16(React11.Fragment, { children: renderActionButton(action, { fullWidth: !!action.label }) }, `mobile-${actionKey(action, idx)}`)) });
3520
+ ), children: actions.map((action, idx) => /* @__PURE__ */ jsx17(React11.Fragment, { children: renderActionButton(action, { fullWidth: !!action.label }) }, `mobile-${actionKey(action, idx)}`)) });
3503
3521
  }
3504
3522
  function usePageActionsBottomPadding(variant) {
3505
3523
  return variant === "primary-buttons" || variant === "menu-primary" ? "pb-40 md:pb-0" : "";
3506
3524
  }
3507
3525
 
3508
- // src/components/layout/page-container.tsx
3526
+ // src/components/ui/entity-image.tsx
3527
+ init_cn();
3528
+ import React12 from "react";
3529
+ import { jsx as jsx18 } from "react/jsx-runtime";
3530
+ function EntityImage({ src, alt, fallbackText, className }) {
3531
+ const [imageFailed, setImageFailed] = React12.useState(false);
3532
+ React12.useEffect(() => {
3533
+ setImageFailed(false);
3534
+ }, [src]);
3535
+ const showFallback = imageFailed || !src;
3536
+ const initials = getFirstLastInitials(fallbackText ?? alt);
3537
+ if (showFallback) {
3538
+ return /* @__PURE__ */ jsx18(
3539
+ "div",
3540
+ {
3541
+ "aria-label": alt,
3542
+ className: cn(
3543
+ "size-[52px] md:size-[60px] shrink-0 rounded-md border border-ods-border bg-ods-bg flex items-center justify-center text-ods-text-secondary text-h4 select-none",
3544
+ className
3545
+ ),
3546
+ children: initials || "?"
3547
+ }
3548
+ );
3549
+ }
3550
+ return /* @__PURE__ */ jsx18(
3551
+ "img",
3552
+ {
3553
+ src: src ?? void 0,
3554
+ alt: alt ?? "",
3555
+ onError: () => setImageFailed(true),
3556
+ className: cn(
3557
+ "size-[52px] md:size-[60px] shrink-0 rounded-md border border-ods-border object-contain",
3558
+ className
3559
+ )
3560
+ }
3561
+ );
3562
+ }
3563
+
3564
+ // src/components/layout/title-block.tsx
3509
3565
  init_cn();
3510
3566
 
3511
3567
  // src/components/layout/back-button.tsx
3512
3568
  init_cn();
3513
- import { jsx as jsx17, jsxs as jsxs14 } from "react/jsx-runtime";
3569
+ import { jsx as jsx19, jsxs as jsxs15 } from "react/jsx-runtime";
3514
3570
  function BackButton({ label = "Back", className, type = "button", ...props }) {
3515
- return /* @__PURE__ */ jsxs14(
3571
+ return /* @__PURE__ */ jsxs15(
3516
3572
  "button",
3517
3573
  {
3518
3574
  type,
@@ -3526,139 +3582,48 @@ function BackButton({ label = "Back", className, type = "button", ...props }) {
3526
3582
  ),
3527
3583
  ...props,
3528
3584
  children: [
3529
- /* @__PURE__ */ jsx17(Chevron02LeftIcon, { className: "size-6 shrink-0" }),
3530
- /* @__PURE__ */ jsx17("span", { className: "text-h4", children: label })
3585
+ /* @__PURE__ */ jsx19(Chevron02LeftIcon, { className: "size-6 shrink-0" }),
3586
+ /* @__PURE__ */ jsx19("span", { className: "text-h4", children: label })
3531
3587
  ]
3532
3588
  }
3533
3589
  );
3534
3590
  }
3535
3591
 
3536
- // src/components/layout/page-container.tsx
3537
- import { jsx as jsx18, jsxs as jsxs15 } from "react/jsx-runtime";
3538
- function isAdvancedProps(props) {
3539
- return "variant" in props || "title" in props || "subtitle" in props || "backButton" in props || "headerActions" in props || "headerContent" in props || "showHeader" in props || "contentClassName" in props || "actions" in props || "actionsVariant" in props;
3540
- }
3541
- function PageContainer(props) {
3542
- if (isAdvancedProps(props)) {
3543
- return renderAdvancedPageContainer(props);
3544
- } else {
3545
- return renderLegacyPageContainer(props);
3546
- }
3547
- }
3548
- function renderLegacyPageContainer({
3549
- children,
3550
- className = "",
3551
- fullWidthBackground = true,
3552
- backgroundClassName = "bg-ods-bg",
3553
- backgroundStyle,
3554
- contentPadding,
3555
- maxWidth = "max-w-[1920px]",
3556
- as: Component = "section",
3557
- id
3558
- }) {
3559
- const content = /* @__PURE__ */ jsx18("div", { className: cn(maxWidth, contentPadding, "mx-auto", className), children });
3560
- if (fullWidthBackground) {
3561
- return /* @__PURE__ */ jsx18(
3562
- Component,
3563
- {
3564
- className: cn("w-full", backgroundClassName),
3565
- style: backgroundStyle,
3566
- id,
3567
- children: content
3568
- }
3569
- );
3570
- }
3571
- return /* @__PURE__ */ jsx18(Component, { className: "w-full", id, children: /* @__PURE__ */ jsx18("div", { className: cn(maxWidth, contentPadding, "mx-auto", backgroundClassName, className), style: backgroundStyle, children }) });
3572
- }
3573
- function renderAdvancedPageContainer({
3574
- children,
3575
- variant = "content",
3592
+ // src/components/layout/title-block.tsx
3593
+ import { jsx as jsx20, jsxs as jsxs16 } from "react/jsx-runtime";
3594
+ function TitleBlock({
3576
3595
  title,
3577
3596
  subtitle,
3597
+ image,
3578
3598
  backButton,
3579
- headerActions,
3580
- headerContent,
3581
3599
  actions,
3582
- actionsVariant,
3600
+ actionsVariant = "icon-buttons",
3583
3601
  menuActions,
3584
- padding = "none",
3585
- background = "transparent",
3586
- className,
3587
- contentClassName,
3588
- showHeader = true
3602
+ selector,
3603
+ variant = "plain",
3604
+ className
3589
3605
  }) {
3590
- const getActionsVariant = () => {
3591
- if (actionsVariant) return actionsVariant;
3592
- if (variant === "list") return "icon-buttons";
3593
- return "primary-buttons";
3594
- };
3595
- const renderActions = () => {
3596
- if (!actions || actions.length === 0) return null;
3597
- return /* @__PURE__ */ jsx18(PageActions, { variant: getActionsVariant(), actions, menuActions });
3598
- };
3599
- const needsBottomPadding = actions && actions.length > 0 && getActionsVariant() === "primary-buttons";
3600
- const paddingClasses = {
3601
- none: "",
3602
- sm: "p-4",
3603
- md: "p-6",
3604
- lg: "p-8"
3605
- };
3606
- const backgroundClasses = {
3607
- default: "bg-ods-bg",
3608
- card: "bg-ods-card",
3609
- transparent: ""
3610
- };
3611
- const renderHeader = () => {
3612
- if (!showHeader) return null;
3613
- if (headerContent) {
3614
- return /* @__PURE__ */ jsx18("div", { className: cn(
3615
- "flex items-end justify-between gap-4"
3616
- ), children: headerContent });
3617
- }
3618
- if (variant === "detail") {
3619
- return /* @__PURE__ */ jsxs15("div", { className: "flex items-end justify-between md:flex-col md:items-start md:justify-start lg:flex-row lg:items-end lg:justify-between gap-4", children: [
3620
- /* @__PURE__ */ jsxs15("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
3621
- backButton && /* @__PURE__ */ jsx18(
3622
- BackButton,
3623
- {
3624
- onClick: backButton.onClick,
3625
- label: backButton.label,
3626
- className: "hidden md:inline-flex"
3627
- }
3628
- ),
3629
- title && /* @__PURE__ */ jsx18("h1", { className: "text-h2 tracking-[-0.64px] text-ods-text-primary", children: title }),
3630
- subtitle && /* @__PURE__ */ jsx18("div", { className: "text-ods-text-secondary font-['DM_Sans'] font-medium text-[16px]", children: subtitle })
3631
- ] }),
3632
- (headerActions || actions) && /* @__PURE__ */ jsxs15("div", { className: "flex gap-2 items-center shrink-0", children: [
3633
- headerActions,
3634
- renderActions()
3635
- ] })
3636
- ] });
3637
- }
3638
- if (variant === "list") {
3639
- return /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between md:flex-col md:items-start md:justify-start lg:flex-row lg:items-center lg:justify-between gap-4", children: [
3640
- /* @__PURE__ */ jsxs15("div", { className: "flex flex-col gap-1 flex-1 min-w-0", children: [
3641
- backButton && /* @__PURE__ */ jsx18(
3642
- BackButton,
3643
- {
3644
- onClick: backButton.onClick,
3645
- label: backButton.label,
3646
- className: "hidden md:inline-flex"
3647
- }
3648
- ),
3649
- title && /* @__PURE__ */ jsx18("h1", { className: "text-h2 tracking-[-0.48px] text-ods-text-primary", children: title }),
3650
- subtitle && /* @__PURE__ */ jsx18("div", { className: "text-ods-text-secondary font-['DM_Sans'] font-medium text-[16px]", children: subtitle })
3651
- ] }),
3652
- (headerActions || actions) && /* @__PURE__ */ jsxs15("div", { className: "flex gap-3 items-center shrink-0", children: [
3653
- headerActions,
3654
- renderActions()
3655
- ] })
3656
- ] });
3657
- }
3658
- if (variant === "form") {
3659
- return /* @__PURE__ */ jsxs15("div", { className: "flex items-end justify-between md:flex-col md:items-start md:justify-start lg:flex-row lg:items-end lg:justify-between gap-4", children: [
3660
- /* @__PURE__ */ jsxs15("div", { className: "flex flex-col gap-2 flex-1 min-w-0", children: [
3661
- backButton && /* @__PURE__ */ jsx18(
3606
+ const hasActions = actions && actions.length > 0;
3607
+ const hasMenuActions = !!menuActions && menuActions.some((g) => g.items.length > 0);
3608
+ return /* @__PURE__ */ jsxs16(
3609
+ "div",
3610
+ {
3611
+ className: cn(
3612
+ "flex items-end justify-between gap-[var(--spacing-system-m)]",
3613
+ "md:flex-col md:items-start md:justify-start lg:flex-row lg:items-end lg:justify-between",
3614
+ "pt-[var(--spacing-system-l)]",
3615
+ variant === "card" ? cn(
3616
+ "bg-ods-card border-b border-ods-border",
3617
+ "px-[var(--spacing-system-l)] pb-[var(--spacing-system-l)]",
3618
+ "md:bg-transparent md:border-b-0",
3619
+ "md:px-0 md:pb-0",
3620
+ "md:mb-[var(--spacing-system-l)]"
3621
+ ) : "mb-[var(--spacing-system-l)]",
3622
+ className
3623
+ ),
3624
+ children: [
3625
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-col gap-[var(--spacing-system-xs)] flex-1 min-w-0", children: [
3626
+ backButton && /* @__PURE__ */ jsx20(
3662
3627
  BackButton,
3663
3628
  {
3664
3629
  onClick: backButton.onClick,
@@ -3666,79 +3631,88 @@ function renderAdvancedPageContainer({
3666
3631
  className: "hidden md:inline-flex"
3667
3632
  }
3668
3633
  ),
3669
- title && /* @__PURE__ */ jsx18("h1", { className: "text-[32px] font-['Azeret_Mono:SemiBold',_sans-serif] font-semibold text-ods-text-primary tracking-[-0.64px]", children: title })
3634
+ image || subtitle ? /* @__PURE__ */ jsxs16("div", { className: "flex items-center gap-[var(--spacing-system-m)] min-w-0 w-full", children: [
3635
+ image && /* @__PURE__ */ jsx20(
3636
+ EntityImage,
3637
+ {
3638
+ src: image.src,
3639
+ alt: image.alt,
3640
+ fallbackText: image.alt || title
3641
+ }
3642
+ ),
3643
+ /* @__PURE__ */ jsxs16("div", { className: "flex flex-col justify-center min-w-0 flex-1", children: [
3644
+ title && /* @__PURE__ */ jsx20("h1", { className: "text-h2 text-ods-text-primary truncate", title, children: title }),
3645
+ subtitle && /* @__PURE__ */ jsx20("p", { className: "text-h6 text-ods-text-secondary truncate", title: subtitle, children: subtitle })
3646
+ ] })
3647
+ ] }) : title && /* @__PURE__ */ jsx20("h1", { className: "text-h2 text-ods-text-primary", children: title })
3670
3648
  ] }),
3671
- (headerActions || actions) && /* @__PURE__ */ jsxs15("div", { className: "flex gap-4 items-center shrink-0", children: [
3672
- headerActions,
3673
- renderActions()
3674
- ] })
3675
- ] });
3676
- }
3677
- return /* @__PURE__ */ jsxs15("div", { className: "flex items-center justify-between md:flex-col md:items-start md:justify-start lg:flex-row lg:items-center lg:justify-between gap-4", children: [
3678
- (title || subtitle) && /* @__PURE__ */ jsxs15("div", { className: "flex flex-col gap-1 flex-1 min-w-0", children: [
3679
- title && /* @__PURE__ */ jsx18("h1", { className: "text-h2 text-ods-text-primary", children: title }),
3680
- subtitle && /* @__PURE__ */ jsx18("div", { className: "text-ods-text-secondary font-['DM_Sans'] font-medium text-[16px]", children: subtitle })
3681
- ] }),
3682
- (headerActions || actions) && /* @__PURE__ */ jsxs15("div", { className: "flex gap-3 items-center shrink-0", children: [
3683
- headerActions,
3684
- renderActions()
3685
- ] })
3686
- ] });
3687
- };
3688
- const getContainerClasses = () => {
3689
- const baseClasses = [
3690
- "flex flex-col w-full",
3691
- backgroundClasses[background],
3692
- paddingClasses[padding]
3693
- ];
3694
- switch (variant) {
3695
- case "list":
3696
- return cn(baseClasses, "gap-4 md:gap-6", className);
3697
- case "detail":
3698
- return cn(baseClasses, "gap-4 md:gap-6", className);
3699
- case "form":
3700
- return cn(baseClasses, "gap-6 md:gap-10", className);
3701
- case "content":
3702
- default:
3703
- return cn(baseClasses, "gap-4 md:gap-6", className);
3704
- }
3705
- };
3706
- const getContentClasses = () => {
3707
- const mobilePadding = needsBottomPadding ? "pb-28 md:pb-0" : "";
3708
- switch (variant) {
3709
- case "detail":
3710
- return cn("flex-1 overflow-auto", mobilePadding, contentClassName);
3711
- case "list":
3712
- return cn("flex flex-col gap-4 md:gap-6", mobilePadding, contentClassName);
3713
- case "form":
3714
- return cn("flex flex-col gap-4 md:gap-10", mobilePadding, contentClassName);
3715
- case "content":
3716
- default:
3717
- return cn("flex-1", mobilePadding, contentClassName);
3649
+ (hasActions || hasMenuActions || selector) && /* @__PURE__ */ jsx20("div", { className: "flex gap-2 items-center shrink-0", children: /* @__PURE__ */ jsx20(
3650
+ PageActions,
3651
+ {
3652
+ variant: actionsVariant,
3653
+ actions: actions ?? [],
3654
+ menuActions,
3655
+ selector
3656
+ }
3657
+ ) })
3658
+ ]
3718
3659
  }
3719
- };
3720
- return /* @__PURE__ */ jsxs15("div", { className: getContainerClasses(), children: [
3721
- renderHeader(),
3722
- /* @__PURE__ */ jsx18("div", { className: getContentClasses(), children })
3660
+ );
3661
+ }
3662
+
3663
+ // src/components/layout/page-layout.tsx
3664
+ init_cn();
3665
+ import { jsx as jsx21, jsxs as jsxs17 } from "react/jsx-runtime";
3666
+ function PageLayout({
3667
+ children,
3668
+ title,
3669
+ subtitle,
3670
+ image,
3671
+ backButton,
3672
+ actions,
3673
+ actionsVariant = "icon-buttons",
3674
+ menuActions,
3675
+ selector,
3676
+ headerVariant,
3677
+ className,
3678
+ contentClassName,
3679
+ showHeader = true
3680
+ }) {
3681
+ const hasActions = actions && actions.length > 0;
3682
+ const needsBottomPadding = hasActions && actionsVariant === "primary-buttons";
3683
+ const hasHeader = showHeader && (title || subtitle || image || backButton || hasActions || selector);
3684
+ return /* @__PURE__ */ jsxs17("div", { className: cn("flex flex-col w-full", className), children: [
3685
+ hasHeader && /* @__PURE__ */ jsx21(
3686
+ TitleBlock,
3687
+ {
3688
+ title,
3689
+ subtitle,
3690
+ image,
3691
+ backButton,
3692
+ actions,
3693
+ actionsVariant,
3694
+ menuActions,
3695
+ selector,
3696
+ variant: headerVariant
3697
+ }
3698
+ ),
3699
+ /* @__PURE__ */ jsx21("div", { className: cn("flex flex-col flex-1 gap-[var(--spacing-system-l)]", needsBottomPadding && "pb-28 md:pb-0", contentClassName), children })
3723
3700
  ] });
3724
3701
  }
3725
- var ListPageContainer = (props) => /* @__PURE__ */ jsx18(PageContainer, { ...props, variant: "list" });
3726
- var DetailPageContainer = (props) => /* @__PURE__ */ jsx18(PageContainer, { ...props, variant: "detail" });
3727
- var FormPageContainer = (props) => /* @__PURE__ */ jsx18(PageContainer, { ...props, variant: "form" });
3728
- var ContentPageContainer = (props) => /* @__PURE__ */ jsx18(PageContainer, { ...props, variant: "content" });
3729
3702
 
3730
3703
  // src/components/layout/article-detail-layout.tsx
3731
- import { jsx as jsx19, jsxs as jsxs16 } from "react/jsx-runtime";
3732
- function PageShell({ children, schemas }) {
3733
- return /* @__PURE__ */ jsxs16("main", { className: "bg-ods-bg min-h-screen", children: [
3704
+ init_cn();
3705
+ import { jsx as jsx22, jsxs as jsxs18 } from "react/jsx-runtime";
3706
+ function PageShell({ children, schemas, contentClassName }) {
3707
+ return /* @__PURE__ */ jsxs18("main", { className: "bg-ods-bg min-h-screen", children: [
3734
3708
  schemas,
3735
- /* @__PURE__ */ jsx19("div", { className: "max-w-[1920px] mx-auto px-6 md:px-20 py-6 md:py-10", children })
3709
+ /* @__PURE__ */ jsx22("div", { className: cn("page-shell-content max-w-[1920px] mx-auto", contentClassName), children })
3736
3710
  ] });
3737
3711
  }
3738
- function ArticleDetailLayout({ children, schemas }) {
3739
- return /* @__PURE__ */ jsxs16("main", { className: "bg-ods-bg min-h-screen", children: [
3712
+ function ArticleDetailLayout({ children, schemas, contentClassName }) {
3713
+ return /* @__PURE__ */ jsxs18("main", { className: "bg-ods-bg min-h-screen", children: [
3740
3714
  schemas,
3741
- /* @__PURE__ */ jsx19("div", { className: "max-w-[1280px] mx-auto px-6 md:px-20 py-6 md:py-10", children })
3715
+ /* @__PURE__ */ jsx22("div", { className: cn("max-w-[1280px] mx-auto px-6 md:px-20 py-6 md:py-10", contentClassName), children })
3742
3716
  ] });
3743
3717
  }
3744
3718
 
@@ -3793,7 +3767,7 @@ function resolveContentHref(composeContentUrl, args) {
3793
3767
  init_button();
3794
3768
  init_cn();
3795
3769
  import { AlertTriangle, RefreshCw, Home } from "lucide-react";
3796
- import { jsx as jsx20, jsxs as jsxs17 } from "react/jsx-runtime";
3770
+ import { jsx as jsx23, jsxs as jsxs19 } from "react/jsx-runtime";
3797
3771
  function ErrorState({
3798
3772
  title = "Error",
3799
3773
  message,
@@ -3832,36 +3806,36 @@ function ErrorState({
3832
3806
  }
3833
3807
  };
3834
3808
  const styles = getVariantStyles();
3835
- return /* @__PURE__ */ jsx20("div", { className: cn("p-6", containerClassName), children: /* @__PURE__ */ jsx20("div", { className: cn(
3809
+ return /* @__PURE__ */ jsx23("div", { className: cn("p-6", containerClassName), children: /* @__PURE__ */ jsx23("div", { className: cn(
3836
3810
  "rounded-lg p-4 border",
3837
3811
  styles.bg,
3838
3812
  styles.border,
3839
3813
  className
3840
- ), children: /* @__PURE__ */ jsxs17("div", { className: "flex items-start gap-3", children: [
3841
- showIcon && /* @__PURE__ */ jsx20(AlertTriangle, { className: cn("h-5 w-5 mt-0.5 flex-shrink-0", styles.icon) }),
3842
- /* @__PURE__ */ jsxs17("div", { className: "flex-1", children: [
3843
- /* @__PURE__ */ jsx20("h3", { className: cn("font-semibold mb-1", styles.text), children: title }),
3844
- /* @__PURE__ */ jsx20("p", { className: cn("text-sm", styles.text), children: message }),
3845
- (showRetry || showHome) && /* @__PURE__ */ jsxs17("div", { className: "flex gap-2 mt-3", children: [
3846
- showRetry && onRetry && /* @__PURE__ */ jsx20(
3814
+ ), children: /* @__PURE__ */ jsxs19("div", { className: "flex items-start gap-3", children: [
3815
+ showIcon && /* @__PURE__ */ jsx23(AlertTriangle, { className: cn("h-5 w-5 mt-0.5 flex-shrink-0", styles.icon) }),
3816
+ /* @__PURE__ */ jsxs19("div", { className: "flex-1", children: [
3817
+ /* @__PURE__ */ jsx23("h3", { className: cn("font-semibold mb-1", styles.text), children: title }),
3818
+ /* @__PURE__ */ jsx23("p", { className: cn("text-sm", styles.text), children: message }),
3819
+ (showRetry || showHome) && /* @__PURE__ */ jsxs19("div", { className: "flex gap-2 mt-3", children: [
3820
+ showRetry && onRetry && /* @__PURE__ */ jsx23(
3847
3821
  Button,
3848
3822
  {
3849
3823
  onClick: onRetry,
3850
3824
  variant: "outline",
3851
3825
  size: "small-legacy",
3852
3826
  className: "h-8",
3853
- leftIcon: /* @__PURE__ */ jsx20(RefreshCw, { className: "h-4 w-4" }),
3827
+ leftIcon: /* @__PURE__ */ jsx23(RefreshCw, { className: "h-4 w-4" }),
3854
3828
  children: "Try Again"
3855
3829
  }
3856
3830
  ),
3857
- showHome && onHome && /* @__PURE__ */ jsx20(
3831
+ showHome && onHome && /* @__PURE__ */ jsx23(
3858
3832
  Button,
3859
3833
  {
3860
3834
  onClick: onHome,
3861
3835
  variant: "outline",
3862
3836
  size: "small-legacy",
3863
3837
  className: "h-8",
3864
- leftIcon: /* @__PURE__ */ jsx20(Home, { className: "h-4 w-4" }),
3838
+ leftIcon: /* @__PURE__ */ jsx23(Home, { className: "h-4 w-4" }),
3865
3839
  children: "Go Home"
3866
3840
  }
3867
3841
  )
@@ -3870,7 +3844,7 @@ function ErrorState({
3870
3844
  ] }) }) });
3871
3845
  }
3872
3846
  function PageError({ message, onRetry, onHome }) {
3873
- return /* @__PURE__ */ jsx20(
3847
+ return /* @__PURE__ */ jsx23(
3874
3848
  ErrorState,
3875
3849
  {
3876
3850
  title: "Page Error",
@@ -3884,7 +3858,7 @@ function PageError({ message, onRetry, onHome }) {
3884
3858
  );
3885
3859
  }
3886
3860
  function LoadError({ message, onRetry }) {
3887
- return /* @__PURE__ */ jsx20(
3861
+ return /* @__PURE__ */ jsx23(
3888
3862
  ErrorState,
3889
3863
  {
3890
3864
  title: "Loading Error",
@@ -3896,7 +3870,7 @@ function LoadError({ message, onRetry }) {
3896
3870
  );
3897
3871
  }
3898
3872
  function NotFoundError({ message = "The requested item was not found", onHome }) {
3899
- return /* @__PURE__ */ jsx20(
3873
+ return /* @__PURE__ */ jsx23(
3900
3874
  ErrorState,
3901
3875
  {
3902
3876
  title: "Not Found",
@@ -3910,7 +3884,7 @@ function NotFoundError({ message = "The requested item was not found", onHome })
3910
3884
 
3911
3885
  // src/components/features/entity-tag-badges.tsx
3912
3886
  import Link from "next/link";
3913
- import { jsx as jsx21, jsxs as jsxs18 } from "react/jsx-runtime";
3887
+ import { jsx as jsx24, jsxs as jsxs20 } from "react/jsx-runtime";
3914
3888
  var TAG_BADGE_CLASS = "bg-ods-card border border-ods-border";
3915
3889
  var BADGE_CLASS = TAG_BADGE_CLASS;
3916
3890
  function EntityTagBadges({ tags, basePath, max, className }) {
@@ -3919,12 +3893,12 @@ function EntityTagBadges({ tags, basePath, max, className }) {
3919
3893
  const visibleLimit = max == null ? items.length : Math.max(0, max);
3920
3894
  const shown = items.slice(0, visibleLimit);
3921
3895
  const overflow = items.length - shown.length;
3922
- return /* @__PURE__ */ jsxs18("div", { className: `flex flex-wrap items-center gap-2 w-full ${className || ""}`, children: [
3896
+ return /* @__PURE__ */ jsxs20("div", { className: `flex flex-wrap items-center gap-2 w-full ${className || ""}`, children: [
3923
3897
  shown.map((tag) => {
3924
3898
  const key = tag.tag_id ?? tag.id ?? tag.slug ?? tag.name;
3925
3899
  const label = (tag.name || "").toUpperCase();
3926
3900
  if (basePath && tag.slug) {
3927
- return /* @__PURE__ */ jsx21(Link, { href: `${basePath}?tags=${tag.slug}`, className: "inline-flex", children: /* @__PURE__ */ jsx21(
3901
+ return /* @__PURE__ */ jsx24(Link, { href: `${basePath}?tags=${tag.slug}`, className: "inline-flex", children: /* @__PURE__ */ jsx24(
3928
3902
  StatusBadge,
3929
3903
  {
3930
3904
  text: label,
@@ -3933,9 +3907,9 @@ function EntityTagBadges({ tags, basePath, max, className }) {
3933
3907
  }
3934
3908
  ) }, key);
3935
3909
  }
3936
- return /* @__PURE__ */ jsx21(StatusBadge, { text: label, variant: "card", className: BADGE_CLASS }, key);
3910
+ return /* @__PURE__ */ jsx24(StatusBadge, { text: label, variant: "card", className: BADGE_CLASS }, key);
3937
3911
  }),
3938
- overflow > 0 && /* @__PURE__ */ jsx21(StatusBadge, { text: `+${overflow}`, variant: "card", className: `${BADGE_CLASS} text-ods-text-secondary` })
3912
+ overflow > 0 && /* @__PURE__ */ jsx24(StatusBadge, { text: `+${overflow}`, variant: "card", className: `${BADGE_CLASS} text-ods-text-secondary` })
3939
3913
  ] });
3940
3914
  }
3941
3915
 
@@ -4011,8 +3985,8 @@ function getCaptionsUrl(entityType, entityId, srtContent) {
4011
3985
  init_cn();
4012
3986
  import * as PopoverPrimitive from "@radix-ui/react-popover";
4013
3987
  import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
4014
- import * as React12 from "react";
4015
- import { jsx as jsx22, jsxs as jsxs19 } from "react/jsx-runtime";
3988
+ import * as React13 from "react";
3989
+ import { jsx as jsx25, jsxs as jsxs21 } from "react/jsx-runtime";
4016
3990
  var containerStyles = cn(
4017
3991
  // Layout & spacing — matches lib Input component
4018
3992
  "flex items-center gap-2 rounded-[6px] border px-3 h-11 md:h-12 cursor-text",
@@ -4067,12 +4041,12 @@ function SearchInput({
4067
4041
  limitTags = "auto",
4068
4042
  getLimitTagsText = (more) => `+${more}`
4069
4043
  }) {
4070
- const [internalValue, setInternalValue] = React12.useState(defaultValue);
4044
+ const [internalValue, setInternalValue] = React13.useState(defaultValue);
4071
4045
  const currentValue = onChange ? value ?? "" : internalValue;
4072
4046
  const debouncedValue = useDebounce(currentValue, debounceMs);
4073
- const [isOpen, setIsOpen] = React12.useState(false);
4074
- const [highlightedIndex, setHighlightedIndex] = React12.useState(-1);
4075
- const containerRef = React12.useRef(null);
4047
+ const [isOpen, setIsOpen] = React13.useState(false);
4048
+ const [highlightedIndex, setHighlightedIndex] = React13.useState(-1);
4049
+ const containerRef = React13.useRef(null);
4076
4050
  const currentPlaceholder = filterChips.length > 0 ? "Add filter..." : placeholder;
4077
4051
  const {
4078
4052
  visibleCount: rawVisibleCount,
@@ -4089,10 +4063,10 @@ function SearchInput({
4089
4063
  placeholder: filterChips.length > 0 ? "" : placeholder
4090
4064
  });
4091
4065
  const visibleCount = filterChips.length > 0 ? Math.max(1, rawVisibleCount) : rawVisibleCount;
4092
- const hiddenTagsRef = React12.useRef(null);
4093
- const hiddenTagsPopupRef = React12.useRef(null);
4094
- const [showHiddenTags, setShowHiddenTags] = React12.useState(false);
4095
- React12.useEffect(() => {
4066
+ const hiddenTagsRef = React13.useRef(null);
4067
+ const hiddenTagsPopupRef = React13.useRef(null);
4068
+ const [showHiddenTags, setShowHiddenTags] = React13.useState(false);
4069
+ React13.useEffect(() => {
4096
4070
  if (!showHiddenTags) return;
4097
4071
  const handleClick = (e) => {
4098
4072
  const target = e.target;
@@ -4106,7 +4080,7 @@ function SearchInput({
4106
4080
  const hiddenCount = filterChips.length - visibleCount;
4107
4081
  const visibleChips = filterChips.slice(0, visibleCount);
4108
4082
  const hiddenChips = filterChips.slice(visibleCount);
4109
- const { flatResults, groups } = React12.useMemo(() => {
4083
+ const { flatResults, groups } = React13.useMemo(() => {
4110
4084
  if (!groupBy) return { flatResults: results, groups: null };
4111
4085
  const grouped = /* @__PURE__ */ new Map();
4112
4086
  for (const r of results) {
@@ -4123,7 +4097,7 @@ function SearchInput({
4123
4097
  const meetsMinQuery = debouncedValue.length >= minQueryLength;
4124
4098
  const autoShow = meetsMinQuery;
4125
4099
  const dropdownVisible = showDropdownProp ?? (isOpen && autoShow);
4126
- React12.useEffect(() => {
4100
+ React13.useEffect(() => {
4127
4101
  setHighlightedIndex(-1);
4128
4102
  }, [flatResults.length]);
4129
4103
  const handleChange = (e) => {
@@ -4196,20 +4170,20 @@ function SearchInput({
4196
4170
  const handleOpenChange = (open) => {
4197
4171
  setIsOpen(open);
4198
4172
  };
4199
- const defaultRenderResult = (result, isHighlighted) => /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-3 w-full min-w-0", children: [
4200
- result.icon && /* @__PURE__ */ jsx22("span", { className: "flex-shrink-0 text-ods-text-secondary [&_svg]:size-4", children: result.icon }),
4201
- /* @__PURE__ */ jsxs19("div", { className: "min-w-0 flex-1", children: [
4202
- /* @__PURE__ */ jsx22("div", { className: cn(
4173
+ const defaultRenderResult = (result, isHighlighted) => /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-3 w-full min-w-0", children: [
4174
+ result.icon && /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-ods-text-secondary [&_svg]:size-4", children: result.icon }),
4175
+ /* @__PURE__ */ jsxs21("div", { className: "min-w-0 flex-1", children: [
4176
+ /* @__PURE__ */ jsx25("div", { className: cn(
4203
4177
  "text-sm font-medium leading-5 truncate",
4204
4178
  isHighlighted ? "text-ods-accent" : "text-ods-text-primary"
4205
4179
  ), title: result.title, children: result.title }),
4206
- result.description && /* @__PURE__ */ jsx22("div", { className: "text-xs leading-4 text-ods-text-secondary truncate mt-0.5", title: result.description, children: result.description })
4180
+ result.description && /* @__PURE__ */ jsx25("div", { className: "text-xs leading-4 text-ods-text-secondary truncate mt-0.5", title: result.description, children: result.description })
4207
4181
  ] }),
4208
- result.type && /* @__PURE__ */ jsx22("span", { className: "flex-shrink-0 text-[11px] font-medium text-ods-text-muted uppercase tracking-wider", children: result.type })
4182
+ result.type && /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-[11px] font-medium text-ods-text-muted uppercase tracking-wider", children: result.type })
4209
4183
  ] });
4210
4184
  const renderRow = (result, index) => {
4211
4185
  const isHighlighted = index === highlightedIndex;
4212
- return /* @__PURE__ */ jsx22(
4186
+ return /* @__PURE__ */ jsx25(
4213
4187
  "div",
4214
4188
  {
4215
4189
  role: "option",
@@ -4228,15 +4202,15 @@ function SearchInput({
4228
4202
  };
4229
4203
  const renderDropdownContent = () => {
4230
4204
  if (isLoading) {
4231
- return /* @__PURE__ */ jsx22("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: "Loading..." });
4205
+ return /* @__PURE__ */ jsx25("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: "Loading..." });
4232
4206
  }
4233
4207
  if (flatResults.length === 0) {
4234
- return /* @__PURE__ */ jsx22("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: emptyResultsText });
4208
+ return /* @__PURE__ */ jsx25("div", { className: "px-4 py-3 text-ods-text-secondary text-[14px]", children: emptyResultsText });
4235
4209
  }
4236
4210
  if (groups) {
4237
4211
  let globalIndex = 0;
4238
- return Array.from(groups.entries()).map(([groupLabel, groupResults]) => /* @__PURE__ */ jsxs19("div", { children: [
4239
- /* @__PURE__ */ jsx22("div", { className: "px-4 py-2 text-[12px] font-semibold text-ods-text-secondary uppercase tracking-wide bg-ods-bg", children: groupLabel }),
4212
+ return Array.from(groups.entries()).map(([groupLabel, groupResults]) => /* @__PURE__ */ jsxs21("div", { children: [
4213
+ /* @__PURE__ */ jsx25("div", { className: "px-4 py-2 text-[12px] font-semibold text-ods-text-secondary uppercase tracking-wide bg-ods-bg", children: groupLabel }),
4240
4214
  groupResults.map((result) => {
4241
4215
  const idx = globalIndex++;
4242
4216
  return renderRow(result, idx);
@@ -4246,9 +4220,9 @@ function SearchInput({
4246
4220
  return flatResults.map((result, index) => renderRow(result, index));
4247
4221
  };
4248
4222
  const hasValue = currentValue.length > 0;
4249
- return /* @__PURE__ */ jsxs19("div", { className: cn("relative", className), ref: containerRef, children: [
4250
- /* @__PURE__ */ jsxs19(PopoverPrimitive.Root, { open: dropdownVisible, onOpenChange: handleOpenChange, modal: false, children: [
4251
- /* @__PURE__ */ jsx22(PopoverPrimitive.Anchor, { asChild: true, children: /* @__PURE__ */ jsxs19(
4223
+ return /* @__PURE__ */ jsxs21("div", { className: cn("relative", className), ref: containerRef, children: [
4224
+ /* @__PURE__ */ jsxs21(PopoverPrimitive.Root, { open: dropdownVisible, onOpenChange: handleOpenChange, modal: false, children: [
4225
+ /* @__PURE__ */ jsx25(PopoverPrimitive.Anchor, { asChild: true, children: /* @__PURE__ */ jsxs21(
4252
4226
  "div",
4253
4227
  {
4254
4228
  className: cn(
@@ -4261,9 +4235,9 @@ function SearchInput({
4261
4235
  setIsOpen(true);
4262
4236
  },
4263
4237
  children: [
4264
- /* @__PURE__ */ jsx22("span", { className: "flex-shrink-0 text-ods-text-secondary transition-colors duration-200 group-has-[:focus]:text-ods-accent [&_svg]:size-4 md:[&_svg]:size-6", children: startAdornment !== void 0 ? startAdornment : /* @__PURE__ */ jsx22(SearchIcon, {}) }),
4265
- /* @__PURE__ */ jsxs19("div", { ref: middleRef, className: "flex-1 flex items-center gap-2 min-w-0 overflow-hidden", children: [
4266
- visibleChips.map((chip) => /* @__PURE__ */ jsx22(
4238
+ /* @__PURE__ */ jsx25("span", { className: "flex-shrink-0 text-ods-text-secondary transition-colors duration-200 group-has-[:focus]:text-ods-accent [&_svg]:size-4 md:[&_svg]:size-6", children: startAdornment !== void 0 ? startAdornment : /* @__PURE__ */ jsx25(SearchIcon, {}) }),
4239
+ /* @__PURE__ */ jsxs21("div", { ref: middleRef, className: "flex-1 flex items-center gap-2 min-w-0 overflow-hidden", children: [
4240
+ visibleChips.map((chip) => /* @__PURE__ */ jsx25(
4267
4241
  Tag,
4268
4242
  {
4269
4243
  variant: chipVariantToTagVariant(chip.variant),
@@ -4273,7 +4247,7 @@ function SearchInput({
4273
4247
  },
4274
4248
  chip.id
4275
4249
  )),
4276
- hiddenCount > 0 && /* @__PURE__ */ jsx22("div", { ref: hiddenTagsRef, className: "shrink-0", children: /* @__PURE__ */ jsx22(
4250
+ hiddenCount > 0 && /* @__PURE__ */ jsx25("div", { ref: hiddenTagsRef, className: "shrink-0", children: /* @__PURE__ */ jsx25(
4277
4251
  "button",
4278
4252
  {
4279
4253
  ref: badgeRef,
@@ -4292,7 +4266,7 @@ function SearchInput({
4292
4266
  children: getLimitTagsText(hiddenCount)
4293
4267
  }
4294
4268
  ) }),
4295
- /* @__PURE__ */ jsx22(
4269
+ /* @__PURE__ */ jsx25(
4296
4270
  "input",
4297
4271
  {
4298
4272
  ref: inputRef,
@@ -4309,15 +4283,15 @@ function SearchInput({
4309
4283
  }
4310
4284
  )
4311
4285
  ] }),
4312
- /* @__PURE__ */ jsxs19("div", { className: "flex items-center gap-1 shrink-0 ml-auto", children: [
4313
- hasValue && /* @__PURE__ */ jsx22(
4286
+ /* @__PURE__ */ jsxs21("div", { className: "flex items-center gap-1 shrink-0 ml-auto", children: [
4287
+ hasValue && /* @__PURE__ */ jsx25(
4314
4288
  "button",
4315
4289
  {
4316
4290
  type: "button",
4317
4291
  onClick: handleClear,
4318
4292
  className: "flex items-center justify-center hover:opacity-70 transition-opacity",
4319
4293
  "aria-label": "Clear search",
4320
- children: /* @__PURE__ */ jsx22(XmarkCircleIcon, { className: "text-ods-text-secondary", size: 24 })
4294
+ children: /* @__PURE__ */ jsx25(XmarkCircleIcon, { className: "text-ods-text-secondary", size: 24 })
4321
4295
  }
4322
4296
  ),
4323
4297
  endAdornment
@@ -4325,7 +4299,7 @@ function SearchInput({
4325
4299
  ]
4326
4300
  }
4327
4301
  ) }),
4328
- /* @__PURE__ */ jsx22(
4302
+ /* @__PURE__ */ jsx25(
4329
4303
  PopoverPrimitive.Content,
4330
4304
  {
4331
4305
  className: cn(
@@ -4348,14 +4322,14 @@ function SearchInput({
4348
4322
  e.preventDefault();
4349
4323
  }
4350
4324
  },
4351
- children: /* @__PURE__ */ jsxs19(ScrollAreaPrimitive.Root, { className: "overflow-hidden", children: [
4352
- /* @__PURE__ */ jsx22(ScrollAreaPrimitive.Viewport, { className: "max-h-[320px] w-full", children: /* @__PURE__ */ jsx22("div", { role: "listbox", children: renderDropdownContent() }) }),
4353
- /* @__PURE__ */ jsx22(ScrollAreaPrimitive.Scrollbar, { className: "hidden", orientation: "vertical", children: /* @__PURE__ */ jsx22(ScrollAreaPrimitive.Thumb, {}) })
4325
+ children: /* @__PURE__ */ jsxs21(ScrollAreaPrimitive.Root, { className: "overflow-hidden", children: [
4326
+ /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Viewport, { className: "max-h-[320px] w-full", children: /* @__PURE__ */ jsx25("div", { role: "listbox", children: renderDropdownContent() }) }),
4327
+ /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Scrollbar, { className: "hidden", orientation: "vertical", children: /* @__PURE__ */ jsx25(ScrollAreaPrimitive.Thumb, {}) })
4354
4328
  ] })
4355
4329
  }
4356
4330
  )
4357
4331
  ] }),
4358
- showHiddenTags && hiddenCount > 0 && /* @__PURE__ */ jsx22(
4332
+ showHiddenTags && hiddenCount > 0 && /* @__PURE__ */ jsx25(
4359
4333
  HiddenTagsPopup,
4360
4334
  {
4361
4335
  ref: hiddenTagsPopupRef,
@@ -4369,7 +4343,7 @@ function SearchInput({
4369
4343
  }
4370
4344
  }
4371
4345
  ),
4372
- /* @__PURE__ */ jsx22(
4346
+ /* @__PURE__ */ jsx25(
4373
4347
  "span",
4374
4348
  {
4375
4349
  ref: textMeasureRef,
@@ -4378,13 +4352,13 @@ function SearchInput({
4378
4352
  children: currentPlaceholder
4379
4353
  }
4380
4354
  ),
4381
- /* @__PURE__ */ jsx22(
4355
+ /* @__PURE__ */ jsx25(
4382
4356
  "div",
4383
4357
  {
4384
4358
  ref: measureRef,
4385
4359
  "aria-hidden": "true",
4386
4360
  className: "fixed -left-[9999px] top-0 flex gap-2 pointer-events-none",
4387
- children: filterChips.map((chip) => /* @__PURE__ */ jsx22(
4361
+ children: filterChips.map((chip) => /* @__PURE__ */ jsx25(
4388
4362
  Tag,
4389
4363
  {
4390
4364
  variant: chipVariantToTagVariant(chip.variant),
@@ -4403,7 +4377,7 @@ function SearchInput({
4403
4377
  // src/components/ui/filter-pill-row.tsx
4404
4378
  init_button();
4405
4379
  import { Filter } from "lucide-react";
4406
- import { jsx as jsx23, jsxs as jsxs20 } from "react/jsx-runtime";
4380
+ import { jsx as jsx26, jsxs as jsxs22 } from "react/jsx-runtime";
4407
4381
  function FilterPillRow({
4408
4382
  label,
4409
4383
  selectedValue,
@@ -4412,12 +4386,12 @@ function FilterPillRow({
4412
4386
  countLabel,
4413
4387
  children
4414
4388
  }) {
4415
- return /* @__PURE__ */ jsxs20("div", { className: "flex flex-wrap items-center gap-3 p-4 bg-ods-card border border-ods-border rounded-lg", children: [
4416
- /* @__PURE__ */ jsxs20("div", { className: "flex items-center gap-2", children: [
4417
- /* @__PURE__ */ jsx23(Filter, { className: "h-4 w-4 text-ods-accent" }),
4418
- /* @__PURE__ */ jsx23("span", { className: "text-h5 text-ods-text-secondary", children: label })
4389
+ return /* @__PURE__ */ jsxs22("div", { className: "flex flex-wrap items-center gap-3 p-4 bg-ods-card border border-ods-border rounded-lg", children: [
4390
+ /* @__PURE__ */ jsxs22("div", { className: "flex items-center gap-2", children: [
4391
+ /* @__PURE__ */ jsx26(Filter, { className: "h-4 w-4 text-ods-accent" }),
4392
+ /* @__PURE__ */ jsx26("span", { className: "text-h5 text-ods-text-secondary", children: label })
4419
4393
  ] }),
4420
- children || options.map((opt) => /* @__PURE__ */ jsx23(
4394
+ children || options.map((opt) => /* @__PURE__ */ jsx26(
4421
4395
  Button,
4422
4396
  {
4423
4397
  type: "button",
@@ -4429,7 +4403,7 @@ function FilterPillRow({
4429
4403
  },
4430
4404
  opt.value
4431
4405
  )),
4432
- countLabel && /* @__PURE__ */ jsx23("div", { className: "ml-auto text-[12px] font-['DM_Sans'] text-ods-text-secondary shrink-0", children: countLabel })
4406
+ countLabel && /* @__PURE__ */ jsx26("div", { className: "ml-auto text-[12px] font-['DM_Sans'] text-ods-text-secondary shrink-0", children: countLabel })
4433
4407
  ] });
4434
4408
  }
4435
4409
 
@@ -4507,6 +4481,9 @@ export {
4507
4481
  fetchPriorityProp,
4508
4482
  extractYouTubeId,
4509
4483
  Video,
4484
+ PAGE_HEADING_CLASS,
4485
+ SECTION_HEADING_CLASS,
4486
+ PageHeading,
4510
4487
  RATIO_GRID_CLASS,
4511
4488
  RATIO_DISPLAY_GRID_CLASS,
4512
4489
  RatioTabs,
@@ -4551,11 +4528,9 @@ export {
4551
4528
  PageActions,
4552
4529
  usePageActionsBottomPadding,
4553
4530
  BackButton,
4554
- PageContainer,
4555
- ListPageContainer,
4556
- DetailPageContainer,
4557
- FormPageContainer,
4558
- ContentPageContainer,
4531
+ EntityImage,
4532
+ TitleBlock,
4533
+ PageLayout,
4559
4534
  PageShell,
4560
4535
  ArticleDetailLayout,
4561
4536
  DEFAULT_CONTENT_SUFFIXES,
@@ -4576,4 +4551,4 @@ export {
4576
4551
  SearchInput,
4577
4552
  FilterPillRow
4578
4553
  };
4579
- //# sourceMappingURL=chunk-BSOHVQ7X.js.map
4554
+ //# sourceMappingURL=chunk-GHWOQUB4.js.map