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

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 (94) hide show
  1. package/dist/case-study-card-WXMWYGSW.cjs +25 -0
  2. package/dist/{chunk-2MF547RG.cjs → chunk-2JO5HNEF.cjs} +28 -26
  3. package/dist/{chunk-DDXQGTWB.cjs → chunk-2W3VDE4D.cjs} +5 -5
  4. package/dist/{chunk-R3JX4MXD.cjs → chunk-3ZLPYEL5.cjs} +10 -10
  5. package/dist/{chunk-3V27UHSH.cjs → chunk-4BBOHZM3.cjs} +17 -17
  6. package/dist/{chunk-XT5WEHFM.cjs → chunk-4NRVV3KO.cjs} +3 -3
  7. package/dist/{chunk-DGFDBPO7.cjs → chunk-5GJM7VRR.cjs} +1 -94
  8. package/dist/{chunk-E64HPPRH.cjs → chunk-5PK22JP7.cjs} +50 -50
  9. package/dist/{chunk-57B5RUYD.cjs → chunk-64KBI5MI.cjs} +2 -2
  10. package/dist/{chunk-ASMNNSUQ.cjs → chunk-7PNRXJX2.cjs} +3 -3
  11. package/dist/{chunk-OTZQP53Y.cjs → chunk-AQXEM7GI.cjs} +8 -8
  12. package/dist/{chunk-VFZFCRAL.cjs → chunk-AQXKXZWB.cjs} +4 -4
  13. package/dist/{chunk-VFUMM6JC.cjs → chunk-BEMGJDXI.cjs} +2 -2
  14. package/dist/{chunk-HY6BCZH7.cjs → chunk-BNUZKBNV.cjs} +3 -3
  15. package/dist/{chunk-2YB4X5WT.cjs → chunk-DQALLDTZ.cjs} +6 -6
  16. package/dist/{chunk-MWH5ZTMB.cjs → chunk-F3BASIMT.cjs} +97 -95
  17. package/dist/{chunk-Z5KX56TK.cjs → chunk-HUPDPANN.cjs} +4 -4
  18. package/dist/{chunk-2AZAJ7RK.cjs → chunk-I4IC3BRC.cjs} +53 -53
  19. package/dist/{chunk-BDYI6HBT.cjs → chunk-IE3QCYBT.cjs} +18 -16
  20. package/dist/{chunk-UM6HFGTI.cjs → chunk-ILRQXZBA.cjs} +53 -51
  21. package/dist/{chunk-CZIMISAR.cjs → chunk-JB2SEF6Q.cjs} +7 -7
  22. package/dist/{chunk-AMVI5VXM.cjs → chunk-KA3VQ6X2.cjs} +91 -89
  23. package/dist/{chunk-LJT2KRE2.cjs → chunk-KLTUTZBO.cjs} +24 -24
  24. package/dist/{chunk-EHJE3UWZ.cjs → chunk-LBGAHB6X.cjs} +20 -20
  25. package/dist/{chunk-LNCBN4BL.cjs → chunk-MLX6Z7TU.cjs} +2 -2
  26. package/dist/chunk-OH5LAH3X.cjs +1456 -0
  27. package/dist/{chunk-XXJL5GY3.cjs → chunk-OJZBZH56.cjs} +3 -3
  28. package/dist/{chunk-IXZNBDXT.cjs → chunk-OMHQZXCD.cjs} +28 -28
  29. package/dist/{chunk-KM2TVQCH.cjs → chunk-OWQVDWTK.cjs} +259 -247
  30. package/dist/{chunk-YFTQ2ALU.cjs → chunk-PQBGSVZE.cjs} +116 -82
  31. package/dist/{chunk-OJLZ7PGO.cjs → chunk-QEFDGI3Z.cjs} +37 -35
  32. package/dist/{chunk-6HY2NH7D.cjs → chunk-QIQYD75I.cjs} +2 -2
  33. package/dist/{chunk-RB7VLVMD.cjs → chunk-R6BKQKIF.cjs} +9 -7
  34. package/dist/{chunk-V3W56L2D.cjs → chunk-SIDDZZKL.cjs} +38 -38
  35. package/dist/chunk-SZHDXXMK.cjs +102 -0
  36. package/dist/{chunk-5P4TDV7V.cjs → chunk-TUAATMUE.cjs} +5 -93
  37. package/dist/{chunk-F65RSJVV.cjs → chunk-TVDQMG7I.cjs} +23 -21
  38. package/dist/{chunk-XN6LXMH5.cjs → chunk-UPAE4IV5.cjs} +595 -591
  39. package/dist/chunk-V4FXUIMH.cjs +92 -0
  40. package/dist/{chunk-2JRSYWFP.cjs → chunk-VXAKQRV7.cjs} +5 -5
  41. package/dist/{chunk-L55XLH5A.cjs → chunk-WR7KJML6.cjs} +33 -31
  42. package/dist/{chunk-5QP3K2CE.cjs → chunk-XEYL6AFZ.cjs} +9 -9
  43. package/dist/{chunk-MYHS4W2H.cjs → chunk-YG72MEHY.cjs} +213 -1647
  44. package/dist/{chunk-WAQPW4CB.cjs → chunk-YNECNYQF.cjs} +6 -6
  45. package/dist/{chunk-NWZSYG4S.cjs → chunk-YWQ3VXPL.cjs} +114 -112
  46. package/dist/{chunk-24OYQQZC.cjs → chunk-ZGWS3NJR.cjs} +22 -22
  47. package/dist/{cloud-tenants-QFE6QMR5.cjs → cloud-tenants-2ZLGCSGK.cjs} +27 -24
  48. package/dist/components/case-studies/index.cjs +45 -41
  49. package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
  50. package/dist/components/chat/chat-message-enhanced.js +8 -4
  51. package/dist/components/chat/chat-message-list.d.ts.map +1 -1
  52. package/dist/components/chat/chat-message-list.js +2 -0
  53. package/dist/components/chat/index.cjs +21 -17
  54. package/dist/components/chat/types/component.types.d.ts +9 -0
  55. package/dist/components/chat/types/component.types.d.ts.map +1 -1
  56. package/dist/components/contact/index.cjs +28 -25
  57. package/dist/components/docs/index.cjs +31 -28
  58. package/dist/components/embeds/index.cjs +28 -25
  59. package/dist/components/faq/index.cjs +29 -26
  60. package/dist/components/features/index.cjs +28 -24
  61. package/dist/components/features/video-hover-preview.d.ts.map +1 -1
  62. package/dist/components/features/video-hover-preview.js +2 -5
  63. package/dist/components/features/video.d.ts.map +1 -1
  64. package/dist/components/features/video.js +1 -44
  65. package/dist/components/help-center-pages/index.cjs +131 -127
  66. package/dist/components/index.cjs +94 -90
  67. package/dist/components/meeting-scheduler/index.cjs +95 -92
  68. package/dist/components/navigation/index.cjs +30 -27
  69. package/dist/components/navigation/nav-panel.d.ts.map +1 -1
  70. package/dist/components/navigation/nav-panel.js +47 -13
  71. package/dist/components/onboarding-guides/index.cjs +30 -27
  72. package/dist/components/product-demo/index.cjs +38 -35
  73. package/dist/components/related-content/index.cjs +15 -12
  74. package/dist/components/tickets/index.cjs +33 -30
  75. package/dist/components/ui/index.cjs +28 -24
  76. package/dist/{devices-SFJDLXSW.cjs → devices-UOBQFPV3.cjs} +28 -25
  77. package/dist/{embeddable-chat-XZUWAK4W.cjs → embeddable-chat-SFQWRUIV.cjs} +99 -95
  78. package/dist/hooks/index.cjs +12 -10
  79. package/dist/index.cjs +36 -30
  80. package/dist/{knowledge-SAK3ZGCO.cjs → knowledge-5K3LTHGB.cjs} +28 -25
  81. package/dist/{logs-CYBGMFA5.cjs → logs-WU3N6ESS.cjs} +35 -32
  82. package/dist/{policies-XXDOICWF.cjs → policies-2IYASCQO.cjs} +31 -28
  83. package/dist/{remote-session-TC3BZDBZ.cjs → remote-session-TGM2OTTV.cjs} +12 -10
  84. package/dist/{scripts-C5T2AQPA.cjs → scripts-IQBKOQEY.cjs} +34 -31
  85. package/dist/{software-update-XU5AI4TP.cjs → software-update-GJLDO5X5.cjs} +31 -28
  86. package/dist/{tickets-board-YT25IX3O.cjs → tickets-board-FB5AGLJD.cjs} +16 -14
  87. package/dist/{video-file-player-6ZFOZFER.cjs → video-file-player-SIJW5UWU.cjs} +3 -2
  88. package/package.json +1 -1
  89. package/src/components/chat/chat-message-enhanced.tsx +13 -4
  90. package/src/components/chat/chat-message-list.tsx +2 -0
  91. package/src/components/chat/types/component.types.ts +9 -0
  92. package/src/components/features/video-hover-preview.tsx +37 -46
  93. package/src/components/features/video.tsx +1 -61
  94. package/src/components/navigation/nav-panel.tsx +74 -14
