@flamingo-stack/openframe-frontend-core 0.0.774 → 0.0.776

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 (70) hide show
  1. package/dist/{chunk-L5CKY5WA.cjs → chunk-24OYQQZC.cjs} +13 -13
  2. package/dist/{chunk-LEVA5WO3.cjs → chunk-2AZAJ7RK.cjs} +39 -39
  3. package/dist/{chunk-U332FL4C.cjs → chunk-2MF547RG.cjs} +22 -22
  4. package/dist/{chunk-HTSRAQVG.cjs → chunk-2YB4X5WT.cjs} +4 -4
  5. package/dist/{chunk-SWEPHSIP.cjs → chunk-3V27UHSH.cjs} +4 -4
  6. package/dist/{chunk-EQBJHJS7.cjs → chunk-6HY2NH7D.cjs} +2 -2
  7. package/dist/{chunk-5Z3XL2VU.cjs → chunk-AMVI5VXM.cjs} +68 -68
  8. package/dist/{chunk-E5E7IE7X.cjs → chunk-BDYI6HBT.cjs} +12 -12
  9. package/dist/{chunk-VISK6LKE.cjs → chunk-DDXQGTWB.cjs} +2 -2
  10. package/dist/{chunk-IQQ3SLUK.cjs → chunk-F65RSJVV.cjs} +17 -17
  11. package/dist/{chunk-NX7P2T2U.cjs → chunk-IXZNBDXT.cjs} +11 -11
  12. package/dist/{chunk-KWZ62LPZ.cjs → chunk-KM2TVQCH.cjs} +98 -98
  13. package/dist/{chunk-Q7EXOVMT.cjs → chunk-L55XLH5A.cjs} +29 -29
  14. package/dist/{chunk-TOPGBOCN.cjs → chunk-LNCBN4BL.cjs} +2 -2
  15. package/dist/{chunk-VWUQVJ2D.cjs → chunk-MWH5ZTMB.cjs} +77 -77
  16. package/dist/{chunk-Y3EBUFX4.cjs → chunk-MYHS4W2H.cjs} +1 -1
  17. package/dist/{chunk-BTVO676B.cjs → chunk-NWZSYG4S.cjs} +74 -74
  18. package/dist/{chunk-TUXPFF4P.cjs → chunk-OJLZ7PGO.cjs} +28 -28
  19. package/dist/{chunk-TTQHSSHF.cjs → chunk-OTZQP53Y.cjs} +3 -3
  20. package/dist/{chunk-ZHGOXDA3.cjs → chunk-UM6HFGTI.cjs} +64 -57
  21. package/dist/{chunk-USMR73ND.cjs → chunk-WAQPW4CB.cjs} +4 -4
  22. package/dist/{chunk-4JZC624S.cjs → chunk-XN6LXMH5.cjs} +174 -173
  23. package/dist/{chunk-Q6B2DC65.cjs → chunk-XT5WEHFM.cjs} +3 -3
  24. package/dist/{chunk-UAKXZ2KD.cjs → chunk-YFTQ2ALU.cjs} +37 -37
  25. package/dist/{chunk-5AOKXXHV.cjs → chunk-Z5KX56TK.cjs} +4 -4
  26. package/dist/{cloud-tenants-7RNZ6GHM.cjs → cloud-tenants-QFE6QMR5.cjs} +7 -7
  27. package/dist/components/authors/author-detail-view.d.ts.map +1 -1
  28. package/dist/components/authors/author-detail-view.js +12 -2
  29. package/dist/components/case-studies/index.cjs +23 -23
  30. package/dist/components/chat/index.cjs +5 -5
  31. package/dist/components/contact/index.cjs +8 -8
  32. package/dist/components/docs/index.cjs +11 -11
  33. package/dist/components/embeds/index.cjs +8 -8
  34. package/dist/components/faq/index.cjs +9 -9
  35. package/dist/components/features/index.cjs +7 -7
  36. package/dist/components/features/use-file-playback.d.ts +6 -4
  37. package/dist/components/features/use-file-playback.d.ts.map +1 -1
  38. package/dist/components/features/use-file-playback.js +16 -7
  39. package/dist/components/help-center-pages/index.cjs +83 -83
  40. package/dist/components/index.cjs +66 -56
  41. package/dist/components/meeting-scheduler/index.cjs +37 -37
  42. package/dist/components/navigation/index.cjs +10 -10
  43. package/dist/components/onboarding-guides/index.cjs +10 -10
  44. package/dist/components/product-demo/index.cjs +16 -16
  45. package/dist/components/related-content/card-registry.d.ts +5 -0
  46. package/dist/components/related-content/card-registry.d.ts.map +1 -1
  47. package/dist/components/related-content/card-registry.js +2 -0
  48. package/dist/components/related-content/index.cjs +5 -5
  49. package/dist/components/related-content/related-content-section.d.ts.map +1 -1
  50. package/dist/components/related-content/related-content-section.js +11 -6
  51. package/dist/components/tickets/index.cjs +13 -13
  52. package/dist/components/ui/index.cjs +7 -7
  53. package/dist/components/ui/photo-wall.d.ts +9 -1
  54. package/dist/components/ui/photo-wall.d.ts.map +1 -1
  55. package/dist/components/ui/photo-wall.js +8 -7
  56. package/dist/{devices-NNDBC6IH.cjs → devices-SFJDLXSW.cjs} +8 -8
  57. package/dist/{embeddable-chat-DI7ZZTBP.cjs → embeddable-chat-XZUWAK4W.cjs} +73 -73
  58. package/dist/index.cjs +11 -11
  59. package/dist/{knowledge-DPUMWQED.cjs → knowledge-SAK3ZGCO.cjs} +8 -8
  60. package/dist/{logs-EE25MWYM.cjs → logs-CYBGMFA5.cjs} +15 -15
  61. package/dist/{policies-H5LPZWEM.cjs → policies-XXDOICWF.cjs} +11 -11
  62. package/dist/{scripts-YGO4LOES.cjs → scripts-C5T2AQPA.cjs} +12 -12
  63. package/dist/{software-update-5BEB62ZH.cjs → software-update-XU5AI4TP.cjs} +10 -10
  64. package/dist/{video-file-player-4TXA7BZF.cjs → video-file-player-6ZFOZFER.cjs} +16 -7
  65. package/package.json +1 -1
  66. package/src/components/authors/author-detail-view.tsx +10 -2
  67. package/src/components/features/use-file-playback.ts +33 -14
  68. package/src/components/related-content/card-registry.tsx +7 -0
  69. package/src/components/related-content/related-content-section.tsx +12 -2
  70. package/src/components/ui/photo-wall.tsx +19 -8
