@flamingo-stack/openframe-frontend-core 0.0.773 → 0.0.774
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/build/export-map.json +1 -1
- package/dist/{chunk-7P2QXBWE.cjs → chunk-4JZC624S.cjs} +226 -206
- package/dist/{chunk-JJNOAYD4.cjs → chunk-5AOKXXHV.cjs} +4 -4
- package/dist/{chunk-MT5Z2LSV.cjs → chunk-5Z3XL2VU.cjs} +72 -72
- package/dist/{chunk-BPAYT72L.cjs → chunk-BTVO676B.cjs} +148 -131
- package/dist/{chunk-TZ4GKUO2.cjs → chunk-CZIMISAR.cjs} +5 -1
- package/dist/{chunk-YSKX42LW.cjs → chunk-E5E7IE7X.cjs} +12 -12
- package/dist/{chunk-XVFM6SJA.cjs → chunk-E64HPPRH.cjs} +31 -31
- package/dist/{chunk-CTRJNTYU.cjs → chunk-EQBJHJS7.cjs} +2 -2
- package/dist/{chunk-BMFU2CUL.cjs → chunk-HTSRAQVG.cjs} +4 -4
- package/dist/{chunk-NRFNZ35Z.cjs → chunk-IQQ3SLUK.cjs} +19 -19
- package/dist/{chunk-RNLRS4ID.cjs → chunk-KKAY6GPU.cjs} +2 -2
- package/dist/{chunk-ILZEXCJH.cjs → chunk-KWZ62LPZ.cjs} +124 -104
- package/dist/{chunk-KDMWXXLE.cjs → chunk-L5CKY5WA.cjs} +15 -15
- package/dist/{chunk-6LLF2QCS.cjs → chunk-LEVA5WO3.cjs} +39 -39
- package/dist/{chunk-CW3ML76U.cjs → chunk-NTPX5GXI.cjs} +4 -0
- package/dist/{chunk-VW2QQKQ6.cjs → chunk-NX7P2T2U.cjs} +15 -15
- package/dist/{chunk-7J4YWDT6.cjs → chunk-Q6B2DC65.cjs} +3 -3
- package/dist/{chunk-NPCFVTA2.cjs → chunk-Q7EXOVMT.cjs} +31 -31
- package/dist/{chunk-2A56MLLL.cjs → chunk-SWEPHSIP.cjs} +4 -4
- package/dist/{chunk-KSCEAIBS.cjs → chunk-TOPGBOCN.cjs} +2 -2
- package/dist/{chunk-I4ZVMNHO.cjs → chunk-TTQHSSHF.cjs} +6 -6
- package/dist/{chunk-FPCGKH5K.cjs → chunk-TUXPFF4P.cjs} +31 -29
- package/dist/{chunk-42YLIZFD.cjs → chunk-U332FL4C.cjs} +22 -22
- package/dist/{chunk-3FREBLAJ.cjs → chunk-UAKXZ2KD.cjs} +47 -45
- package/dist/{chunk-SE76YGR3.cjs → chunk-USMR73ND.cjs} +4 -4
- package/dist/{chunk-X5Z4HRH7.cjs → chunk-VISK6LKE.cjs} +2 -2
- package/dist/{chunk-HEEK42BL.cjs → chunk-VWUQVJ2D.cjs} +81 -81
- package/dist/{chunk-5V7BIUGA.cjs → chunk-Y3EBUFX4.cjs} +92 -21
- package/dist/{chunk-5HBGBLJT.cjs → chunk-ZHGOXDA3.cjs} +63 -59
- package/dist/{cloud-tenants-EE5ULFOK.cjs → cloud-tenants-7RNZ6GHM.cjs} +11 -11
- package/dist/components/case-studies/index.cjs +28 -28
- package/dist/components/chat/ask-prompts.d.ts.map +1 -1
- package/dist/components/chat/ask-prompts.js +28 -19
- package/dist/components/chat/entity-cards/entity-portrait-card.d.ts +3 -1
- package/dist/components/chat/entity-cards/entity-portrait-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/entity-portrait-card.js +2 -0
- package/dist/components/chat/entity-cards/program-card.d.ts +6 -1
- package/dist/components/chat/entity-cards/program-card.d.ts.map +1 -1
- package/dist/components/chat/entity-cards/program-card.js +19 -2
- package/dist/components/chat/index.cjs +10 -8
- package/dist/components/chat/index.d.ts +1 -1
- package/dist/components/chat/index.d.ts.map +1 -1
- package/dist/components/chat/index.js +10 -4
- package/dist/components/chat/utils/ask-ai-events.d.ts +10 -0
- package/dist/components/chat/utils/ask-ai-events.d.ts.map +1 -1
- package/dist/components/chat/utils/ask-ai-events.js +21 -1
- package/dist/components/contact/index.cjs +12 -12
- package/dist/components/docs/index.cjs +15 -15
- package/dist/components/embeds/index.cjs +12 -12
- package/dist/components/faq/index.cjs +13 -13
- package/dist/components/features/index.cjs +11 -11
- package/dist/components/features/video-hover-preview.d.ts.map +1 -1
- package/dist/components/features/video-hover-preview.js +5 -2
- package/dist/components/features/video-shared.d.ts +2 -1
- package/dist/components/features/video-shared.d.ts.map +1 -1
- package/dist/components/features/video.d.ts.map +1 -1
- package/dist/components/features/video.js +64 -13
- package/dist/components/help-center-pages/index.cjs +100 -100
- package/dist/components/index.cjs +63 -61
- package/dist/components/meeting-scheduler/index.cjs +46 -46
- package/dist/components/navigation/index.cjs +14 -14
- package/dist/components/navigation/mingo-ai-button.d.ts.map +1 -1
- package/dist/components/navigation/mingo-ai-button.js +2 -1
- package/dist/components/navigation/site-header.d.ts.map +1 -1
- package/dist/components/navigation/site-header.js +3 -1
- package/dist/components/onboarding-guides/index.cjs +14 -14
- package/dist/components/product-demo/index.cjs +20 -20
- package/dist/components/related-content/index.cjs +7 -6
- package/dist/components/related-content/index.d.ts +2 -1
- package/dist/components/related-content/index.d.ts.map +1 -1
- package/dist/components/related-content/index.js +2 -2
- package/dist/components/related-content/related-content-section.d.ts +8 -10
- package/dist/components/related-content/related-content-section.d.ts.map +1 -1
- package/dist/components/related-content/related-content-section.js +11 -7
- package/dist/components/tickets/index.cjs +17 -17
- package/dist/components/ui/index.cjs +13 -11
- package/dist/components/ui/photo-wall.d.ts +7 -0
- package/dist/components/ui/photo-wall.d.ts.map +1 -1
- package/dist/components/ui/photo-wall.js +16 -2
- package/dist/components/ui/tab-navigation.d.ts +8 -1
- package/dist/components/ui/tab-navigation.d.ts.map +1 -1
- package/dist/components/ui/tab-navigation.js +9 -3
- package/dist/{devices-EBGGHEGR.cjs → devices-NNDBC6IH.cjs} +12 -12
- package/dist/{embeddable-chat-HCT4QV35.cjs → embeddable-chat-DI7ZZTBP.cjs} +75 -75
- package/dist/hooks/index.cjs +4 -4
- package/dist/hooks/use-near-viewport.d.ts.map +1 -1
- package/dist/hooks/use-near-viewport.js +4 -0
- package/dist/index.cjs +23 -15
- package/dist/{knowledge-5ZSMKKTL.cjs → knowledge-DPUMWQED.cjs} +12 -12
- package/dist/{logs-GUV3BMGC.cjs → logs-EE25MWYM.cjs} +19 -19
- package/dist/{policies-HPMTDOAS.cjs → policies-H5LPZWEM.cjs} +15 -15
- package/dist/{scripts-QYYKCIUW.cjs → scripts-YGO4LOES.cjs} +16 -16
- package/dist/{software-update-NC2KZKEI.cjs → software-update-5BEB62ZH.cjs} +14 -14
- package/dist/utils/content-ref-groups.d.ts +8 -0
- package/dist/utils/content-ref-groups.d.ts.map +1 -1
- package/dist/utils/content-ref-groups.js +2 -0
- package/dist/utils/dismiss-cookie.d.ts +14 -0
- package/dist/utils/dismiss-cookie.d.ts.map +1 -1
- package/dist/utils/dismiss-cookie.js +4 -0
- package/dist/utils/index.cjs +10 -0
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/visitor-os.d.ts +9 -0
- package/dist/utils/visitor-os.d.ts.map +1 -1
- package/dist/utils/visitor-os.js +4 -0
- package/dist/{video-file-player-COXRF4M5.cjs → video-file-player-4TXA7BZF.cjs} +3 -3
- package/package.json +1 -1
- package/src/components/chat/ask-prompts.tsx +6 -1
- package/src/components/chat/entity-cards/entity-portrait-card.tsx +4 -0
- package/src/components/chat/entity-cards/program-card.tsx +24 -2
- package/src/components/chat/index.ts +16 -9
- package/src/components/chat/utils/ask-ai-events.ts +26 -0
- package/src/components/features/video-hover-preview.tsx +46 -37
- package/src/components/features/video-shared.tsx +2 -1
- package/src/components/features/video.tsx +102 -19
- package/src/components/navigation/mingo-ai-button.tsx +2 -1
- package/src/components/navigation/site-header.tsx +3 -1
- package/src/components/related-content/index.ts +2 -1
- package/src/components/related-content/related-content-section.tsx +26 -12
- package/src/components/ui/photo-wall.tsx +24 -2
- package/src/components/ui/tab-navigation.tsx +18 -3
- package/src/hooks/use-near-viewport.ts +6 -0
- package/src/utils/content-ref-groups.ts +9 -0
- package/src/utils/dismiss-cookie.ts +17 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/visitor-os.ts +12 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/index.js
CHANGED
|
@@ -219,6 +219,7 @@ import { buildListUrl, canonicalContentRefType } from "./list-url.js";
|
|
|
219
219
|
import { faqSectionSlug, faqItemAnchor, parseFaqHash } from "./faq-anchor.js";
|
|
220
220
|
import {
|
|
221
221
|
CONTENT_REF_GROUPS,
|
|
222
|
+
GROUP_PAGE_SIZE,
|
|
222
223
|
getContentRefLabel,
|
|
223
224
|
getContentRefLabelOrTitleCase,
|
|
224
225
|
orderContentRefTypes
|
|
@@ -284,6 +285,7 @@ export {
|
|
|
284
285
|
DOC_TABLE_TYPES,
|
|
285
286
|
EMBED_PROXY_OPTIONAL_HEADERS,
|
|
286
287
|
FullscreenSwitchController,
|
|
288
|
+
GROUP_PAGE_SIZE,
|
|
287
289
|
HEX_PATTERN,
|
|
288
290
|
HUB_HEADER_OFFSET_PX,
|
|
289
291
|
ICON_REGISTRY,
|
|
@@ -42,4 +42,13 @@ export declare function detectDesktopOs(userAgent: string | null | undefined, hi
|
|
|
42
42
|
export declare function usesCommandKey(os: VisitorOs | null): boolean;
|
|
43
43
|
/** A shortcut as its hint reads on the visitor's system: `⌘K` or `Ctrl K`. */
|
|
44
44
|
export declare function shortcutLabel(os: VisitorOs | null, key: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* The inline script that marks the document with the visitor's DESKTOP system before the first paint
|
|
47
|
+
* (`attribute` = `mac` | `windows` | `linux`, absent for a phone, a tablet or an unknown system), for a page the
|
|
48
|
+
* server renders the same for every visitor (and a CDN may cache): it draws every system's variant and the host's
|
|
49
|
+
* CSS shows the one the attribute names, so the right one is there from the first frame with no hydration
|
|
50
|
+
* mismatch. The same rule as `detectVisitorOs` (Client Hints platform, then the User-Agent, touch points telling an
|
|
51
|
+
* iPad from a Mac), held equal to it by the tests. Any throw leaves the attribute off: the host's no-system variant.
|
|
52
|
+
*/
|
|
53
|
+
export declare function desktopOsBeforePaintScript(attribute: string): string;
|
|
45
54
|
//# sourceMappingURL=visitor-os.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visitor-os.d.ts","sourceRoot":"","sources":["../../src/utils/visitor-os.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAExE,+CAA+C;AAC/C,eAAO,MAAM,YAAY,sCAAuC,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,GAAE,cAAmB,GAAG,SAAS,GAAG,IAAI,CAclH;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAElE;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAE9G;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAE5D;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvE"}
|
|
1
|
+
{"version":3,"file":"visitor-os.d.ts","sourceRoot":"","sources":["../../src/utils/visitor-os.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAExE,+CAA+C;AAC/C,eAAO,MAAM,YAAY,sCAAuC,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAaD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,GAAE,cAAmB,GAAG,SAAS,GAAG,IAAI,CAclH;AAED,uFAAuF;AACvF,wBAAgB,WAAW,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAElE;AAED,uFAAuF;AACvF,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,IAAI,CAE9G;AAED,wFAAwF;AACxF,wBAAgB,cAAc,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAE5D;AAED,8EAA8E;AAC9E,wBAAgB,aAAa,CAAC,EAAE,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvE;AAED;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEpE"}
|
package/dist/utils/visitor-os.js
CHANGED
|
@@ -33,8 +33,12 @@ function usesCommandKey(os) {
|
|
|
33
33
|
function shortcutLabel(os, key) {
|
|
34
34
|
return usesCommandKey(os) ? `\u2318${key}` : `Ctrl ${key}`;
|
|
35
35
|
}
|
|
36
|
+
function desktopOsBeforePaintScript(attribute) {
|
|
37
|
+
return `(function(){try{var n=window.navigator,h=n.userAgentData&&n.userAgentData.platform,p=String(h||'').replace(/"/g,'').trim().toLowerCase(),t=(n.maxTouchPoints||0)>1,o=null,m=${JSON.stringify(HINT_PLATFORMS)};if(m[p])o=m[p];else{var u=n.userAgent||'';if(/iPhone|iPad|iPod/i.test(u))o='ios';else if(/Android/i.test(u))o='android';else if(/Windows NT|Win64|Win32/i.test(u))o='windows';else if(/Macintosh|Mac OS X/i.test(u))o='mac';else if(/Linux|X11|CrOS/i.test(u))o='linux'}if(o==='mac'&&t)o='ios';if(o==='mac'||o==='windows'||o==='linux')document.documentElement.setAttribute(${JSON.stringify(attribute)},o)}catch(e){}})();`;
|
|
38
|
+
}
|
|
36
39
|
export {
|
|
37
40
|
DESKTOP_OSES,
|
|
41
|
+
desktopOsBeforePaintScript,
|
|
38
42
|
desktopOsOf,
|
|
39
43
|
detectDesktopOs,
|
|
40
44
|
detectVisitorOs,
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"use client";
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
var
|
|
5
|
+
var _chunkKKAY6GPUcjs = require('./chunk-KKAY6GPU.cjs');
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
var _chunkJKX2C3I2cjs = require('./chunk-JKX2C3I2.cjs');
|
|
@@ -16,7 +16,7 @@ var _chunkJKX2C3I2cjs = require('./chunk-JKX2C3I2.cjs');
|
|
|
16
16
|
var _chunkSETFUCZAcjs = require('./chunk-SETFUCZA.cjs');
|
|
17
17
|
require('./chunk-S5C3OZCO.cjs');
|
|
18
18
|
require('./chunk-4IYNDV3G.cjs');
|
|
19
|
-
require('./chunk-
|
|
19
|
+
require('./chunk-NTPX5GXI.cjs');
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
var _chunkDGFDBPO7cjs = require('./chunk-DGFDBPO7.cjs');
|
|
@@ -415,7 +415,7 @@ function FilePlayer({
|
|
|
415
415
|
src: url,
|
|
416
416
|
poster: poster || void 0,
|
|
417
417
|
streamType: "on-demand",
|
|
418
|
-
preload: _nullishCoalesce(preload, () => ( (
|
|
418
|
+
preload: _nullishCoalesce(preload, () => ( (_chunkKKAY6GPUcjs.saveDataEnabled.call(void 0, ) ? "none" : "metadata"))),
|
|
419
419
|
playsInline: true,
|
|
420
420
|
muted,
|
|
421
421
|
preferCmcd: "header",
|
package/package.json
CHANGED
|
@@ -6,6 +6,7 @@ import { AgentMark } from '../agent-mark';
|
|
|
6
6
|
import { MingoAiButton, openAskAi } from '../navigation/mingo-ai-button';
|
|
7
7
|
import { ScrollShadow } from '../ui/scroll-fade';
|
|
8
8
|
import { QuickActionChipButton, QuickActionChipSkeleton, type QuickActionIconSpec } from './quick-action-chip';
|
|
9
|
+
import { ASK_AI_TRIGGER_ATTRIBUTE } from './utils/ask-ai-events';
|
|
9
10
|
|
|
10
11
|
/** One question a page offers: the chip shows `label` as written, the chat is sent `prompt`. */
|
|
11
12
|
export interface AskPrompt {
|
|
@@ -104,7 +105,11 @@ function QuestionChips({
|
|
|
104
105
|
{Array.from({ length: count }, (_, slot) => {
|
|
105
106
|
const prompt = loading ? undefined : prompts[slot];
|
|
106
107
|
return (
|
|
107
|
-
<span
|
|
108
|
+
<span
|
|
109
|
+
key={prompt?.id ?? `slot-${slot}`}
|
|
110
|
+
className={slotClassName ?? CHIP_SLOT_CLASS}
|
|
111
|
+
{...(prompt ? { [ASK_AI_TRIGGER_ATTRIBUTE]: '' } : {})}
|
|
112
|
+
>
|
|
108
113
|
{loading ? (
|
|
109
114
|
<QuickActionChipSkeleton
|
|
110
115
|
variant="question"
|
|
@@ -85,6 +85,8 @@ export interface EntityPortraitCardProps {
|
|
|
85
85
|
/** Typography override for the title (entity identity), zone box unchanged. */
|
|
86
86
|
titleClassName?: string;
|
|
87
87
|
person?: EntityPortraitPerson | null;
|
|
88
|
+
/** The card's picture is likely the page's largest paint: fetch it at once and ranked high, not lazily. */
|
|
89
|
+
priority?: boolean;
|
|
88
90
|
className?: string;
|
|
89
91
|
}
|
|
90
92
|
|
|
@@ -99,6 +101,7 @@ export function EntityPortraitCard({
|
|
|
99
101
|
title,
|
|
100
102
|
titleClassName,
|
|
101
103
|
person,
|
|
104
|
+
priority,
|
|
102
105
|
className,
|
|
103
106
|
}: EntityPortraitCardProps) {
|
|
104
107
|
const loading = useLoadingScope();
|
|
@@ -140,6 +143,7 @@ export function EntityPortraitCard({
|
|
|
140
143
|
className={cn('h-full w-full', isWide === false ? 'object-contain' : 'object-cover')}
|
|
141
144
|
sizes="(min-width: 800px) 400px, 100vw"
|
|
142
145
|
fill
|
|
146
|
+
priority={priority}
|
|
143
147
|
unoptimized
|
|
144
148
|
onLoad={onMediaLoad}
|
|
145
149
|
onError={onMediaError}
|
|
@@ -259,6 +259,11 @@ export interface ProgramCardProps<T extends BaseProgramItem> {
|
|
|
259
259
|
eyebrow?: string;
|
|
260
260
|
/** `default` density: the item's tags, drawn under the description. */
|
|
261
261
|
tags?: string[];
|
|
262
|
+
/**
|
|
263
|
+
* The card is the first thing a list draws, so its cover is likely the page's largest paint: fetch it at once and
|
|
264
|
+
* ranked high, instead of lazily (the default for every other card).
|
|
265
|
+
*/
|
|
266
|
+
priority?: boolean;
|
|
262
267
|
className?: string;
|
|
263
268
|
}
|
|
264
269
|
|
|
@@ -355,6 +360,7 @@ function ProgramEditorialCard({
|
|
|
355
360
|
typeMeta,
|
|
356
361
|
profile,
|
|
357
362
|
playable,
|
|
363
|
+
priority,
|
|
358
364
|
className,
|
|
359
365
|
}: {
|
|
360
366
|
feature: boolean;
|
|
@@ -369,6 +375,7 @@ function ProgramEditorialCard({
|
|
|
369
375
|
typeMeta: string | null | undefined;
|
|
370
376
|
profile: ReturnType<typeof programItemToStripProfile>;
|
|
371
377
|
playable: boolean;
|
|
378
|
+
priority?: boolean;
|
|
372
379
|
className?: string;
|
|
373
380
|
}) {
|
|
374
381
|
// The cover is shown WHOLE on its own edge colour: the fill AdminContentCard
|
|
@@ -392,7 +399,9 @@ function ProgramEditorialCard({
|
|
|
392
399
|
return (
|
|
393
400
|
<ContentCardFrame as="a" href={href} target={target} rel={rel} className={cn(EDITORIAL_ROW_GRID, className)}>
|
|
394
401
|
<span className={cn(EDITORIAL_ROW_THUMB, 'bg-ods-bg')}>
|
|
395
|
-
{cover &&
|
|
402
|
+
{cover && (
|
|
403
|
+
<Image src={cover} alt="" fill sizes="120px" className="object-cover" priority={priority} unoptimized />
|
|
404
|
+
)}
|
|
396
405
|
{playable && cover && <CardHoverPlay size="md" />}
|
|
397
406
|
</span>
|
|
398
407
|
<span className={EDITORIAL_ROW_TEXT}>
|
|
@@ -417,6 +426,7 @@ function ProgramEditorialCard({
|
|
|
417
426
|
fill
|
|
418
427
|
sizes="(min-width: 1024px) 640px, 100vw"
|
|
419
428
|
className="object-contain"
|
|
429
|
+
priority={priority}
|
|
420
430
|
unoptimized
|
|
421
431
|
/>
|
|
422
432
|
)}
|
|
@@ -464,6 +474,7 @@ export function ProgramCard<T extends BaseProgramItem>({
|
|
|
464
474
|
wholeCardClickable = false,
|
|
465
475
|
eyebrow,
|
|
466
476
|
tags = [],
|
|
477
|
+
priority,
|
|
467
478
|
className,
|
|
468
479
|
}: ProgramCardProps<T>) {
|
|
469
480
|
const { target, rel } = useEntityCardLink({
|
|
@@ -529,6 +540,7 @@ export function ProgramCard<T extends BaseProgramItem>({
|
|
|
529
540
|
imageAlt={item.title}
|
|
530
541
|
title={item.title}
|
|
531
542
|
titleClassName="font-['Azeret_Mono'] font-semibold text-lg leading-6"
|
|
543
|
+
priority={priority}
|
|
532
544
|
person={
|
|
533
545
|
profile
|
|
534
546
|
? { name: profile.name, avatarUrl: profile.avatarUrl, subtitle: profile.subtitle || dateMeta }
|
|
@@ -554,6 +566,7 @@ export function ProgramCard<T extends BaseProgramItem>({
|
|
|
554
566
|
typeMeta={compactTypeMetaValue}
|
|
555
567
|
profile={programItemToStripProfile(item)}
|
|
556
568
|
playable={isPlayable}
|
|
569
|
+
priority={priority}
|
|
557
570
|
className={className}
|
|
558
571
|
/>
|
|
559
572
|
);
|
|
@@ -570,7 +583,15 @@ export function ProgramCard<T extends BaseProgramItem>({
|
|
|
570
583
|
<Link href={href} target={target} rel={rel} className={cn(COMPACT_CARD_OUTER, 'group', className)}>
|
|
571
584
|
<span className={COMPACT_CARD_IMAGE_SLOT}>
|
|
572
585
|
{compactCover ? (
|
|
573
|
-
<Image
|
|
586
|
+
<Image
|
|
587
|
+
src={compactCover}
|
|
588
|
+
alt={item.title}
|
|
589
|
+
fill
|
|
590
|
+
sizes="56px"
|
|
591
|
+
className="object-contain"
|
|
592
|
+
priority={priority}
|
|
593
|
+
unoptimized
|
|
594
|
+
/>
|
|
574
595
|
) : (
|
|
575
596
|
<span className="flex h-full w-full items-center justify-center text-ods-accent">
|
|
576
597
|
{config.type === 'podcast' ? (
|
|
@@ -659,6 +680,7 @@ export function ProgramCard<T extends BaseProgramItem>({
|
|
|
659
680
|
fill
|
|
660
681
|
sizes="(min-width: 1280px) 400px, (min-width: 768px) 320px, 100vw"
|
|
661
682
|
className="object-cover"
|
|
683
|
+
priority={priority}
|
|
662
684
|
unoptimized
|
|
663
685
|
/>
|
|
664
686
|
{isPlayable && <CardHoverPlay size="md" />}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
// Chat components exports
|
|
4
4
|
import { createElement, forwardRef, lazy, Suspense, useEffect, useState } from 'react';
|
|
5
|
-
import { afterPageLoad } from '../../utils/after-page-load';
|
|
6
5
|
import type { EmbeddableChatHandle, EmbeddableChatProps } from './embeddable-chat';
|
|
7
|
-
import { ASK_AI_OPEN_EVENTS, holdAskAiOpens } from './utils/ask-ai-events';
|
|
6
|
+
import { ASK_AI_OPEN_EVENTS, askAiOpenIsHeld, holdAskAiOpens, onAskAiIntent } from './utils/ask-ai-events';
|
|
8
7
|
export * from './approval-request-message';
|
|
9
8
|
export * from './approval-batch-message';
|
|
10
9
|
export * from './escalation-offer-message';
|
|
@@ -106,11 +105,12 @@ export * from './utils';
|
|
|
106
105
|
|
|
107
106
|
// EmbeddableChat — THE chat. Hosts mount it once at the root after providing a
|
|
108
107
|
// <ChatRuntimeContext.Provider>. Its module is loaded on its own (`lazy`), and
|
|
109
|
-
// only
|
|
110
|
-
//
|
|
111
|
-
//
|
|
112
|
-
//
|
|
113
|
-
//
|
|
108
|
+
// only when the visitor shows they want it: a pointer, a touch or the focus on
|
|
109
|
+
// an element that opens it (`onAskAiIntent`, `ASK_AI_TRIGGER_ATTRIBUTE`), or at
|
|
110
|
+
// once when something asks for it (an open event, `open` or `defaultOpen`). A
|
|
111
|
+
// chat that starts closed costs a page nothing: it used to load on every page
|
|
112
|
+
// once the browser was idle, about 650 KB of script most visitors never opened.
|
|
113
|
+
// An open sent before it has loaded is held and delivered (`ask-ai-events`).
|
|
114
114
|
export type { ChatPrefillDraft, EmbeddableChatHandle, EmbeddableChatProps } from './embeddable-chat';
|
|
115
115
|
const LoadedEmbeddableChat = lazy(() =>
|
|
116
116
|
import('./embeddable-chat').then(module => ({ default: module.EmbeddableChat })),
|
|
@@ -122,8 +122,10 @@ export const EmbeddableChat = forwardRef<EmbeddableChatHandle, EmbeddableChatPro
|
|
|
122
122
|
useEffect(() => {
|
|
123
123
|
if (load) return undefined;
|
|
124
124
|
const start = () => setLoadRequested(true);
|
|
125
|
+
// An open sent before this mounted (a deep link, an early click) is waiting: load now to deliver it.
|
|
126
|
+
if (askAiOpenIsHeld()) queueMicrotask(start);
|
|
125
127
|
for (const name of ASK_AI_OPEN_EVENTS) window.addEventListener(name, start);
|
|
126
|
-
const cancel =
|
|
128
|
+
const cancel = onAskAiIntent(start);
|
|
127
129
|
return () => {
|
|
128
130
|
cancel();
|
|
129
131
|
for (const name of ASK_AI_OPEN_EVENTS) window.removeEventListener(name, start);
|
|
@@ -134,5 +136,10 @@ export const EmbeddableChat = forwardRef<EmbeddableChatHandle, EmbeddableChatPro
|
|
|
134
136
|
});
|
|
135
137
|
EmbeddableChat.displayName = 'EmbeddableChat';
|
|
136
138
|
export { MINGO_V2_RAIL_WIDTH, MINGO_V2_SPLIT_WIDTH } from './chat-dimensions';
|
|
137
|
-
export {
|
|
139
|
+
export {
|
|
140
|
+
ASK_AI_OPEN_EVENT,
|
|
141
|
+
ASK_AI_OPEN_EVENTS,
|
|
142
|
+
ASK_AI_OPEN_WITH_REF_EVENT,
|
|
143
|
+
ASK_AI_TRIGGER_ATTRIBUTE,
|
|
144
|
+
} from './utils/ask-ai-events';
|
|
138
145
|
export * from './proxy-credentials-panel';
|
|
@@ -35,6 +35,11 @@ export function holdAskAiOpens(): void {
|
|
|
35
35
|
for (const name of ASK_AI_OPEN_EVENTS) window.addEventListener(name, holdOpen);
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/** An open came before any chat was listening, and waits to be delivered: the chat must load now. */
|
|
39
|
+
export function askAiOpenIsHeld(): boolean {
|
|
40
|
+
return heldOpen !== null;
|
|
41
|
+
}
|
|
42
|
+
|
|
38
43
|
/**
|
|
39
44
|
* A chat is listening now: stop holding, and send it the open that came before
|
|
40
45
|
* it was. Returns what to call when that chat stops listening.
|
|
@@ -49,3 +54,24 @@ export function chatListensForAskAiOpens(): () => void {
|
|
|
49
54
|
listening -= 1;
|
|
50
55
|
};
|
|
51
56
|
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The attribute every element that opens the chat carries (the Mingo button, an ask prompt). A pointer or focus
|
|
60
|
+
* reaching one is the visitor's intent to open it: the chat starts loading then, a moment before the click, instead
|
|
61
|
+
* of on every page view (`onAskAiIntent`).
|
|
62
|
+
*/
|
|
63
|
+
export const ASK_AI_TRIGGER_ATTRIBUTE = 'data-ask-ai-trigger';
|
|
64
|
+
|
|
65
|
+
/** Runs `run` once a pointer, a touch or the focus reaches an element carrying `ASK_AI_TRIGGER_ATTRIBUTE`. */
|
|
66
|
+
export function onAskAiIntent(run: () => void): () => void {
|
|
67
|
+
if (typeof document === 'undefined') return () => {};
|
|
68
|
+
const selector = `[${ASK_AI_TRIGGER_ATTRIBUTE}]`;
|
|
69
|
+
const onIntent = (event: Event) => {
|
|
70
|
+
if (event.target instanceof Element && event.target.closest(selector)) run();
|
|
71
|
+
};
|
|
72
|
+
const kinds = ['pointerover', 'focusin', 'touchstart'] as const;
|
|
73
|
+
for (const kind of kinds) document.addEventListener(kind, onIntent, { capture: true, passive: true });
|
|
74
|
+
return () => {
|
|
75
|
+
for (const kind of kinds) document.removeEventListener(kind, onIntent, { capture: true });
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -125,6 +125,13 @@ 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;
|
|
128
135
|
|
|
129
136
|
// Poster resolution — the shared entity-card cover fallback chain: the real
|
|
130
137
|
// thumbnail, dropped on load error. Null → first-frame facade (unless the
|
|
@@ -159,43 +166,45 @@ export function VideoHoverPreviewSurface({
|
|
|
159
166
|
|
|
160
167
|
{badge === 'play' && !active && !continuation && <VideoPlayBadge className="absolute inset-0 z-10 m-auto" />}
|
|
161
168
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
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}
|
|
199
208
|
</>
|
|
200
209
|
) : (
|
|
201
210
|
<div className="absolute inset-0 bg-ods-card" />
|
|
@@ -164,7 +164,7 @@ export interface VideoCommonProps {
|
|
|
164
164
|
priority?: boolean;
|
|
165
165
|
/** Tailwind classes applied to the underlying player root. */
|
|
166
166
|
className?: string;
|
|
167
|
-
/** Accessible label
|
|
167
|
+
/** Accessible label: the play button of either facade (YouTube, or a file video that waits for a click). */
|
|
168
168
|
title?: string;
|
|
169
169
|
/**
|
|
170
170
|
* Mount the player only once its box comes near the viewport (shared
|
|
@@ -172,6 +172,7 @@ export interface VideoCommonProps {
|
|
|
172
172
|
* Until then the box shows the poster (or nothing) — the caller's container
|
|
173
173
|
* still owns the size, so nothing shifts when the player mounts. For grids
|
|
174
174
|
* of players: a library of 20 clips costs 20 posters, not 20 players.
|
|
175
|
+
* Default `true` (every video is drawn on approach); `false` mounts it at once.
|
|
175
176
|
*/
|
|
176
177
|
lazy?: boolean;
|
|
177
178
|
/**
|
|
@@ -32,6 +32,7 @@
|
|
|
32
32
|
import type React from 'react';
|
|
33
33
|
import {
|
|
34
34
|
createElement,
|
|
35
|
+
forwardRef,
|
|
35
36
|
useCallback,
|
|
36
37
|
useEffect,
|
|
37
38
|
useMemo,
|
|
@@ -40,10 +41,12 @@ import {
|
|
|
40
41
|
useSyncExternalStore,
|
|
41
42
|
type ComponentType,
|
|
42
43
|
} from 'react';
|
|
44
|
+
import Image from '../../embed-shims/next-image';
|
|
43
45
|
import { useNearViewport } from '../../hooks/use-near-viewport';
|
|
44
46
|
import { cn } from '../../utils/cn';
|
|
45
47
|
import { fetchPriorityProp } from '../../utils/fetch-priority';
|
|
46
48
|
import { UnifiedSkeleton } from '../loading/unified-skeleton';
|
|
49
|
+
import { Button } from '../ui/button/button';
|
|
47
50
|
import { useLoadingScope } from '../ui/loading-scope';
|
|
48
51
|
import { VideoPlayBadge } from './video-center-badge';
|
|
49
52
|
import type { FilePlayerProps } from './video-file-player';
|
|
@@ -97,26 +100,105 @@ function subscribeToFilePlayer(listener: () => void): () => void {
|
|
|
97
100
|
const loadedFilePlayer = () => filePlayer;
|
|
98
101
|
const noFilePlayer = () => null;
|
|
99
102
|
|
|
100
|
-
/**
|
|
101
|
-
|
|
103
|
+
/**
|
|
104
|
+
* The video's box with its poster in it, until the player is drawn. The poster is a real image, not a CSS background:
|
|
105
|
+
* a background is found only after layout and is never ranked, so on a page whose video is the largest thing painted
|
|
106
|
+
* the poster arrived last (CU-17tkuw5xp4q). A `priority` video's poster is fetched at once and ranked high.
|
|
107
|
+
*/
|
|
108
|
+
const PosterBox = forwardRef<
|
|
109
|
+
HTMLDivElement,
|
|
110
|
+
{ poster?: string | null; className?: string; priority?: boolean; fill?: boolean }
|
|
111
|
+
>(function PosterBoxView({ poster, className, priority, fill }, ref) {
|
|
102
112
|
return (
|
|
103
113
|
<div
|
|
114
|
+
ref={ref}
|
|
104
115
|
aria-hidden="true"
|
|
105
|
-
className={className}
|
|
106
|
-
style={{
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
111
|
-
|
|
116
|
+
className={cn('relative overflow-hidden', className)}
|
|
117
|
+
style={fill ? { width: '100%', height: '100%' } : undefined}
|
|
118
|
+
>
|
|
119
|
+
{poster ? (
|
|
120
|
+
<Image src={poster} alt="" fill sizes="100vw" priority={priority} unoptimized className="object-cover" />
|
|
121
|
+
) : null}
|
|
122
|
+
</div>
|
|
112
123
|
);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
/** The player's box while its module loads: the poster at the player's own size, so nothing moves. */
|
|
127
|
+
function FilePlayerFallback({
|
|
128
|
+
poster,
|
|
129
|
+
className,
|
|
130
|
+
priority,
|
|
131
|
+
}: {
|
|
132
|
+
poster?: string | null;
|
|
133
|
+
className?: string;
|
|
134
|
+
priority?: boolean;
|
|
135
|
+
}) {
|
|
136
|
+
return <PosterBox poster={poster} className={className} priority={priority} fill />;
|
|
113
137
|
}
|
|
114
138
|
|
|
115
|
-
|
|
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 {
|
|
116
198
|
// The player's component when its module has arrived (a loaded module, drawn through `createElement`).
|
|
117
199
|
const arrived = useSyncExternalStore(subscribeToFilePlayer, loadedFilePlayer, noFilePlayer);
|
|
118
200
|
if (arrived) return createElement(arrived, props);
|
|
119
|
-
return <FilePlayerFallback poster={props.poster} className={props.className} />;
|
|
201
|
+
return <FilePlayerFallback poster={props.poster} className={props.className} priority={priority} />;
|
|
120
202
|
}
|
|
121
203
|
|
|
122
204
|
// =============================================================================
|
|
@@ -207,18 +289,17 @@ export function Video(props: VideoProps): React.ReactElement | null {
|
|
|
207
289
|
|
|
208
290
|
const effectiveKind = resolveKind(props, url);
|
|
209
291
|
|
|
210
|
-
|
|
292
|
+
// Drawn when it comes near the screen, like it plays when it is on it: the player and hls.js are the largest
|
|
293
|
+
// script a page can load, so a video below the fold costs its poster until it is approached. `lazy={false}`
|
|
294
|
+
// mounts the player at once (a caller that drives playback itself before it is seen).
|
|
295
|
+
if ((props.lazy ?? true) && !isNear) {
|
|
211
296
|
// Same box, poster only: the observer target IS the reserved space.
|
|
212
297
|
return wrapWithLayout(
|
|
213
|
-
<
|
|
298
|
+
<PosterBox
|
|
214
299
|
ref={nearRef}
|
|
300
|
+
poster={props.poster}
|
|
215
301
|
className={props.className}
|
|
216
|
-
|
|
217
|
-
props.poster
|
|
218
|
-
? { backgroundImage: `url(${props.poster})`, backgroundSize: 'cover', backgroundPosition: 'center' }
|
|
219
|
-
: undefined
|
|
220
|
-
}
|
|
221
|
-
aria-hidden="true"
|
|
302
|
+
priority={'priority' in props ? props.priority : undefined}
|
|
222
303
|
/>,
|
|
223
304
|
layout,
|
|
224
305
|
);
|
|
@@ -246,6 +327,8 @@ export function Video(props: VideoProps): React.ReactElement | null {
|
|
|
246
327
|
<FilePlayer
|
|
247
328
|
url={url}
|
|
248
329
|
poster={props.poster}
|
|
330
|
+
title={props.title}
|
|
331
|
+
priority={props.priority}
|
|
249
332
|
muted={props.muted}
|
|
250
333
|
{...pickFilePlayback(props)}
|
|
251
334
|
className={props.className}
|