@@ -15,26 +15,26 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
15
15
 
16
16
 
17
17
 
18
- var _chunkXN6LXMH5cjs = require('./chunk-XN6LXMH5.cjs');
19
- require('./chunk-LJT2KRE2.cjs');
20
- require('./chunk-RB7VLVMD.cjs');
18
+ var _chunkUPAE4IV5cjs = require('./chunk-UPAE4IV5.cjs');
19
+ require('./chunk-KLTUTZBO.cjs');
20
+ require('./chunk-R6BKQKIF.cjs');
21
21
 
22
22
 
23
- var _chunkV3W56L2Dcjs = require('./chunk-V3W56L2D.cjs');
23
+ var _chunkSIDDZZKLcjs = require('./chunk-SIDDZZKL.cjs');
24
24
  require('./chunk-HQQE74RO.cjs');
25
25
  require('./chunk-DEY6XXGO.cjs');
26
- require('./chunk-E64HPPRH.cjs');
27
- require('./chunk-2JRSYWFP.cjs');
26
+ require('./chunk-5PK22JP7.cjs');
27
+ require('./chunk-VXAKQRV7.cjs');
28
28
  require('./chunk-24I6RFVU.cjs');
29
29
  require('./chunk-A6P6DHEZ.cjs');
30
30
  require('./chunk-MZ4KBSH7.cjs');
31
- require('./chunk-LNCBN4BL.cjs');
31
+ require('./chunk-MLX6Z7TU.cjs');
32
32
  require('./chunk-C42WIUH6.cjs');
33
- require('./chunk-NWZSYG4S.cjs');
34
- require('./chunk-KM2TVQCH.cjs');
35
- require('./chunk-EHJE3UWZ.cjs');
33
+ require('./chunk-YWQ3VXPL.cjs');
34
+ require('./chunk-OWQVDWTK.cjs');
35
+ require('./chunk-LBGAHB6X.cjs');
36
36
  require('./chunk-KKAY6GPU.cjs');