@@ -8,7 +8,7 @@ var _chunkSTEJZPIOcjs = require('./chunk-STEJZPIO.cjs');
8
8
  var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
9
9
 
10
10
 
11
- var _chunk4JZC624Scjs = require('./chunk-4JZC624S.cjs');
11
+ var _chunkXN6LXMH5cjs = require('./chunk-XN6LXMH5.cjs');
12
12
  require('./chunk-LJT2KRE2.cjs');
13
13
  require('./chunk-RB7VLVMD.cjs');
14
14
  require('./chunk-V3W56L2D.cjs');
@@ -19,12 +19,12 @@ require('./chunk-2JRSYWFP.cjs');
19
19
  require('./chunk-24I6RFVU.cjs');
20
20
  require('./chunk-A6P6DHEZ.cjs');
21
21
  require('./chunk-MZ4KBSH7.cjs');
22
- require('./chunk-TOPGBOCN.cjs');
22
+ require('./chunk-LNCBN4BL.cjs');
23
23
  require('./chunk-C42WIUH6.cjs');
24
- require('./chunk-BTVO676B.cjs');
24
+ require('./chunk-NWZSYG4S.cjs');
25
25
 
26
26
 
27
- var _chunkKWZ62LPZcjs = require('./chunk-KWZ62LPZ.cjs');
27
+ var _chunkKM2TVQCHcjs = require('./chunk-KM2TVQCH.cjs');
28
28
  require('./chunk-EHJE3UWZ.cjs');
29
29
  require('./chunk-KKAY6GPU.cjs');
30
30
  require('./chunk-5QP3K2CE.cjs');
@@ -1825,8 +1825,8 @@ require('./chunk-7DNL734S.cjs');
1825
1825
  require('./chunk-WWUSFOJ7.cjs');
1826
1826
  require('./chunk-SKI6NKOE.cjs');
1827
1827
  require('./chunk-EWPR7662.cjs');
1828
- require('./chunk-TUXPFF4P.cjs');
1829
- require('./chunk-Y3EBUFX4.cjs');
1828
+ require('./chunk-OJLZ7PGO.cjs');
1829
+ require('./chunk-MYHS4W2H.cjs');
1830
1830
  require('./chunk-R3JX4MXD.cjs');
1831
1831
  require('./chunk-SETFUCZA.cjs');
1832
1832
  require('./chunk-VFUMM6JC.cjs');
@@ -1903,10 +1903,10 @@ function KnowledgeScreen(_props) {
1903
1903
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1904
1904
  const fixture = _react.useMemo.call(void 0, () => buildKnowledgeFixture(cast), [cast]);
1905
1905
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1906
- _chunk4JZC624Scjs.KnowledgeBaseArticleView,
1906
+ _chunkXN6LXMH5cjs.KnowledgeBaseArticleView,
1907
1907
  {
1908
1908
  ...fixture.article,
1909
- content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKWZ62LPZcjs.SimpleMarkdownRenderer, { content: fixture.content, textSize: "compact" })
1909
+ content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKM2TVQCHcjs.SimpleMarkdownRenderer, { content: fixture.content, textSize: "compact" })
1910
1910
  }
1911
1911
  ) });
1912
1912
  }
@@ -16,7 +16,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
16
16
 
17
17
 
18
18
 
19
- var _chunk4JZC624Scjs = require('./chunk-4JZC624S.cjs');
19
+ var _chunkXN6LXMH5cjs = require('./chunk-XN6LXMH5.cjs');
20
20
  require('./chunk-LJT2KRE2.cjs');
21
21
  require('./chunk-RB7VLVMD.cjs');
22
22
  require('./chunk-V3W56L2D.cjs');
@@ -27,12 +27,12 @@ require('./chunk-2JRSYWFP.cjs');
27
27
  require('./chunk-24I6RFVU.cjs');
28
28
  require('./chunk-A6P6DHEZ.cjs');
29
29
  require('./chunk-MZ4KBSH7.cjs');
30
- require('./chunk-TOPGBOCN.cjs');
30
+ require('./chunk-LNCBN4BL.cjs');
31
31
  require('./chunk-C42WIUH6.cjs');
32
32
 
33
33
 
34
- var _chunkBTVO676Bcjs = require('./chunk-BTVO676B.cjs');
35
- require('./chunk-KWZ62LPZ.cjs');
34
+ var _chunkNWZSYG4Scjs = require('./chunk-NWZSYG4S.cjs');
35
+ require('./chunk-KM2TVQCH.cjs');
36
36
  require('./chunk-EHJE3UWZ.cjs');
