@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.
- package/dist/case-study-card-WXMWYGSW.cjs +25 -0
- package/dist/{chunk-2MF547RG.cjs → chunk-2JO5HNEF.cjs} +28 -26
- package/dist/{chunk-DDXQGTWB.cjs → chunk-2W3VDE4D.cjs} +5 -5
- package/dist/{chunk-R3JX4MXD.cjs → chunk-3ZLPYEL5.cjs} +10 -10
- package/dist/{chunk-3V27UHSH.cjs → chunk-4BBOHZM3.cjs} +17 -17
- package/dist/{chunk-XT5WEHFM.cjs → chunk-4NRVV3KO.cjs} +3 -3
- package/dist/{chunk-DGFDBPO7.cjs → chunk-5GJM7VRR.cjs} +1 -94
- package/dist/{chunk-E64HPPRH.cjs → chunk-5PK22JP7.cjs} +50 -50
- package/dist/{chunk-57B5RUYD.cjs → chunk-64KBI5MI.cjs} +2 -2
- package/dist/{chunk-ASMNNSUQ.cjs → chunk-7PNRXJX2.cjs} +3 -3
- package/dist/{chunk-OTZQP53Y.cjs → chunk-AQXEM7GI.cjs} +8 -8
- package/dist/{chunk-VFZFCRAL.cjs → chunk-AQXKXZWB.cjs} +4 -4
- package/dist/{chunk-VFUMM6JC.cjs → chunk-BEMGJDXI.cjs} +2 -2
- package/dist/{chunk-HY6BCZH7.cjs → chunk-BNUZKBNV.cjs} +3 -3
- package/dist/{chunk-2YB4X5WT.cjs → chunk-DQALLDTZ.cjs} +6 -6
- package/dist/{chunk-MWH5ZTMB.cjs → chunk-F3BASIMT.cjs} +97 -95
- package/dist/{chunk-Z5KX56TK.cjs → chunk-HUPDPANN.cjs} +4 -4
- package/dist/{chunk-2AZAJ7RK.cjs → chunk-I4IC3BRC.cjs} +53 -53
- package/dist/{chunk-BDYI6HBT.cjs → chunk-IE3QCYBT.cjs} +18 -16
- package/dist/{chunk-UM6HFGTI.cjs → chunk-ILRQXZBA.cjs} +53 -51
- package/dist/{chunk-CZIMISAR.cjs → chunk-JB2SEF6Q.cjs} +7 -7
- package/dist/{chunk-AMVI5VXM.cjs → chunk-KA3VQ6X2.cjs} +91 -89
- package/dist/{chunk-LJT2KRE2.cjs → chunk-KLTUTZBO.cjs} +24 -24
- package/dist/{chunk-EHJE3UWZ.cjs → chunk-LBGAHB6X.cjs} +20 -20
- package/dist/{chunk-LNCBN4BL.cjs → chunk-MLX6Z7TU.cjs} +2 -2
- package/dist/chunk-OH5LAH3X.cjs +1456 -0
- package/dist/{chunk-XXJL5GY3.cjs → chunk-OJZBZH56.cjs} +3 -3
- package/dist/{chunk-IXZNBDXT.cjs → chunk-OMHQZXCD.cjs} +28 -28
- package/dist/{chunk-KM2TVQCH.cjs → chunk-OWQVDWTK.cjs} +259 -247
- package/dist/{chunk-YFTQ2ALU.cjs → chunk-PQBGSVZE.cjs} +116 -82
- package/dist/{chunk-OJLZ7PGO.cjs → chunk-QEFDGI3Z.cjs} +37 -35
- package/dist/{chunk-6HY2NH7D.cjs → chunk-QIQYD75I.cjs} +2 -2
- package/dist/{chunk-RB7VLVMD.cjs → chunk-R6BKQKIF.cjs} +9 -7
- package/dist/{chunk-V3W56L2D.cjs → chunk-SIDDZZKL.cjs} +38 -38
- package/dist/chunk-SZHDXXMK.cjs +102 -0
- package/dist/{chunk-5P4TDV7V.cjs → chunk-TUAATMUE.cjs} +5 -93
- package/dist/{chunk-F65RSJVV.cjs → chunk-TVDQMG7I.cjs} +23 -21
- package/dist/{chunk-XN6LXMH5.cjs → chunk-UPAE4IV5.cjs} +595 -591
- package/dist/chunk-V4FXUIMH.cjs +92 -0
- package/dist/{chunk-2JRSYWFP.cjs → chunk-VXAKQRV7.cjs} +5 -5
- package/dist/{chunk-L55XLH5A.cjs → chunk-WR7KJML6.cjs} +33 -31
- package/dist/{chunk-5QP3K2CE.cjs → chunk-XEYL6AFZ.cjs} +9 -9
- package/dist/{chunk-MYHS4W2H.cjs → chunk-YG72MEHY.cjs} +213 -1647
- package/dist/{chunk-WAQPW4CB.cjs → chunk-YNECNYQF.cjs} +6 -6
- package/dist/{chunk-NWZSYG4S.cjs → chunk-YWQ3VXPL.cjs} +114 -112
- package/dist/{chunk-24OYQQZC.cjs → chunk-ZGWS3NJR.cjs} +22 -22
- package/dist/{cloud-tenants-QFE6QMR5.cjs → cloud-tenants-2ZLGCSGK.cjs} +27 -24
- package/dist/components/case-studies/index.cjs +45 -41
- package/dist/components/chat/chat-message-enhanced.d.ts.map +1 -1
- package/dist/components/chat/chat-message-enhanced.js +8 -4
- package/dist/components/chat/chat-message-list.d.ts.map +1 -1
- package/dist/components/chat/chat-message-list.js +2 -0
- package/dist/components/chat/index.cjs +21 -17
- package/dist/components/chat/types/component.types.d.ts +9 -0
- package/dist/components/chat/types/component.types.d.ts.map +1 -1
- package/dist/components/contact/index.cjs +28 -25
- package/dist/components/docs/index.cjs +31 -28
- package/dist/components/embeds/index.cjs +28 -25
- package/dist/components/faq/index.cjs +29 -26
- package/dist/components/features/index.cjs +28 -24
- package/dist/components/features/video-hover-preview.d.ts.map +1 -1
- package/dist/components/features/video-hover-preview.js +2 -5
- package/dist/components/features/video.d.ts.map +1 -1
- package/dist/components/features/video.js +1 -44
- package/dist/components/help-center-pages/index.cjs +131 -127
- package/dist/components/index.cjs +94 -90
- package/dist/components/meeting-scheduler/index.cjs +95 -92
- package/dist/components/navigation/index.cjs +30 -27
- package/dist/components/navigation/nav-panel.d.ts.map +1 -1
- package/dist/components/navigation/nav-panel.js +47 -13
- package/dist/components/onboarding-guides/index.cjs +30 -27
- package/dist/components/product-demo/index.cjs +38 -35
- package/dist/components/related-content/index.cjs +15 -12
- package/dist/components/tickets/index.cjs +33 -30
- package/dist/components/ui/index.cjs +28 -24
- package/dist/{devices-SFJDLXSW.cjs → devices-UOBQFPV3.cjs} +28 -25
- package/dist/{embeddable-chat-XZUWAK4W.cjs → embeddable-chat-SFQWRUIV.cjs} +99 -95
- package/dist/hooks/index.cjs +12 -10
- package/dist/index.cjs +36 -30
- package/dist/{knowledge-SAK3ZGCO.cjs → knowledge-5K3LTHGB.cjs} +28 -25
- package/dist/{logs-CYBGMFA5.cjs → logs-WU3N6ESS.cjs} +35 -32
- package/dist/{policies-XXDOICWF.cjs → policies-2IYASCQO.cjs} +31 -28
- package/dist/{remote-session-TC3BZDBZ.cjs → remote-session-TGM2OTTV.cjs} +12 -10
- package/dist/{scripts-C5T2AQPA.cjs → scripts-IQBKOQEY.cjs} +34 -31
- package/dist/{software-update-XU5AI4TP.cjs → software-update-GJLDO5X5.cjs} +31 -28
- package/dist/{tickets-board-YT25IX3O.cjs → tickets-board-FB5AGLJD.cjs} +16 -14
- package/dist/{video-file-player-6ZFOZFER.cjs → video-file-player-SIJW5UWU.cjs} +3 -2
- package/package.json +1 -1
- package/src/components/chat/chat-message-enhanced.tsx +13 -4
- package/src/components/chat/chat-message-list.tsx +2 -0
- package/src/components/chat/types/component.types.ts +9 -0
- package/src/components/features/video-hover-preview.tsx +37 -46
- package/src/components/features/video.tsx +1 -61
- 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
|
|
19
|
-
require('./chunk-
|
|
20
|
-
require('./chunk-
|
|
18
|
+
var _chunkUPAE4IV5cjs = require('./chunk-UPAE4IV5.cjs');
|
|
19
|
+
require('./chunk-KLTUTZBO.cjs');
|
|
20
|
+
require('./chunk-R6BKQKIF.cjs');
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var
|
|
23
|
+
var _chunkSIDDZZKLcjs = require('./chunk-SIDDZZKL.cjs');
|
|
24
24
|
require('./chunk-HQQE74RO.cjs');
|
|
25
25
|
require('./chunk-DEY6XXGO.cjs');
|
|
26
|
-
require('./chunk-
|
|
27
|
-
require('./chunk-
|
|
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-
|
|
31
|
+
require('./chunk-MLX6Z7TU.cjs');
|
|
32
32
|
require('./chunk-C42WIUH6.cjs');
|
|
33
|
-
require('./chunk-
|
|
34
|
-
require('./chunk-
|
|
35
|
-
require('./chunk-
|
|
33
|
+
require('./chunk-YWQ3VXPL.cjs');
|
|
34
|
+
require('./chunk-OWQVDWTK.cjs');
|
|
35
|
+
require('./chunk-LBGAHB6X.cjs');
|
|
36
36
|
require('./chunk-KKAY6GPU.cjs');
|
|
37
|
-
require('./chunk-
|
|
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-
|
|
1828
|
-
require('./chunk-
|
|
1829
|
-
require('./chunk-
|
|
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-
|
|
1836
|
-
require('./chunk-
|
|
1837
|
-
require('./chunk-
|
|
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-
|
|
1840
|
-
require('./chunk-
|
|
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-
|
|
1851
|
+
require('./chunk-7PNRXJX2.cjs');
|
|
1851
1852
|
require('./chunk-NTPX5GXI.cjs');
|
|
1852
|
-
require('./chunk-
|
|
1853
|
-
require('./chunk-
|
|
1854
|
-
require('./chunk-
|
|
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
|
-
|
|
1924
|
+
_chunkSIDDZZKLcjs.Autocomplete,
|
|
1922
1925
|
{
|
|
1923
|
-
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
14
|
-
require('./chunk-
|
|
15
|
-
require('./chunk-
|
|
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-
|
|
1805
|
+
require('./chunk-64KBI5MI.cjs');
|
|
1806
1806
|
require('./chunk-WWUSFOJ7.cjs');
|
|
1807
1807
|
require('./chunk-SKI6NKOE.cjs');
|
|
1808
|
-
require('./chunk-
|
|
1809
|
-
require('./chunk-
|
|
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-
|
|
1818
|
-
require('./chunk-
|
|
1819
|
-
require('./chunk-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
|
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 =
|
|
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
|
@@ -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
|
-
|
|
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 &&
|
|
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
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
{
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
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
|
|
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 && (
|