37
- require('./chunk-5QP3K2CE.cjs');
37
+ require('./chunk-XEYL6AFZ.cjs');
38
38
  require('./chunk-LELS4XMX.cjs');
39
39
  require('./chunk-ZOZR3QI2.cjs');
40
40
  require('./chunk-OMV5S5PI.cjs');
@@ -1824,20 +1824,21 @@ require('./chunk-LMBYZITR.cjs');
1824
1824
  require('./chunk-TMVC7S2R.cjs');
1825
1825
  require('./chunk-IYHH5EIO.cjs');
1826
1826
  require('./chunk-XIBCMGBW.cjs');
1827
- require('./chunk-CZIMISAR.cjs');
1828
- require('./chunk-XXJL5GY3.cjs');
1829
- require('./chunk-57B5RUYD.cjs');
1827
+ require('./chunk-JB2SEF6Q.cjs');
1828
+ require('./chunk-OJZBZH56.cjs');
1829
+ require('./chunk-64KBI5MI.cjs');
1830
1830
  require('./chunk-JKX2C3I2.cjs');
1831
1831
  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-OJLZ7PGO.cjs');
1836
- require('./chunk-MYHS4W2H.cjs');
1837
- require('./chunk-R3JX4MXD.cjs');
1835
+ require('./chunk-QEFDGI3Z.cjs');
1836
+ require('./chunk-YG72MEHY.cjs');
1837
+ require('./chunk-OH5LAH3X.cjs');
1838
+ require('./chunk-3ZLPYEL5.cjs');
1838
1839
  require('./chunk-SETFUCZA.cjs');
1839
- require('./chunk-VFUMM6JC.cjs');
1840
- require('./chunk-HY6BCZH7.cjs');
1840
+ require('./chunk-BEMGJDXI.cjs');
1841
+ require('./chunk-BNUZKBNV.cjs');
1841
1842
  require('./chunk-S5C3OZCO.cjs');
1842
1843
  require('./chunk-32ASZMTV.cjs');
1843
1844
  require('./chunk-OOYBIS7D.cjs');
@@ -1847,11 +1848,13 @@ require('./chunk-ORO54HDF.cjs');
1847
1848
  require('./chunk-RUHKTWGB.cjs');
1848
1849
  require('./chunk-BLH2SFOO.cjs');
1849
1850
  require('./chunk-3LW5TD54.cjs');
1850
- require('./chunk-ASMNNSUQ.cjs');
1851
+ require('./chunk-7PNRXJX2.cjs');
1851
1852
  require('./chunk-NTPX5GXI.cjs');
1852
- require('./chunk-VFZFCRAL.cjs');
1853
- require('./chunk-5P4TDV7V.cjs');
1854
- require('./chunk-DGFDBPO7.cjs');
1853
+ require('./chunk-AQXKXZWB.cjs');
1854
+ require('./chunk-V4FXUIMH.cjs');
1855
+ require('./chunk-SZHDXXMK.cjs');
1856
+ require('./chunk-TUAATMUE.cjs');
1857
+ require('./chunk-5GJM7VRR.cjs');
1855
1858
  require('./chunk-E76ONBKF.cjs');
1856
1859
  require('./chunk-UJ7AXHRZ.cjs');
1857
1860
  require('./chunk-YXDHVHB2.cjs');
@@ -1918,14 +1921,14 @@ var noop = () => {
1918
1921
  var HIDDEN_WHEN_COMPACT = ["organization"];
1919
1922
  function StaticPackageField({ value }) {
1920
1923
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1921
- _chunkV3W56L2Dcjs.Autocomplete,
1924
+ _chunkSIDDZZKLcjs.Autocomplete,
1922
1925
  {
1923
- label: _chunkXN6LXMH5cjs.PACKAGE_SEARCH_LABEL,
1926
+ label: _chunkUPAE4IV5cjs.PACKAGE_SEARCH_LABEL,
1924
1927
  labelVariant: "large",
1925
1928
  options: value ? [{ value: value.id, label: value.name, description: _nullishCoalesce(value.description, () => ( void 0)) }] : [],
1926
1929
  value: _nullishCoalesce(_optionalChain([value, 'optionalAccess', _ => _.id]), () => ( null)),
1927
1930
  onChange: noop,
1928
- placeholder: _chunkXN6LXMH5cjs.PACKAGE_SEARCH_PLACEHOLDER
1931
+ placeholder: _chunkUPAE4IV5cjs.PACKAGE_SEARCH_PLACEHOLDER
1929
1932
  }
1930
1933
  );
1931
1934
  }
@@ -1939,7 +1942,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1939
1942
  [fixture.devices, fixture.selectedIds]
1940
1943
  );
1941
1944
  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