37
37
  require('./chunk-KKAY6GPU.cjs');
38
38
  require('./chunk-5QP3K2CE.cjs');
@@ -1833,8 +1833,8 @@ require('./chunk-7DNL734S.cjs');
1833
1833
  require('./chunk-WWUSFOJ7.cjs');
1834
1834
  require('./chunk-SKI6NKOE.cjs');
1835
1835
  require('./chunk-EWPR7662.cjs');
1836
- require('./chunk-TUXPFF4P.cjs');
1837
- require('./chunk-Y3EBUFX4.cjs');
1836
+ require('./chunk-OJLZ7PGO.cjs');
1837
+ require('./chunk-MYHS4W2H.cjs');
1838
1838
  require('./chunk-R3JX4MXD.cjs');
1839
1839
  require('./chunk-SETFUCZA.cjs');
1840
1840
  require('./chunk-VFUMM6JC.cjs');
@@ -1884,7 +1884,7 @@ function entry(logId, minutesAgo, severity, toolType, device2, summary) {
1884
1884
  id: logId,
1885
1885
  logId,
1886
1886
  timestamp: displayTime(_chunkDKOLQPE7cjs.demoMinutesAgo.call(void 0, minutesAgo)),
1887
- status: { label: severity, variant: _chunk4JZC624Scjs.logSeverityVariant.call(void 0, severity) },
1887
+ status: { label: severity, variant: _chunkXN6LXMH5cjs.logSeverityVariant.call(void 0, severity) },
1888
1888
  source: { name: toolType, toolType },
1889
1889
  device: device2,
1890
1890
  description: { title: summary }
@@ -1956,13 +1956,13 @@ var NO_FILTERS = {};
1956
1956
  var ACTION_COLUMNS = ["copy", "quickView", "open"];
1957
1957
  var BESIDE_DRAWER_HIDDEN = [...ACTION_COLUMNS, "tool", "source"];
1958
1958
  var logHref = () => "#";
1959
- var copyAction = () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4JZC624Scjs.LogCopyIconButton, {});
1959
+ var copyAction = () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN6LXMH5cjs.LogCopyIconButton, {});
1960
1960
  function LogsScreen({ compact = false }) {
1961
1961
  const [dock, setDock] = _react.useState.call(void 0, null);
1962
1962
  const selected = LOGS_FIXTURE_SELECTED;
1963
1963
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full bg-ods-bg", children: [
1964
1964
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "min-w-0 flex-1 overflow-clip", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1965
- _chunk4JZC624Scjs.LogsPageView,
1965
+ _chunkXN6LXMH5cjs.LogsPageView,
1966
1966
  {
1967
1967
  showHeader: false,
1968
1968
  className: "p-[var(--spacing-system-l)]",
@@ -1970,7 +1970,7 @@ function LogsScreen({ compact = false }) {
1970
1970
  onSearchChange: noop,
1971
1971
  onOpenFilters: noop,
1972
1972
  children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1973
- _chunk4JZC624Scjs.LogsTableView,
1973
+ _chunkXN6LXMH5cjs.LogsTableView,
1974
1974
  {
1975
1975
  logs: LOGS_FIXTURE_ENTRIES,
1976
1976
  facets: LOGS_FIXTURE_FACETS,
@@ -1984,8 +1984,8 @@ function LogsScreen({ compact = false }) {
1984
1984
  )
1985
1985
  }
1986
1986
  ) }),
