@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.
- package/dist/{chunk-L5CKY5WA.cjs → chunk-24OYQQZC.cjs} +13 -13
- package/dist/{chunk-LEVA5WO3.cjs → chunk-2AZAJ7RK.cjs} +39 -39
- package/dist/{chunk-U332FL4C.cjs → chunk-2MF547RG.cjs} +22 -22
- package/dist/{chunk-HTSRAQVG.cjs → chunk-2YB4X5WT.cjs} +4 -4
- package/dist/{chunk-SWEPHSIP.cjs → chunk-3V27UHSH.cjs} +4 -4
- package/dist/{chunk-EQBJHJS7.cjs → chunk-6HY2NH7D.cjs} +2 -2
- package/dist/{chunk-5Z3XL2VU.cjs → chunk-AMVI5VXM.cjs} +68 -68
- package/dist/{chunk-E5E7IE7X.cjs → chunk-BDYI6HBT.cjs} +12 -12
- package/dist/{chunk-VISK6LKE.cjs → chunk-DDXQGTWB.cjs} +2 -2
- package/dist/{chunk-IQQ3SLUK.cjs → chunk-F65RSJVV.cjs} +17 -17
- package/dist/{chunk-NX7P2T2U.cjs → chunk-IXZNBDXT.cjs} +11 -11
- package/dist/{chunk-KWZ62LPZ.cjs → chunk-KM2TVQCH.cjs} +98 -98
- package/dist/{chunk-Q7EXOVMT.cjs → chunk-L55XLH5A.cjs} +29 -29
- package/dist/{chunk-TOPGBOCN.cjs → chunk-LNCBN4BL.cjs} +2 -2
- package/dist/{chunk-VWUQVJ2D.cjs → chunk-MWH5ZTMB.cjs} +77 -77
- package/dist/{chunk-Y3EBUFX4.cjs → chunk-MYHS4W2H.cjs} +1 -1
- package/dist/{chunk-BTVO676B.cjs → chunk-NWZSYG4S.cjs} +74 -74
- package/dist/{chunk-TUXPFF4P.cjs → chunk-OJLZ7PGO.cjs} +28 -28
- package/dist/{chunk-TTQHSSHF.cjs → chunk-OTZQP53Y.cjs} +3 -3
- package/dist/{chunk-ZHGOXDA3.cjs → chunk-UM6HFGTI.cjs} +64 -57
- package/dist/{chunk-USMR73ND.cjs → chunk-WAQPW4CB.cjs} +4 -4
- package/dist/{chunk-4JZC624S.cjs → chunk-XN6LXMH5.cjs} +174 -173
- package/dist/{chunk-Q6B2DC65.cjs → chunk-XT5WEHFM.cjs} +3 -3
- package/dist/{chunk-UAKXZ2KD.cjs → chunk-YFTQ2ALU.cjs} +37 -37
- package/dist/{chunk-5AOKXXHV.cjs → chunk-Z5KX56TK.cjs} +4 -4
- package/dist/{cloud-tenants-7RNZ6GHM.cjs → cloud-tenants-QFE6QMR5.cjs} +7 -7
- package/dist/components/authors/author-detail-view.d.ts.map +1 -1
- package/dist/components/authors/author-detail-view.js +12 -2
- package/dist/components/case-studies/index.cjs +23 -23
- package/dist/components/chat/index.cjs +5 -5
- package/dist/components/contact/index.cjs +8 -8
- package/dist/components/docs/index.cjs +11 -11
- package/dist/components/embeds/index.cjs +8 -8
- package/dist/components/faq/index.cjs +9 -9
- package/dist/components/features/index.cjs +7 -7
- package/dist/components/features/use-file-playback.d.ts +6 -4
- package/dist/components/features/use-file-playback.d.ts.map +1 -1
- package/dist/components/features/use-file-playback.js +16 -7
- package/dist/components/help-center-pages/index.cjs +83 -83
- package/dist/components/index.cjs +66 -56
- package/dist/components/meeting-scheduler/index.cjs +37 -37
- package/dist/components/navigation/index.cjs +10 -10
- package/dist/components/onboarding-guides/index.cjs +10 -10
- package/dist/components/product-demo/index.cjs +16 -16
- package/dist/components/related-content/card-registry.d.ts +5 -0
- package/dist/components/related-content/card-registry.d.ts.map +1 -1
- package/dist/components/related-content/card-registry.js +2 -0
- package/dist/components/related-content/index.cjs +5 -5
- package/dist/components/related-content/related-content-section.d.ts.map +1 -1
- package/dist/components/related-content/related-content-section.js +11 -6
- package/dist/components/tickets/index.cjs +13 -13
- package/dist/components/ui/index.cjs +7 -7
- package/dist/components/ui/photo-wall.d.ts +9 -1
- package/dist/components/ui/photo-wall.d.ts.map +1 -1
- package/dist/components/ui/photo-wall.js +8 -7
- package/dist/{devices-NNDBC6IH.cjs → devices-SFJDLXSW.cjs} +8 -8
- package/dist/{embeddable-chat-DI7ZZTBP.cjs → embeddable-chat-XZUWAK4W.cjs} +73 -73
- package/dist/index.cjs +11 -11
- package/dist/{knowledge-DPUMWQED.cjs → knowledge-SAK3ZGCO.cjs} +8 -8
- package/dist/{logs-EE25MWYM.cjs → logs-CYBGMFA5.cjs} +15 -15
- package/dist/{policies-H5LPZWEM.cjs → policies-XXDOICWF.cjs} +11 -11
- package/dist/{scripts-YGO4LOES.cjs → scripts-C5T2AQPA.cjs} +12 -12
- package/dist/{software-update-5BEB62ZH.cjs → software-update-XU5AI4TP.cjs} +10 -10
- package/dist/{video-file-player-4TXA7BZF.cjs → video-file-player-6ZFOZFER.cjs} +16 -7
- package/package.json +1 -1
- package/src/components/authors/author-detail-view.tsx +10 -2
- package/src/components/features/use-file-playback.ts +33 -14
- package/src/components/related-content/card-registry.tsx +7 -0
- package/src/components/related-content/related-content-section.tsx +12 -2
- 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
|
|
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-
|
|
22
|
+
require('./chunk-LNCBN4BL.cjs');
|
|
23
23
|
require('./chunk-C42WIUH6.cjs');
|
|
24
|
-
require('./chunk-
|
|
24
|
+
require('./chunk-NWZSYG4S.cjs');
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
var
|
|
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-
|
|
1829
|
-
require('./chunk-
|
|
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
|
-
|
|
1906
|
+
_chunkXN6LXMH5cjs.KnowledgeBaseArticleView,
|
|
1907
1907
|
{
|
|
1908
1908
|
...fixture.article,
|
|
1909
|
-
content: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
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
|
|
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-
|
|
30
|
+
require('./chunk-LNCBN4BL.cjs');
|
|
31
31
|
require('./chunk-C42WIUH6.cjs');
|
|
32
32
|
|
|
33
33
|
|
|
34
|
-
var
|
|
35
|
-
require('./chunk-
|
|
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-
|
|
1837
|
-
require('./chunk-
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
1988
|
-
|
|
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,
|
|
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:
|
|
2002
|
+
{ label: "Device", value: _chunkXN6LXMH5cjs.logSourceLabels.call(void 0, selected.device).deviceName }
|
|
2003
2003
|
],
|
|
2004
2004
|
deviceCard: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2005
|
-
|
|
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
|
|
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-
|
|
24
|
+
require('./chunk-LNCBN4BL.cjs');
|
|
25
25
|
require('./chunk-C42WIUH6.cjs');
|
|
26
|
-
require('./chunk-
|
|
27
|
-
require('./chunk-
|
|
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-
|
|
1829
|
-
require('./chunk-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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-
|
|
29
|
+
require('./chunk-LNCBN4BL.cjs');
|
|
30
30
|
require('./chunk-C42WIUH6.cjs');
|
|
31
|
-
require('./chunk-
|
|
32
|
-
require('./chunk-
|
|
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-
|
|
1836
|
-
require('./chunk-
|
|
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
|
-
{ ...
|
|
1997
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
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
|
|
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-
|
|
31
|
+
require('./chunk-LNCBN4BL.cjs');
|
|
32
32
|
require('./chunk-C42WIUH6.cjs');
|
|
33
|
-
require('./chunk-
|
|
34
|
-
require('./chunk-
|
|
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-
|
|
1836
|
-
require('./chunk-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
248
|
-
void playWithSound(element, hostMutedRef.current, wanted);
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
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
|
@@ -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
|
|
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
|
-
|
|
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
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
//
|
|
308
|
-
|
|
309
|
-
|
|
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>
|