- _chunkXN6LXMH5cjs.SoftwareActionForm,
1945
+ _chunkUPAE4IV5cjs.SoftwareActionForm,
1943
1946
  {
1944
1947
  action: fixture.action,
1945
1948
  showHeader: false,
@@ -1951,7 +1954,7 @@ function SoftwareUpdateScreen({ compact = false }) {
1951
1954
  initialValues: fixture.initialValues,
1952
1955
  renderPackageSearch,
1953
1956
  renderDevicePicker: () => /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
1954
- _chunkXN6LXMH5cjs.DeviceSelector,
1957
+ _chunkUPAE4IV5cjs.DeviceSelector,
1955
1958
  {
1956
1959
  devices: selected,
1957
1960
  loading: false,
@@ -10,9 +10,9 @@ var _chunkDKOLQPE7cjs = require('./chunk-DKOLQPE7.cjs');
10
10
 
11
11
 
12
12
 
13
- var _chunkLJT2KRE2cjs = require('./chunk-LJT2KRE2.cjs');
14
- require('./chunk-2JRSYWFP.cjs');
15
- require('./chunk-EHJE3UWZ.cjs');
13
+ var _chunkKLTUTZBOcjs = require('./chunk-KLTUTZBO.cjs');
14
+ require('./chunk-VXAKQRV7.cjs');
15
+ require('./chunk-LBGAHB6X.cjs');
16
16
  require('./chunk-LELS4XMX.cjs');
17
17
  require('./chunk-ZOZR3QI2.cjs');
18
18
  require('./chunk-OMV5S5PI.cjs');
@@ -1802,11 +1802,11 @@ require('./chunk-LMBYZITR.cjs');
1802
1802
  require('./chunk-TMVC7S2R.cjs');
1803
1803
  require('./chunk-IYHH5EIO.cjs');
1804
1804
  require('./chunk-XIBCMGBW.cjs');
1805
- require('./chunk-57B5RUYD.cjs');
1805
+ require('./chunk-64KBI5MI.cjs');
1806
1806
  require('./chunk-WWUSFOJ7.cjs');
1807
1807
  require('./chunk-SKI6NKOE.cjs');
1808
- require('./chunk-R3JX4MXD.cjs');
1809
- require('./chunk-HY6BCZH7.cjs');
1808
+ require('./chunk-3ZLPYEL5.cjs');
1809
+ require('./chunk-BNUZKBNV.cjs');
1810
1810
  require('./chunk-S5C3OZCO.cjs');
1811
1811
  require('./chunk-32ASZMTV.cjs');
1812
1812
  require('./chunk-OOYBIS7D.cjs');
@@ -1814,9 +1814,11 @@ require('./chunk-4IYNDV3G.cjs');
1814
1814
  require('./chunk-6VOOPMP5.cjs');
1815
1815
  require('./chunk-ORO54HDF.cjs');
1816
1816
  require('./chunk-RUHKTWGB.cjs');
1817
- require('./chunk-ASMNNSUQ.cjs');
1818
- require('./chunk-5P4TDV7V.cjs');
1819
- require('./chunk-DGFDBPO7.cjs');
1817
+ require('./chunk-7PNRXJX2.cjs');
1818
+ require('./chunk-V4FXUIMH.cjs');
1819
+ require('./chunk-SZHDXXMK.cjs');
1820
+ require('./chunk-TUAATMUE.cjs');
1821
+ require('./chunk-5GJM7VRR.cjs');
1820
1822
  require('./chunk-E76ONBKF.cjs');
1821
1823
  require('./chunk-XIFEZ2JT.cjs');
1822
1824
  require('./chunk-Z74QE57T.cjs');
@@ -1838,7 +1840,7 @@ function buildTicketsBoardFixture(cast) {
1838
1840
  const dana = assignee(cast.person("dana"));
1839
1841
  const alex = assignee(cast.person("alex"));
1840
1842
  return [
1841
- _chunkLJT2KRE2cjs.columnFromTicketStatus.call(void 0, "ACTIVE", [
1843
+ _chunkKLTUTZBOcjs.columnFromTicketStatus.call(void 0, "ACTIVE", [
1842
1844
  ticket("tk-1051", "Printer offline at the front desk", "ACTIVE", {
1843
1845
  ticketNumber: "1051",
1844
1846
  agent: "fae",
@@ -1856,7 +1858,7 @@ function buildTicketsBoardFixture(cast) {
1856
1858
  tags: ["onboarding"]
1857
1859
  })
1858
1860
  ]),
1859
- _chunkLJT2KRE2cjs.columnFromTicketStatus.call(void 0, "TECH_REQUIRED", [
1861
+ _chunkKLTUTZBOcjs.columnFromTicketStatus.call(void 0, "TECH_REQUIRED", [
1860
1862
  ticket("tk-1049", "Acrobat Pro for Maya", "TECH_REQUIRED", {
1861
1863
  ticketNumber: "1049",
1862
1864
  agent: "fae",
@@ -1880,7 +1882,7 @@ function buildTicketsBoardFixture(cast) {
1880
1882
  escalatedByUser: true
1881
1883
  })
1882
1884
  ]),
1883
- _chunkLJT2KRE2cjs.columnFromTicketStatus.call(void 0, "ON_HOLD", [
1885
+ _chunkKLTUTZBOcjs.columnFromTicketStatus.call(void 0, "ON_HOLD", [
1884
1886
  ticket("tk-1046", "Replace the conference room display", "ON_HOLD", {
1885
1887
  ticketNumber: "1046",
1886
1888
  organizationName: _chunkDKOLQPE7cjs.DEMO_ORGANIZATIONS.acme.name,
@@ -1889,7 +1891,7 @@ function buildTicketsBoardFixture(cast) {
1889
1891
  activity: { kind: "waiting-external" }
1890
1892
  })
1891
1893
  ]),
1892
- _chunkLJT2KRE2cjs.columnFromTicketStatus.call(void 0,
1894
+ _chunkKLTUTZBOcjs.columnFromTicketStatus.call(void 0,
1893
1895
  "RESOLVED",
1894
1896
  [
1895
1897
  ticket("tk-1048", "Slow laptop", "RESOLVED", {
@@ -1925,7 +1927,7 @@ function TicketsBoardScreen({ compact = false }) {
1925
1927
  const cast = _chunkSTEJZPIOcjs.useProductDemoCast.call(void 0, );
1926
1928
  const board = _react.useMemo.call(void 0, () => buildTicketsBoardFixture(cast), [cast]);
1927
1929
  const columns = compact ? board.filter((column) => column.id !== "ON_HOLD") : board;
1928
- return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg p-[var(--spacing-system-m)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkLJT2KRE2cjs.Board, { columns, onChange: noop, initialCollapsed: compact ? void 0 : FOLDED }) });
1930
+ return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { className: "h-full bg-ods-bg p-[var(--spacing-system-m)]", children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _chunkKLTUTZBOcjs.Board, { columns, onChange: noop, initialCollapsed: compact ? void 0 : FOLDED }) });
1929
1931
  }
1930
1932
 
1931
1933
 
@@ -19,7 +19,8 @@ require('./chunk-4IYNDV3G.cjs');
19
19
  require('./chunk-NTPX5GXI.cjs');
20
20
 
21
21
 
22
- var _chunkDGFDBPO7cjs = require('./chunk-DGFDBPO7.cjs');
22
+ var _chunkSZHDXXMKcjs = require('./chunk-SZHDXXMK.cjs');
23
+ require('./chunk-5GJM7VRR.cjs');
23
24
  require('./chunk-UJ7AXHRZ.cjs');
24
25
 
25
26
 
@@ -415,7 +416,7 @@ function FilePlayer({
415
416
  const hover = useHoverPlayback(mediaRef, sound, { playOnHover, playWhenHovered, mutedIntent });
416
417
  const health = usePlaybackHealth(mediaRef, url, !chromeless);
417
418
  useIosNativeVideoFullscreen(mediaRef);
418
- const captions = _chunkDGFDBPO7cjs.useAuthedAssetSrc.call(void 0, captionsUrl, "text/vtt, */*");
419
+ const captions = _chunkSZHDXXMKcjs.useAuthedAssetSrc.call(void 0, captionsUrl, "text/vtt, */*");
419
420
  const player = /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
420
421
  _muxplayerreact2.default,
421
422
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flamingo-stack/openframe-frontend-core",
3
- "version": "0.0.776",
3
+ "version": "0.0.780",
4
4
  "description": "Shared design system and components for all Flamingo platforms",
5
5
  "type": "module",
6
6
  "sideEffects": [
@@ -103,6 +103,7 @@ const ChatMessageEnhanced = forwardRef<HTMLDivElement, ChatMessageEnhancedProps>
103
103
  appearance: appearanceProp,
104
104
  authorType: authorTypeProp,
105
105
  selfAuthorType,
106
+ nameEveryTurn = false,
106
107
  assistantIcon,
107
108
  contextItems,
108
109
  resolveContextIcon,
@@ -535,9 +536,15 @@ const ChatMessageEnhanced = forwardRef<HTMLDivElement, ChatMessageEnhancedProps>
535
536
  // system line and another person answering (a technician in the end
536
537
  // user's thread). Mingo sends the admin's own turns as `admin` too; those
537
538
  // are the user's words and draw as such. Every face carries its name for
538
- // assistive tech and on hover.
539
- const showName = isSystem || isOtherPerson || (authorType === 'admin' && !isUser);
539
+ // assistive tech and on hover. A thread of several parties names every
540
+ // turn (`nameEveryTurn`: a ticket, where an end user, the agent and any
541
+ // number of technicians write): the agent's turn as an incoming one, the
542
+ // viewer's own bubble with the name beside the face, on the bubble's side.
543
+ const showName =
544
+ isSystem || isOtherPerson || (authorType === 'admin' && !isUser) || (nameEveryTurn && role === 'assistant');
545
+ const showSelfName = nameEveryTurn && isUser && !isSystem;
540
546
  const displayName = name || (isHuman ? 'User' : assistantType === 'mingo' ? 'Mingo' : 'Fae');
547
+ const nameLabel = <span className="min-w-0 truncate text-ods-open-yellow text-h6">{displayName}</span>;
541
548
  const faceBox = 'h-5 w-5 flex-shrink-0';
542
549
  const face: ReactNode =
543
550
  !showAvatar || isSystem ? null : !isHuman && !avatar && assistantIcon ? (
@@ -603,10 +610,11 @@ const ChatMessageEnhanced = forwardRef<HTMLDivElement, ChatMessageEnhancedProps>
603
610
  vs ~9ms as grid (Chrome: ~2ms either way). Same gap and stretch,
604
611
  no margin collapsing — visually identical. */}
605
612
  <div className="grid min-w-0 grid-cols-1 gap-[var(--spacing-system-xxs)]">
606
- {(face || showName) && (
613
+ {(face || showName || showSelfName) && (
607
614
  <div className={cn('flex items-center gap-[var(--spacing-system-xs)]', isUser && 'justify-end')}>
615
+ {showSelfName && nameLabel}
608
616
  {face}
609
- {showName && <span className="min-w-0 truncate text-ods-open-yellow text-h6">{displayName}</span>}
617
+ {showName && nameLabel}
610
618
  {showName && timestamp && (
611
619
  <span className="ml-auto shrink-0 whitespace-nowrap text-ods-text-secondary text-h6">
612
620
  {formatMessageTimestamp(timestamp)}
@@ -765,6 +773,7 @@ const MemoizedChatMessageEnhanced = memo(ChatMessageEnhanced, (prevProps, nextPr
765
773
  prevProps.appearance === nextProps.appearance &&
766
774
  prevProps.authorType === nextProps.authorType &&
767
775
  prevProps.selfAuthorType === nextProps.selfAuthorType &&
776
+ prevProps.nameEveryTurn === nextProps.nameEveryTurn &&
768
777
  prevProps.assistantIcon === nextProps.assistantIcon &&
769
778
  prevProps.className === nextProps.className &&
770
779
  // Reference equality — the host re-uses the same array instance per
@@ -141,6 +141,7 @@ const ChatMessageList = forwardRef<HTMLDivElement, ChatMessageListProps>(
141
141
  assistantType,
142
142
  approvalVariant,
143
143
  selfAuthorType,
144
+ nameEveryTurn,
144
145
  appearance = CHAT_APPEARANCE.CLASSIC,
145
146
  assistantIcon,
146
147
  pendingApprovals,
@@ -1049,6 +1050,7 @@ const ChatMessageList = forwardRef<HTMLDivElement, ChatMessageListProps>(
1049
1050
  approvalVariant={approvalVariant}
1050
1051
  authorType={message.authorType}
1051
1052
  selfAuthorType={selfAuthorType}
1053
+ nameEveryTurn={nameEveryTurn}
1052
1054
  assistantIcon={message.role !== 'user' ? assistantIcon : undefined}
1053
1055
  contextItems={message.contextItems}
1054
1056
  resolveContextIcon={resolveContextIcon}
@@ -142,6 +142,9 @@ export interface ChatMessageEnhancedProps extends Omit<HTMLAttributes<HTMLDivEle
142
142
  * write (`ChatMessageList.selfAuthorType`). Omit and every `user` turn is
143
143
  * the viewer's own. */
144
144
  selfAuthorType?: AuthorType;
145
+ /** Write the speaker's name on the agent's turn and the viewer's own bubble
146
+ * too (`ChatMessageList.nameEveryTurn`). Default false. */
147
+ nameEveryTurn?: boolean;
145
148
  /** Viewer variant for approval blocks in this message's segments.
146
149
  * `'admin'` (default) = full command block; `'client'` = end-client
147
150
  * (Fae desktop app) title-only card. Forwarded to
@@ -305,6 +308,12 @@ export interface ChatMessageListProps extends HTMLAttributes<HTMLDivElement> {
305
308
  * is the viewer's (Mingo: the admin's own turns arrive as `admin`); the Fae
306
309
  * client passes `'user'`, so a technician (`admin`) answers from the left. */
307
310
  selfAuthorType?: AuthorType;
311
+ /** Write the speaker's name on every turn: the agent's and the viewer's own
312
+ * bubbles too, not only another person's. For a thread of several parties
313
+ * — a ticket, where the end user, the agent and any number of technicians
314
+ * (all `admin`) write — so who said what is information. Default false: a
315
+ * two-party thread (Mingo, the Fae client) is told apart by its faces. */
316
+ nameEveryTurn?: boolean;
308
317
  /** Visual generation of the whole thread, blocks included. Default
309
318
  * `classic`; the Fae client passes `v2`. See `ChatAppearance`. */
310
319
  appearance?: ChatAppearance;
@@ -125,13 +125,6 @@ export function VideoHoverPreviewSurface({
125
125
  }, [gateControlled]);
126
126
  // Continuation forces the media + player on regardless of hover/viewport gate.
127
127
  const showMedia = continuation || (gateControlled ? playerMounted : isNear);
128
- // The hover player (and its script, the Mux player and hls.js: the largest a page can load) mounts on the first
129
- // hover, never before: a card that is near the screen but never hovered shows its poster and costs nothing more.
130
- // A widget pinned to the screen is always "near", so mounting on proximity loaded that script on every page view
131
- // (CU-17tkuw5xp4q). Once mounted it stays, so the next hover plays at once.
132
- const [engaged, setEngaged] = useState(false);
133
- if ((active || continuation) && !engaged) setEngaged(true);
134
- const showPlayer = continuation || engaged;
135
128
 
136
129
  // Poster resolution — the shared entity-card cover fallback chain: the real
137
130
  // thumbnail, dropped on load error. Null → first-frame facade (unless the
@@ -166,45 +159,43 @@ export function VideoHoverPreviewSurface({
166
159
 
167
160
  {badge === 'play' && !active && !continuation && <VideoPlayBadge className="absolute inset-0 z-10 m-auto" />}
168
161
 
169
- {showPlayer ? (
170
- <div
171
- className="absolute inset-0"
172
- style={{ '--media-background-color': 'transparent' } as React.CSSProperties}
173
- >
174
- <Video
175
- // Remount between modes: `startTime` + autoplay are LOAD-TIME
176
- // props (playback-core binds them to one-shot durationchange /
177
- // loadstart handlers), so re-propping an already-loaded element
178
- // silently drops the seek. Only a Mux preview rewrite changed
179
- // `src` before, which is why HLS resumed and plain MP4 did not.
180
- key={continuation ? 'continuation' : 'preview'}
181
- kind="file"
182
- // Rendition-capped in BOTH modes: the cap was only skipped
183
- // because changing `src` used to be the sole trigger for the
184
- // seek; the explicit key handles that now, and a 320px mini
185
- // player should never pull the uncapped manifest.
186
- url={previewUrl}
187
- poster={posterUrl}
188
- {...(continuation
189
- ? {
190
- startTime,
191
- autoPlay: autoPlay && startMuted,
192
- startMuted,
193
- autoPlayUnmuted: autoPlay && !startMuted,
194
- }
195
- : { playWhenHovered: active })}
196
- chromeless
197
- layout="fill"
198
- fit={fit}
199
- preload={preload}
200
- mutedIntent={mutedIntent}
201
- hideMutedBadge={hideMutedBadge}
202
- onMutedFallbackChange={onMutedFallbackChange}
203
- onEnded={onEnded}
204
- playerHandleRef={previewHandleRef}
205
- />
206
- </div>
207
- ) : null}
162
+ <div
163
+ className="absolute inset-0"
164
+ style={{ '--media-background-color': 'transparent' } as React.CSSProperties}
165
+ >
166
+ <Video
167
+ // Remount between modes: `startTime` + autoplay are LOAD-TIME
168
+ // props (playback-core binds them to one-shot durationchange /
169
+ // loadstart handlers), so re-propping an already-loaded element
170
+ // silently drops the seek. Only a Mux preview rewrite changed
171
+ // `src` before, which is why HLS resumed and plain MP4 did not.
172
+ key={continuation ? 'continuation' : 'preview'}
173
+ kind="file"
174
+ // Rendition-capped in BOTH modes: the cap was only skipped
175
+ // because changing `src` used to be the sole trigger for the
176
+ // seek; the explicit key handles that now, and a 320px mini
177
+ // player should never pull the uncapped manifest.
178
+ url={previewUrl}
179
+ poster={posterUrl}
180
+ {...(continuation
181
+ ? {
182
+ startTime,
183
+ autoPlay: autoPlay && startMuted,
184
+ startMuted,
185
+ autoPlayUnmuted: autoPlay && !startMuted,
186
+ }
187
+ : { playWhenHovered: active })}
188
+ chromeless
189
+ layout="fill"
190
+ fit={fit}
191
+ preload={preload}
192
+ mutedIntent={mutedIntent}
193
+ hideMutedBadge={hideMutedBadge}
194
+ onMutedFallbackChange={onMutedFallbackChange}
195
+ onEnded={onEnded}
196
+ playerHandleRef={previewHandleRef}
197
+ />
198
+ </div>
208
199
  </>
209
200
  ) : (
210
201
  <div className="absolute inset-0 bg-ods-card" />
@@ -46,7 +46,6 @@ import { useNearViewport } from '../../hooks/use-near-viewport';
46
46
  import { cn } from '../../utils/cn';
47
47
  import { fetchPriorityProp } from '../../utils/fetch-priority';
48
48
  import { UnifiedSkeleton } from '../loading/unified-skeleton';
49
- import { Button } from '../ui/button/button';
50
49
  import { useLoadingScope } from '../ui/loading-scope';
51
50
  import { VideoPlayBadge } from './video-center-badge';
52
51
  import type { FilePlayerProps } from './video-file-player';
@@ -136,65 +135,7 @@ function FilePlayerFallback({
136
135
  return <PosterBox poster={poster} className={className} priority={priority} fill />;
137
136
  }
138
137
 
139
- /**
140
- * A video nobody has asked to play yet starts as its poster and a play button, the way a YouTube video does
141
- * (`YouTubeFacade`): the player and hls.js are the largest script a page can load, and on a page whose video waits for
142
- * a click (a session, an episode, a release) loading them up front cost every visitor a long main-thread task before
143
- * anyone pressed play (CU-17tkuw5xp4q). A pointer, focus or touch on the button starts the download, so the player is
144
- * usually there by the click, and the click plays it with sound. A video that plays by itself (autoplay, hover
145
- * playback, a resumed position, chrome-less) or whose host drives it through a handle mounts its player as before.
146
- */
147
- function waitsForPlay(props: FilePlayerProps): boolean {
148
- return (
149
- !props.autoPlay &&
150
- !props.autoPlayUnmuted &&
151
- !props.playOnHover &&
152
- props.playWhenHovered === undefined &&
153
- props.startTime === undefined &&
154
- !props.playerHandleRef &&
155
- !props.chromeless
156
- );
157
- }
158
-
159
- function FilePlayer({
160
- title,
161
- priority,
162
- ...props
163
- }: FilePlayerProps & { title?: string; priority?: boolean }): React.ReactElement {
164
- // Decided once: a video that started as a facade stays the player once pressed, whatever its props do later.
165
- const [facade] = useState(() => waitsForPlay(props));
166
- const [pressed, setPressed] = useState(false);
167
- if (facade && !pressed) {
168
- return (
169
- <div className={cn('relative', props.className)} style={{ width: '100%', height: '100%' }}>
170
- <FilePlayerFallback poster={props.poster} className="absolute inset-0" priority={priority} />
171
- <Button
172
- type="button"
173
- variant="glyph"
174
- size="wrap"
175
- aria-label={title ? `Play: ${title}` : 'Play video'}
176
- onPointerEnter={loadFilePlayer}
177
- onFocus={loadFilePlayer}
178
- onTouchStart={loadFilePlayer}
179
- onClick={() => {
180
- loadFilePlayer();
181
- setPressed(true);
182
- }}
183
- className="group absolute inset-0 rounded-none"
184
- >
185
- <VideoPlayBadge
186
- size="lg"
187
- className="transition-transform duration-200 group-hover:scale-110 group-hover:text-ods-accent"
188
- />
189
- </Button>
190
- </div>
191
- );
192
- }
193
- // Pressed: the click is the visitor's gesture, so the player starts with sound (muted if the browser refuses).
194
- return <LoadedFilePlayer {...props} priority={priority} {...(facade ? { autoPlayUnmuted: true } : {})} />;
195
- }
196
-
197
- function LoadedFilePlayer({ priority, ...props }: FilePlayerProps & { priority?: boolean }): React.ReactElement {
138
+ function FilePlayer({ priority, ...props }: FilePlayerProps & { priority?: boolean }): React.ReactElement {
198
139
  // The player's component when its module has arrived (a loaded module, drawn through `createElement`).
199
140
  const arrived = useSyncExternalStore(subscribeToFilePlayer, loadedFilePlayer, noFilePlayer);
200
141
  if (arrived) return createElement(arrived, props);
@@ -327,7 +268,6 @@ export function Video(props: VideoProps): React.ReactElement | null {
327
268
  <FilePlayer
328
269
  url={url}
329
270
  poster={props.poster}
330
- title={props.title}
331
271
  priority={props.priority}
332
272
  muted={props.muted}
333
273
  {...pickFilePlayback(props)}
@@ -1,13 +1,84 @@
1
1
  'use client';
2
2
 
3
3
  import type React from 'react';
4
- import { forwardRef, type HTMLAttributes } from 'react';
4
+ import { forwardRef, useEffect, useSyncExternalStore, type HTMLAttributes } from 'react';
5
5
  import type { NavGroup, NavMenu } from '../../types/navigation';
6
+ import { afterPageLoad } from '../../utils/after-page-load';
6
7
  import { cn } from '../../utils/cn';
7
- import { CaseStudyCard } from '../chat/entity-cards/case-study-card';
8
+ import type { CaseStudyCard as CaseStudyCardComponent } from '../chat/entity-cards/case-study-card';
8
9
  import { NavItemRow } from './nav-item-row';
9
10
  import { defaultRenderSiteNavLink, type SiteNavLinkRenderer } from './site-nav-link';
10
11
 
12
+ /**
13
+ * The featured cards' component (a case study card, with its video hover preview), fetched once the page has loaded,
14
+ * or at once when a menu opens first. The panel is on every page, closed, so a static import put the card and its video
15
+ * code in every page's first-load script, ahead of the page's largest paint (CU-17tkuw5xp4q). The server and the first
16
+ * draw show the closed panel without the cards; they are there before a visitor can open it.
17
+ */
18
+ type FeatureCardComponent = typeof CaseStudyCardComponent;
19
+ let featureCard: FeatureCardComponent | null = null;
20
+ let featureCardLoad: Promise<void> | null = null;
21
+ const featureCardListeners = new Set<() => void>();
22
+
23
+ function loadFeatureCard(): void {
24
+ if (featureCard || featureCardLoad) return;
25
+ featureCardLoad = import('../chat/entity-cards/case-study-card')
26
+ .then(module => {
27
+ featureCard = module.CaseStudyCard;
28
+ for (const listener of featureCardListeners) listener();
29
+ })
30
+ // A failed load is forgotten, so the next open asks again.
31
+ .catch(() => undefined)
32
+ .finally(() => {
33
+ featureCardLoad = null;
34
+ });
35
+ }
36
+
37
+ function subscribeToFeatureCard(listener: () => void): () => void {
38
+ featureCardListeners.add(listener);
39
+ const cancel = afterPageLoad(loadFeatureCard);
40
+ return () => {
41
+ featureCardListeners.delete(listener);
42
+ cancel();
43
+ };
44
+ }
45
+
46
+ const loadedFeatureCard = () => featureCard;
47
+ const noFeatureCard = () => null;
48
+
49
+ /** A menu's featured cards, drawn once their component has arrived. */
50
+ function FeatureCards({
51
+ features,
52
+ open,
53
+ onNavigate,
54
+ }: {
55
+ features: NonNullable<NavMenu['features']>;
56
+ open: boolean;
57
+ onNavigate?: () => void;
58
+ }) {
59
+ const Card = useSyncExternalStore(subscribeToFeatureCard, loadedFeatureCard, noFeatureCard);
60
+ useEffect(() => {
61
+ if (open) loadFeatureCard();
62
+ }, [open]);
63
+ if (!Card) return null;
64
+ return (
65
+ <>
66
+ {features.map(feature => (
67
+ <div key={feature.id} className="min-h-0 min-w-0 overflow-hidden">
68
+ <Card
69
+ size="menu"
70
+ study={feature.study}
71
+ href={feature.href}
72
+ mediaMounted={open}
73
+ onNavigate={onNavigate}
74
+ className="h-full"
75
+ />
76
+ </div>
77
+ ))}
78
+ </>
79
+ );
80
+ }
81
+
11
82
  /** A column with more links than this lays them out in two columns. */
12
83
  const TWO_COLUMN_OVER = 4;
13
84
 
@@ -143,18 +214,7 @@ export const NavPanel = forwardRef<HTMLDivElement, NavPanelProps>(function NavPa
143
214
  // One row of cards, as many as the bar's width holds: a card that
144
215
  // would wrap lands on a zero-height row, where its cell clips it.
145
216
  <div className="grid min-w-0 flex-[3] auto-rows-[0px] grid-cols-[repeat(auto-fit,minmax(240px,1fr))] grid-rows-[minmax(0,1fr)] gap-x-[var(--spacing-system-mf)]">
146
- {menu.features.map(feature => (
147
- <div key={feature.id} className="min-h-0 min-w-0 overflow-hidden">
148
- <CaseStudyCard
149
- size="menu"
150
- study={feature.study}
151
- href={feature.href}
152
- mediaMounted={open}
153
- onNavigate={onNavigate}
154
- className="h-full"
155
- />
156
- </div>
157
- ))}
217
+ <FeatureCards features={menu.features} open={open} onNavigate={onNavigate} />
158
218
  </div>
159
219
  )}
160
220
  {!!menu.sideLinks?.length && (