1987
- !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: setDock, className: "relative w-[calc(400px+var(--spacing-system-m))] shrink-0", children: dock && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4JZC624Scjs.AppLayoutDrawerContainerContext.Provider, { value: dock, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1988
- _chunk4JZC624Scjs.LogDrawer,
1987
+ !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { ref: setDock, className: "relative w-[calc(400px+var(--spacing-system-m))] shrink-0", children: dock && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN6LXMH5cjs.AppLayoutDrawerContainerContext.Provider, { value: dock, children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1988
+ _chunkXN6LXMH5cjs.LogDrawer,
1989
1989
  {
1990
1990
  docked: true,
1991
1991
  isOpen: true,
@@ -1997,12 +1997,12 @@ function LogsScreen({ compact = false }) {
1997
1997
  { label: "Log ID", value: selected.logId },
1998
1998
  {
1999
1999
  label: "Source",
2000
- value: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4JZC624Scjs.ToolBadge, { toolType: _chunkBTVO676Bcjs.normalizeToolTypeWithFallback.call(void 0, selected.source.toolType) })
2000
+ value: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN6LXMH5cjs.ToolBadge, { toolType: _chunkNWZSYG4Scjs.normalizeToolTypeWithFallback.call(void 0, selected.source.toolType) })
2001
2001
  },
2002
- { label: "Device", value: _chunk4JZC624Scjs.logSourceLabels.call(void 0, selected.device).deviceName }
2002
+ { label: "Device", value: _chunkXN6LXMH5cjs.logSourceLabels.call(void 0, selected.device).deviceName }
2003
2003
  ],
2004
2004
  deviceCard: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2005
- _chunk4JZC624Scjs.DeviceCard,
2005
+ _chunkXN6LXMH5cjs.DeviceCard,
2006
2006
  {
2007
2007
  ...LOGS_FIXTURE_DEVICE,
2008
2008
  actions: {
@@ -10,7 +10,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunk4JZC624Scjs = require('./chunk-4JZC624S.cjs');
13
+ var _chunkXN6LXMH5cjs = require('./chunk-XN6LXMH5.cjs');
14
14
  require('./chunk-LJT2KRE2.cjs');
15
15
  require('./chunk-RB7VLVMD.cjs');
16
16
  require('./chunk-V3W56L2D.cjs');
@@ -21,10 +21,10 @@ require('./chunk-2JRSYWFP.cjs');
21
21
  require('./chunk-24I6RFVU.cjs');
22
22
  require('./chunk-A6P6DHEZ.cjs');
23
23
  require('./chunk-MZ4KBSH7.cjs');
24
- require('./chunk-TOPGBOCN.cjs');
24
+ require('./chunk-LNCBN4BL.cjs');
25
25
  require('./chunk-C42WIUH6.cjs');
26
- require('./chunk-BTVO676B.cjs');
27
- require('./chunk-KWZ62LPZ.cjs');
26
+ require('./chunk-NWZSYG4S.cjs');
27
+ require('./chunk-KM2TVQCH.cjs');
28
28
  require('./chunk-EHJE3UWZ.cjs');
29
29
  require('./chunk-KKAY6GPU.cjs');
30
30
  require('./chunk-5QP3K2CE.cjs');
@@ -1825,8 +1825,8 @@ require('./chunk-7DNL734S.cjs');
1825
1825
  require('./chunk-WWUSFOJ7.cjs');
1826
1826
  require('./chunk-SKI6NKOE.cjs');
1827
1827
  require('./chunk-EWPR7662.cjs');
1828
- require('./chunk-TUXPFF4P.cjs');
1829
- require('./chunk-Y3EBUFX4.cjs');
1828
+ require('./chunk-OJLZ7PGO.cjs');
1829
+ require('./chunk-MYHS4W2H.cjs');
1830
1830
  require('./chunk-R3JX4MXD.cjs');
1831
1831
  require('./chunk-SETFUCZA.cjs');
1832
1832
  require('./chunk-VFUMM6JC.cjs');
@@ -1889,14 +1889,14 @@ var POLICIES = [
1889
1889
  policy("policy-local-admins", "No local admins", "No everyday account is a local administrator.", false, 0)
1890
1890
  ];
1891
1891
  var POLICIES_FIXTURE = {
1892
- summary: _chunk4JZC624Scjs.computePolicySummary.call(void 0, POLICIES),
1892
+ summary: _chunkXN6LXMH5cjs.computePolicySummary.call(void 0, POLICIES),
1893
1893
  rows: POLICIES.map((item) => ({
1894
1894
  id: item.id,
1895
1895
  name: item.name,
1896
1896
  description: item.description,
1897
1897
  critical: item.critical,
1898
1898
  severityLabel: item.critical ? "Critical" : "Low",
1899
- status: _chunk4JZC624Scjs.getPolicyTableStatus.call(void 0, item),
1899
+ status: _chunkXN6LXMH5cjs.getPolicyTableStatus.call(void 0, item),
1900
1900
  actions: [
1901
1901
  { label: "Policy Details", onClick: noop },
1902
1902
  { label: "Delete Policy", onClick: noop }
@@ -1910,16 +1910,16 @@ var POLICIES_FIXTURE = {
1910
1910
  var _jsxruntime = require('react/jsx-runtime');
1911
1911
  function PoliciesScreen({ compact = false }) {
1912
1912
  const table = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1913
- _chunk4JZC624Scjs.PoliciesTable,
1913
+ _chunkXN6LXMH5cjs.PoliciesTable,
1914
1914
  {
1915
1915
  rows: POLICIES_FIXTURE.rows,
1916
1916
  rowAsLink: true,
1917
- rightSlot: compact ? void 0 : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4JZC624Scjs.DataTable.RowCount, {}),
1917
+ rightSlot: compact ? void 0 : /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN6LXMH5cjs.DataTable.RowCount, {}),
1918
1918
  emptyMessage: "No policies found."
1919
1919
  }
1920
1920
  );
1921
1921
  return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full flex-col gap-[var(--spacing-system-l)] bg-ods-bg p-[var(--spacing-system-l)]", children: [
1922
- !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4JZC624Scjs.PolicySummaryCards, { summary: POLICIES_FIXTURE.summary, now: POLICIES_FIXTURE.now }),
1922
+ !compact && /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN6LXMH5cjs.PolicySummaryCards, { summary: POLICIES_FIXTURE.summary, now: POLICIES_FIXTURE.now }),
1923
1923
  table
1924
1924
  ] });
1925
1925
  }
@@ -13,7 +13,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
13
13
 
14
14
 
15
15
 
16
- var _chunk4JZC624Scjs = require('./chunk-4JZC624S.cjs');
16
+ var _chunkXN6LXMH5cjs = require('./chunk-XN6LXMH5.cjs');
17
17
  require('./chunk-LJT2KRE2.cjs');
18
18
  require('./chunk-RB7VLVMD.cjs');
19
19
 
@@ -26,10 +26,10 @@ require('./chunk-2JRSYWFP.cjs');
26
26
  require('./chunk-24I6RFVU.cjs');
27
27
  require('./chunk-A6P6DHEZ.cjs');
28
28
  require('./chunk-MZ4KBSH7.cjs');
29
- require('./chunk-TOPGBOCN.cjs');
29
+ require('./chunk-LNCBN4BL.cjs');
30
30
  require('./chunk-C42WIUH6.cjs');
31
- require('./chunk-BTVO676B.cjs');
32
- require('./chunk-KWZ62LPZ.cjs');
31
+ require('./chunk-NWZSYG4S.cjs');
32
+ require('./chunk-KM2TVQCH.cjs');
33
33
  require('./chunk-EHJE3UWZ.cjs');
34
34
  require('./chunk-KKAY6GPU.cjs');
35
35
  require('./chunk-5QP3K2CE.cjs');
@@ -1832,8 +1832,8 @@ require('./chunk-7DNL734S.cjs');
1832
1832
  require('./chunk-WWUSFOJ7.cjs');
1833
1833
  require('./chunk-SKI6NKOE.cjs');
1834
1834
  require('./chunk-EWPR7662.cjs');
1835
- require('./chunk-TUXPFF4P.cjs');
1836
- require('./chunk-Y3EBUFX4.cjs');
1835
+ require('./chunk-OJLZ7PGO.cjs');
1836
+ require('./chunk-MYHS4W2H.cjs');
1837
1837
  require('./chunk-R3JX4MXD.cjs');
1838
1838
  require('./chunk-SETFUCZA.cjs');
1839
1839
  require('./chunk-VFUMM6JC.cjs');
@@ -1993,8 +1993,8 @@ function buildScriptsFixture(cast) {
1993
1993
  var _jsxruntime = require('react/jsx-runtime');
1994
1994
  var WIDE_HIDDEN_COLUMNS = ["result", "open"];
1995
1995
  var COMPACT_COLUMNS = [
1996
- { ..._chunk4JZC624Scjs.EXECUTION_COLUMNS.machineId, width: "flex-1 min-w-0", hideAt: void 0 },
1997
- _chunk4JZC624Scjs.EXECUTION_COLUMNS.status
1996
+ { ..._chunkXN6LXMH5cjs.EXECUTION_COLUMNS.machineId, width: "flex-1 min-w-0", hideAt: void 0 },
1997
+ _chunkXN6LXMH5cjs.EXECUTION_COLUMNS.status
1998
1998
  ];
1999
1999
  var COMPACT_ROWS = 4;
2000
2000
  var TOKEN_CLASS = {
@@ -2053,7 +2053,7 @@ function ScriptCodePicture({ script }) {
2053
2053
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex min-w-0 items-center justify-between gap-[var(--spacing-system-m)]", children: [
2054
2054
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkV3W56L2Dcjs.TruncateText, { variant: "h6", tone: "secondary", children: `Written by ${provenance.author} \xB7 approved by ${provenance.approver}` }),
2055
2055
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2056
- _chunk4JZC624Scjs.ScriptShellBadge,
2056
+ _chunkXN6LXMH5cjs.ScriptShellBadge,
2057
2057
  {
2058
2058
  value: script.shellType,
2059
2059
  className: "shrink-0 text-ods-text-secondary text-h6",
@@ -2077,7 +2077,7 @@ function ScriptsScreen({ compact = false }) {
2077
2077
  return (
2078
2078
  // Four runs of the card's row height fill the frame; the padding is what is left round them.
2079
2079
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full overflow-hidden bg-ods-bg p-[var(--spacing-system-xsf)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2080
- _chunk4JZC624Scjs.ScriptExecutionsTable,
2080
+ _chunkXN6LXMH5cjs.ScriptExecutionsTable,
2081
2081
  {
2082
2082
  rows: fixture.executions.slice(0, COMPACT_ROWS),
2083
2083
  columns: COMPACT_COLUMNS,
@@ -2087,13 +2087,13 @@ function ScriptsScreen({ compact = false }) {
2087
2087
  ) })
2088
2088
  );
2089
2089
  }
2090
- const renderOutput = (row) => row.id === fixture.openExecutionId ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunk4JZC624Scjs.ScriptExecutionResult, { result: row.result, empty: "\u2014" }) : null;
2090
+ const renderOutput = (row) => row.id === fixture.openExecutionId ? /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkXN6LXMH5cjs.ScriptExecutionResult, { result: row.result, empty: "\u2014" }) : null;
2091
2091
  return (
2092
2092
  // The frame's tighter padding and no header row: the output opened under a run needs the height.
2093
2093
  /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "div", { className: "flex h-full gap-[var(--spacing-system-m)] overflow-hidden bg-ods-bg p-[var(--spacing-system-m)]", children: [
2094
2094
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "w-[39%] shrink-0", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, ScriptCodePicture, { script: fixture.script }) }),
2095
2095
  /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "min-w-0 flex-1 overflow-hidden", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
2096
- _chunk4JZC624Scjs.ScriptExecutionsTable,
2096
+ _chunkXN6LXMH5cjs.ScriptExecutionsTable,
2097
2097
  {
2098
2098
  rows: fixture.executions,
2099
2099
  hideColumns: WIDE_HIDDEN_COLUMNS,
@@ -15,7 +15,7 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunk4JZC624Scjs = require('./chunk-4JZC624S.cjs');
18
+ var _chunkXN6LXMH5cjs = require('./chunk-XN6LXMH5.cjs');
19
19
  require('./chunk-LJT2KRE2.cjs');
20
20
  require('./chunk-RB7VLVMD.cjs');
21
21
 
@@ -28,10 +28,10 @@ require('./chunk-2JRSYWFP.cjs');
28
28
  require('./chunk-24I6RFVU.cjs');
29
29
  require('./chunk-A6P6DHEZ.cjs');
30
30
  require('./chunk-MZ4KBSH7.cjs');
31
- require('./chunk-TOPGBOCN.cjs');
31
+ require('./chunk-LNCBN4BL.cjs');
32
32
  require('./chunk-C42WIUH6.cjs');
33
- require('./chunk-BTVO676B.cjs');
34
- require('./chunk-KWZ62LPZ.cjs');
33
+ require('./chunk-NWZSYG4S.cjs');
34
+ require('./chunk-KM2TVQCH.cjs');
35
35
  require('./chunk-EHJE3UWZ.cjs');
36
36
  require('./chunk-KKAY6GPU.cjs');
37
37
  require('./chunk-5QP3K2CE.cjs');
@@ -1832,8 +1832,8 @@ require('./chunk-7DNL734S.cjs');
1832
1832
  require('./chunk-WWUSFOJ7.cjs');
1833
1833
  require('./chunk-SKI6NKOE.cjs');
1834
1834
  require('./chunk-EWPR7662.cjs');
1835
- require('./chunk-TUXPFF4P.cjs');
1836
- require('./chunk-Y3EBUFX4.cjs');
1835
+ require('./chunk-OJLZ7PGO.cjs');
1836
+ require('./chunk-MYHS4W2H.cjs');
1837
1837
  require('./chunk-R3JX4MXD.cjs');
1838
1838
  require('./chunk-SETFUCZA.cjs');
1839
1839
  require('./chunk-VFUMM6JC.cjs');
@@ -1920,12 +1920,12 @@ function StaticPackageField({ value }) {
1920
1920
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1921
1921
  _chunkV3W56L2Dcjs.Autocomplete,
1922
1922
  {
1923
- label: _chunk4JZC624Scjs.PACKAGE_SEARCH_LABEL,
1923
+ label: _chunkXN6LXMH5cjs.PACKAGE_SEARCH_LABEL,
1924
1924
  labelVariant: "large",
1925
1925
  options: value ? [{ value: value.id, label: value.name, description: _nullishCoalesce(value.description, () => ( void 0)) }] : [],
1926
1926
  value: _nullishCoalesce(_optionalChain([value, 'optionalAccess', _ => _.id]), () => ( null)),
1927
1927
  onChange: noop,
1928
- placeholder: _chunk4JZC624Scjs.PACKAGE_SEARCH_PLACEHOLDER
1928
+ placeholder: _chunkXN6LXMH5cjs.PACKAGE_SEARCH_PLACEHOLDER
1929
1929
  }
1930
1930
  );
1931
1931
  }
@@ -1939,7 +1939,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1939
1939
  [fixture.devices, fixture.selectedIds]
1940
1940
  );
1941
1941
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg pt-[var(--spacing-system-l)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1942
- _chunk4JZC624Scjs.SoftwareActionForm,
1942
+ _chunkXN6LXMH5cjs.SoftwareActionForm,
1943
1943
  {
1944
1944
  action: fixture.action,
1945
1945
  showHeader: false,
@@ -1951,7 +1951,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1951
1951
  initialValues: fixture.initialValues,
1952
1952
  renderPackageSearch,
1953
1953
  renderDevicePicker: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1954
- _chunk4JZC624Scjs.DeviceSelector,
1954
+ _chunkXN6LXMH5cjs.DeviceSelector,
1955
1955
  {
1956
1956
  devices: selected,
1957
1957
  loading: false,
@@ -101,6 +101,7 @@ function useMediaEvent(mediaRef, type, handler) {
101
101
  return () => onLiveElement(() => _optionalChain([element, 'access', _6 => _6.removeEventListener, 'optionalCall', _7 => _7(type, listener)]));
102
102
  }, [mediaRef, type, handlerRef]);
103
103
  }
104
+ var INTERRUPTED_PLAY_RETRIES = 2;
104
105
  async function play(element) {
105
106
  try {
106
107
  await _optionalChain([element, 'access', _8 => _8.play, 'optionalCall', _9 => _9()]);
@@ -117,12 +118,16 @@ function usePlaybackSound(mediaRef, { autoPlay, autoPlayUnmuted, startMuted, onM
117
118
  const started = play(element);
118
119
  setBlocked(false);
119
120
  setMutedFallback(true);
120
- if (await started !== "playing" && wanted()) setBlocked(true);
121
+ const outcome = await started;
122
+ if (outcome !== "playing" && wanted()) setBlocked(true);
123
+ return outcome;
121
124
  }, []);
122
125
  const playWithSound = _react.useCallback.call(void 0,
123
126
  async (element, muted, wanted = always) => {
124
127
  onLiveElement(() => Object.assign(element, { muted }));
125
- if (await play(element) === "refused" && wanted()) await playMuted(element, wanted);
128
+ const outcome = await play(element);
129
+ if (outcome === "refused" && wanted()) return playMuted(element, wanted);
130
+ return outcome;
126
131
  },
127
132
  [playMuted]
128
133
  );
@@ -244,11 +249,15 @@ function useHoverPlayback(mediaRef, sound, { playOnHover, playWhenHovered, muted
244
249
  onLiveElement(() => {
245
250
  element.volume = SOUND_VOLUME;
246
251
  });
247
- if (_chunkSETFUCZAcjs.hasUserInteracted.call(void 0, )) {
248
- void playWithSound(element, hostMutedRef.current, wanted);
249
- return;
250
- }
251
- void playMuted(element, wanted);
252
+ const attempt = (retriesLeft) => {
253
+ const played = _chunkSETFUCZAcjs.hasUserInteracted.call(void 0, ) ? playWithSound(element, hostMutedRef.current, wanted) : playMuted(element, wanted);
254
+ void played.then((outcome) => {
255
+ if (outcome === "interrupted" && hovered && element.paused !== false && retriesLeft > 0)
256
+ attempt(retriesLeft - 1);
257
+ });
258
+ };
259
+ attempt(INTERRUPTED_PLAY_RETRIES);
260
+ if (_chunkSETFUCZAcjs.hasUserInteracted.call(void 0, )) return;
252
261
  const onFirstGesture = () => {
253
262
  if (!hovered) return;
254
263
  onLiveElement(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.774",
3
+ "version": "0.0.776",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -25,7 +25,7 @@
25
25
 
26
26
  import type React from 'react';
27
27
  import Image from '../../embed-shims/next-image';
28
- import { AVATAR_SIZE } from '../../styles/component-sizes';
28
+ import { AVATAR_SIZE, AVATAR_SIZE_PX } from '../../styles/component-sizes';
29
29
  import type { AuthorProfile } from '../../types/entity-author';
30
30
  import { cn } from '../../utils/cn';
31
31
  import { formatBioText } from '../../utils/format';
@@ -77,7 +77,15 @@ export function AuthorDetailView({ author, proxyImageUrl, children, className }:
77
77
  ) : (
78
78
  <div className="relative h-full w-full overflow-hidden rounded-full border border-ods-border bg-ods-bg-surface">
79
79
  {proxiedAvatar ? (
80
- <Image src={proxiedAvatar} alt={author.fullName} fill className="object-cover" unoptimized />
80
+ <Image
81
+ src={proxiedAvatar}
82
+ alt={author.fullName}
83
+ fill
84
+ // The frame's size, so a host that resizes serves a 96 px picture, not the 2500 px original.
85
+ sizes={`${AVATAR_SIZE_PX.profile}px`}
86
+ className="object-cover"
87
+ unoptimized
88
+ />
81
89
  ) : (
82
90
  <div className="flex h-full w-full items-center justify-center text-ods-text-secondary text-h2">
83
91
  {author.fullName.charAt(0).toUpperCase()}
@@ -77,7 +77,10 @@ function useMediaEvent(mediaRef: MediaRef, type: string, handler: () => void): v
77
77
  }
78
78
 
79
79
  /** How a `play()` ended: it plays, the autoplay policy refused it, or something else stopped it (a pause, a teardown). */
80
- type PlayOutcome = 'playing' | 'refused' | 'interrupted';
80
+ /** How many times a hover asks again after its `play()` was aborted (each attempt waits for the element). */
81
+ const INTERRUPTED_PLAY_RETRIES = 2;
82
+
83
+ export type PlayOutcome = 'playing' | 'refused' | 'interrupted';
81
84
 
82
85
  async function play(element: MediaElement): Promise<PlayOutcome> {
83
86
  try {
@@ -100,10 +103,11 @@ type SoundOptions = Pick<
100
103
  export interface PlaybackSound {
101
104
  /** Playback runs muted because the browser refused sound: the unmute control shows. */
102
105
  mutedFallback: boolean;
103
- /** Play with sound (or `muted`, a host's standing choice); refused, play muted. `wanted` says the play is still asked for. */
104
- playWithSound: (element: MediaElement, muted: boolean, wanted?: () => boolean) => Promise<void>;
105
- /** Play muted, and say so. `wanted` says the play is still asked for. */
106
- playMuted: (element: MediaElement, wanted?: () => boolean) => Promise<void>;
106
+ /** Play with sound (or `muted`, a host's standing choice); refused, play muted. `wanted` says the play is still
107
+ * asked for. Resolves with how the last `play()` ended. */
108
+ playWithSound: (element: MediaElement, muted: boolean, wanted?: () => boolean) => Promise<PlayOutcome>;
109
+ /** Play muted, and say so. `wanted` says the play is still asked for. Resolves with how the `play()` ended. */
110
+ playMuted: (element: MediaElement, wanted?: () => boolean) => Promise<PlayOutcome>;
107
111
  /** The muted fallback is over (sound is on, or playback stopped). */
108
112
  endMutedFallback: () => void;
109
113
  /** The unmute control's click: it is the gesture the autoplay policy wants, so sound always starts. */
@@ -125,7 +129,9 @@ export function usePlaybackSound(
125
129
  const started = play(element);
126
130
  setBlocked(false);
127
131
  setMutedFallback(true);
128
- if ((await started) !== 'playing' && wanted()) setBlocked(true);
132
+ const outcome = await started;
133
+ if (outcome !== 'playing' && wanted()) setBlocked(true);
134
+ return outcome;
129
135
  }, []);
130
136
 
131
137
  const playWithSound = useCallback(
@@ -133,7 +139,9 @@ export function usePlaybackSound(
133
139
  onLiveElement(() => Object.assign(element, { muted }));
134
140
  // Only a refusal falls back to muted. A pause that interrupts the play (a
135
141
  // fast hover-out) must not start playback again behind the pointer.
136
- if ((await play(element)) === 'refused' && wanted()) await playMuted(element, wanted);
142
+ const outcome = await play(element);
143
+ if (outcome === 'refused' && wanted()) return playMuted(element, wanted);
144
+ return outcome;
137
145
  },
138
146
  [playMuted],
139
147
  );
@@ -300,13 +308,24 @@ export function useHoverPlayback(
300
308
  onLiveElement(() => {
301
309
  element.volume = SOUND_VOLUME;
302
310
  });
303
- if (hasUserInteracted()) {
304
- void playWithSound(element, hostMutedRef.current, wanted);
305
- return;
306
- }
307
- // No gesture on the page yet, so sound would be refused: start muted with no
308
- // refusal to wait for, and turn the sound on the moment the first gesture lands.
309
- void playMuted(element, wanted);
311
+ // A `play()` can be aborted by the element itself: a player drawn BY this hover (a bite card mounts its player
312
+ // on the first hover) is asked to play while its stream is still attaching, and attaching it aborts the play
313
+ // (AbortError, "interrupted by a new load request"). The first hover on every card did nothing. The play()
314
+ // promise is how the browser and Mux say a play did not happen; while the hover lasts, ask again: a `play()`
315
+ // on a loading element waits until it can play. A hover-out's own pause ends the hover, so it is never retried.
316
+ const attempt = (retriesLeft: number) => {
317
+ const played = hasUserInteracted()
318
+ ? playWithSound(element, hostMutedRef.current, wanted)
319
+ : playMuted(element, wanted);
320
+ void played.then(outcome => {
321
+ if (outcome === 'interrupted' && hovered && element.paused !== false && retriesLeft > 0)
322
+ attempt(retriesLeft - 1);
323
+ });
324
+ };
325
+ attempt(INTERRUPTED_PLAY_RETRIES);
326
+ if (hasUserInteracted()) return;
327
+ // No gesture on the page yet, so sound would be refused: it started muted with no
328
+ // refusal to wait for, and the sound turns on the moment the first gesture lands.
310
329
  const onFirstGesture = () => {
311
330
  if (!hovered) return;
312
331
  onLiveElement(() => {
@@ -580,6 +580,11 @@ export interface RelatedCardContext {
580
580
  anchorAttrs: Pick<CardLinkAnchorProps, 'target' | 'rel'>;
581
581
  /** Branded OG fallback for cards whose row has no featured image. */
582
582
  placeholderUrl?: string;
583
+ /**
584
+ * The rail's first card: its image is likely the page's largest paint (an author page opens on it), so a card that
585
+ * can rank its image fetches it at once instead of lazily.
586
+ */
587
+ priority?: boolean;
583
588
  extras?: ChatCardDispatchExtras;
584
589
  }
585
590
 
@@ -645,6 +650,7 @@ function programEntry(configKey: 'podcast' | 'webinar' | 'event'): RelatedCardRe
645
650
  href={ctx.href}
646
651
  targetPlatform={ctx.targetPlatform}
647
652
  placeholderUrl={ctx.placeholderUrl}
653
+ priority={ctx.priority}
648
654
  {...ctx.anchorAttrs}
649
655
  />
650
656
  );
@@ -684,6 +690,7 @@ export const RELATED_CARD_REGISTRY: Record<string, RelatedCardRegistryEntry> = {
684
690
  href={ctx.href}
685
691
  targetPlatform={ctx.targetPlatform}
686
692
  placeholderUrl={ctx.placeholderUrl}
693
+ priority={ctx.priority}
687
694
  {...ctx.anchorAttrs}
688
695
  />
689
696
  ),
@@ -200,8 +200,11 @@ function CardForType({
200
200
  linkProps,
201
201
  extras,
202
202
  adminCampaignCard,
203
+ priority,
203
204
  }: {
204
205
  type: string;
206
+ /** The rail's first card: its image is fetched at once (see `RelatedCardContext.priority`). */
207
+ priority?: boolean;
205
208
  /** One fetched row, still unvalidated. Its shape is decided at RUNTIME by
206
209
  * `type` (each group fetches from its own per-type list API), so it stays
207
210
  * `unknown` right up to the registry entry for that type — which owns the
@@ -247,6 +250,7 @@ function CardForType({
247
250
  // a numeric title reached `buildOgPlaceholderUrl` as a number. `rowString`
248
251
  // makes the claim true.
249
252
  placeholderUrl: extras?.buildOgPlaceholderUrl?.(rowString(item, 'title') ?? '') ?? undefined,
253
+ priority,
250
254
  extras,
251
255
  });
252
256
  }
@@ -361,11 +365,14 @@ function ContentGroup({
361
365
  heading,
362
366
  onLoadingChange,
363
367
  seedRows,
368
+ leadsRail = false,
364
369
  }: {
365
370
  type: string;
366
371
  refs: ContentRef[];
367
372
  /** The rows of this group's FIRST page, read by the server (`initialRows`). */
368
373
  seedRows?: ReadonlyArray<unknown>;
374
+ /** The rail's first group: its first card's image is fetched at once. */
375
+ leadsRail?: boolean;
369
376
  columns: 2 | 3;
370
377
  buildUrl: (type: string, ids: string[]) => string | null;
371
378
  resolveHref: (ref: ContentRef) => { href: string | null; targetPlatform: string | null };
@@ -448,7 +455,7 @@ function ContentGroup({
448
455
  const itemById = new Map(items.map(it => [rowKey(it), it]));
449
456
 
450
457
  const cards = pageRefs
451
- .map(contentRef => {
458
+ .map((contentRef, index) => {
452
459
  const itemId = String(contentRef.id);
453
460
  const item = itemById.get(itemId);
454
461
  if (!item) return null;
@@ -471,6 +478,8 @@ function ContentGroup({
471
478
  linkProps={linkProps}
472
479
  extras={extras}
473
480
  adminCampaignCard={adminCampaignCard}
481
+ // The rail's first card, on its first page: the top of the rail, often the page's largest paint.
482
+ priority={leadsRail && page === 1 && index === 0}
474
483
  />
475
484
  )}
476
485
  </LinkProvider>
@@ -787,7 +796,7 @@ export function RelatedContentSection({
787
796
  return (
788
797
  <LoadingRegion as="section" label="Loading related content" announce={loadingTypes.size > 0} className={RAIL_CLASS}>
789
798
  <h2 className={RAIL_TITLE_CLASS}>{accentSentenceMarks(title)}</h2>
790
- {orderedTypes.map(type => (
799
+ {orderedTypes.map((type, groupIndex) => (
791
800
  <ContentGroup
792
801
  key={type}
793
802
  type={type}
@@ -801,6 +810,7 @@ export function RelatedContentSection({
801
810
  heading={<GroupHeading type={type} />}
802
811
  onLoadingChange={onGroupLoadingChange}
803
812
  seedRows={initialRows?.[type]}
813
+ leadsRail={groupIndex === 0}
804
814
  />
805
815
  ))}
806
816
  </LoadingRegion>