@se-studio/core-ui 1.38.12 → 1.38.13
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/CHANGELOG.md +6 -0
- package/dist/components/banner/BannerClient.d.ts.map +1 -1
- package/dist/components/banner/BannerClient.js +25 -9
- package/dist/components/banner/BannerClient.js.map +1 -1
- package/dist/components/banner/BannerManager.d.ts.map +1 -1
- package/dist/components/banner/BannerManager.js +9 -2
- package/dist/components/banner/BannerManager.js.map +1 -1
- package/dist/components/banner/bannerDismissBootScript.d.ts +17 -0
- package/dist/components/banner/bannerDismissBootScript.d.ts.map +1 -0
- package/dist/components/banner/bannerDismissBootScript.js +55 -0
- package/dist/components/banner/bannerDismissBootScript.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# @se-studio/core-ui
|
|
2
2
|
|
|
3
|
+
## 1.38.13
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 9c347b8: Hide a dismissed announcement bar before first paint. The server HTML still includes the bar. A blocking script sets a class from the existing dismissal storage, and the first client render matches that HTML so hydration does not remove a visible bar.
|
|
8
|
+
|
|
3
9
|
## 1.38.12
|
|
4
10
|
|
|
5
11
|
### Patch Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BannerClient.d.ts","sourceRoot":"","sources":["../../../src/components/banner/BannerClient.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"BannerClient.d.ts","sourceRoot":"","sources":["../../../src/components/banner/BannerClient.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AAc5F,UAAU,iBAAiB;IACzB,OAAO,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC3C,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC3D,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAWD,QAAA,MAAM,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC,iBAAiB,CAyE7C,CAAC;eAEa,YAAY"}
|
|
@@ -1,22 +1,35 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { useCallback, useLayoutEffect, useState } from 'react';
|
|
4
|
+
import { bannerDismissClassName, isSafeBannerId } from './bannerDismissBootScript';
|
|
4
5
|
import { selectViewportBannerSlot, withViewportSlotHideFlags, } from './bannerViewportVisibility';
|
|
5
|
-
import { readDismissedBannerStorage, readDismissedSessionBannerIds, writeBannerDismissal, } from './bannerVisibility';
|
|
6
|
-
function
|
|
7
|
-
return
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
import { isBannerDismissed, readDismissedBannerStorage, readDismissedSessionBannerIds, writeBannerDismissal, } from './bannerVisibility';
|
|
7
|
+
function sameSlot(left, right) {
|
|
8
|
+
return (left.mobileId === right.mobileId &&
|
|
9
|
+
left.laptopId === right.laptopId &&
|
|
10
|
+
left.ids.length === right.ids.length &&
|
|
11
|
+
left.ids.every((id, index) => id === right.ids[index]));
|
|
11
12
|
}
|
|
12
13
|
const BannerClient = ({ banners, BannerComponent, debug }) => {
|
|
13
14
|
// Mobile and laptop can each have a winner. Both stay mounted; CSS hides the other width.
|
|
14
|
-
|
|
15
|
+
// The first render ignores dismissal storage so it matches the server HTML. The blocking
|
|
16
|
+
// script has already hidden a dismissed bar. This effect removes it after that.
|
|
17
|
+
const [slot, setSlot] = useState(() => selectViewportBannerSlot(banners));
|
|
15
18
|
useLayoutEffect(() => {
|
|
16
19
|
if (debug) {
|
|
17
20
|
console.log('[BannerClient] Syncing visibility with dismissal storage:', banners);
|
|
18
21
|
}
|
|
19
|
-
|
|
22
|
+
const options = {
|
|
23
|
+
dismissedBanners: readDismissedBannerStorage(),
|
|
24
|
+
dismissedSessionBannerIds: readDismissedSessionBannerIds(banners),
|
|
25
|
+
};
|
|
26
|
+
for (const banner of banners) {
|
|
27
|
+
if (isSafeBannerId(banner.id) && isBannerDismissed(banner, options)) {
|
|
28
|
+
document.documentElement.classList.add(bannerDismissClassName(banner.id));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const next = selectViewportBannerSlot(banners, options);
|
|
32
|
+
setSlot((current) => (sameSlot(current, next) ? current : next));
|
|
20
33
|
}, [banners, debug]);
|
|
21
34
|
const handleClick = useCallback((banner) => {
|
|
22
35
|
if (debug)
|
|
@@ -26,6 +39,9 @@ const BannerClient = ({ banners, BannerComponent, debug }) => {
|
|
|
26
39
|
if (debug)
|
|
27
40
|
console.log(`[BannerClient] Dismissing banner ${banner.id}`);
|
|
28
41
|
writeBannerDismissal(banner);
|
|
42
|
+
if (isSafeBannerId(banner.id)) {
|
|
43
|
+
document.documentElement.classList.add(bannerDismissClassName(banner.id));
|
|
44
|
+
}
|
|
29
45
|
// Drop this id only. Keep the stored winners so the other banner stays hidden
|
|
30
46
|
// on the width it lost until the next load.
|
|
31
47
|
setSlot((current) => ({
|
|
@@ -42,7 +58,7 @@ const BannerClient = ({ banners, BannerComponent, debug }) => {
|
|
|
42
58
|
console.log('[BannerClient] No visible banner selected.');
|
|
43
59
|
return null;
|
|
44
60
|
}
|
|
45
|
-
return (_jsx(_Fragment, { children: visibleBanners.map((banner) => (_jsx(BannerComponent, { banner: banner, onDismiss: () => handleDismiss(banner), onClick: () => handleClick(banner) }, banner.id))) }));
|
|
61
|
+
return (_jsx(_Fragment, { children: visibleBanners.map((banner) => (_jsx("div", { "data-se-banner-id": banner.id, children: _jsx(BannerComponent, { banner: banner, onDismiss: () => handleDismiss(banner), onClick: () => handleClick(banner) }) }, banner.id))) }));
|
|
46
62
|
};
|
|
47
63
|
export default BannerClient;
|
|
48
64
|
//# sourceMappingURL=BannerClient.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BannerClient.js","sourceRoot":"","sources":["../../../src/components/banner/BannerClient.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE/D,OAAO,EACL,wBAAwB,EAExB,yBAAyB,GAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,0BAA0B,EAC1B,6BAA6B,EAC7B,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAQ5B,SAAS,
|
|
1
|
+
{"version":3,"file":"BannerClient.js","sourceRoot":"","sources":["../../../src/components/banner/BannerClient.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BannerManager.d.ts","sourceRoot":"","sources":["../../../src/components/banner/BannerManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAI/F,OAAO,EAAE,KAAK,oBAAoB,EAA2B,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"BannerManager.d.ts","sourceRoot":"","sources":["../../../src/components/banner/BannerManager.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAI/F,OAAO,EAAE,KAAK,oBAAoB,EAA2B,MAAM,yBAAyB,CAAC;AAI7F,UAAU,kBAAkB;IAC1B,OAAO,EAAE,UAAU,GAAG;QAAE,IAAI,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IACvD,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAChC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAC3D;;;;OAIG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,EAC/B,SAAS,GAAE,eAAuB,GACjC,OAAO,EAAE,CAEX;AAED,wBAAgB,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,eAAe,EACf,SAAiB,GAClB,EAAE,kBAAkB,sCAgDpB"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { resolveBannerPlacement } from '@se-studio/core-data-types';
|
|
3
3
|
import BannerClient from './BannerClient';
|
|
4
4
|
import { BannerTargetingEngine } from './BannerTargeting';
|
|
5
5
|
import { toBannerClientCandidate } from './bannerClientCandidate';
|
|
6
|
+
import { bannerDismissBootScript, bannerDismissCss } from './bannerDismissBootScript';
|
|
6
7
|
import { isBannerWithinSchedule, sortBannersByPriority } from './bannerVisibility';
|
|
7
8
|
/**
|
|
8
9
|
* Filter banners for a layout placement slot (default top).
|
|
@@ -34,6 +35,12 @@ export function BannerManager({ content, banners, BannerComponent, placement = '
|
|
|
34
35
|
if (activeBanners.length === 0)
|
|
35
36
|
return null;
|
|
36
37
|
const clientBanners = activeBanners.map(toBannerClientCandidate);
|
|
37
|
-
|
|
38
|
+
const dismissCss = bannerDismissCss(clientBanners);
|
|
39
|
+
const dismissScript = bannerDismissBootScript(clientBanners);
|
|
40
|
+
return (_jsxs(_Fragment, { children: [dismissCss ? (_jsx("style", {
|
|
41
|
+
// biome-ignore lint/security/noDangerouslySetInnerHtml: ids are restricted to [A-Za-z0-9_-]
|
|
42
|
+
dangerouslySetInnerHTML: { __html: dismissCss } })) : null, dismissScript ? (_jsx("script", {
|
|
43
|
+
// biome-ignore lint/security/noDangerouslySetInnerHtml: payload is JSON of safe banner ids
|
|
44
|
+
dangerouslySetInnerHTML: { __html: dismissScript } })) : null, _jsx(BannerClient, { banners: clientBanners, BannerComponent: BannerComponent, debug: debug })] }));
|
|
38
45
|
}
|
|
39
46
|
//# sourceMappingURL=BannerManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BannerManager.js","sourceRoot":"","sources":["../../../src/components/banner/BannerManager.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAA6B,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAcnF;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA+B,EAC/B,SAAS,GAAoB,KAAK;IAElC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,eAAe,EACf,SAAS,GAAG,KAAK,GACE;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,CAAC;IAElD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,wBAAwB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,4CAA4C,SAAS,GAAG,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7E,sBAAsB,CAAC,MAAM,CAAC,CAC/B,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CACT,6BAA6B,SAAS,KAAK,aAAa,CAAC,MAAM,yCAAyC,CACzG,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"BannerManager.js","sourceRoot":"","sources":["../../../src/components/banner/BannerManager.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAA6B,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAcnF;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CACtC,OAA+B,EAC/B,SAAS,GAAoB,KAAK;IAElC,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,OAAO,EACP,eAAe,EACf,SAAS,GAAG,KAAK,GACE;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,MAAM,CAAC;IAElD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;QAC5D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,wBAAwB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjE,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,IAAI,KAAK;YAAE,OAAO,CAAC,GAAG,CAAC,4CAA4C,SAAS,GAAG,CAAC,CAAC;QACjF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,eAAe,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzF,MAAM,aAAa,GAAG,qBAAqB,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7E,sBAAsB,CAAC,MAAM,CAAC,CAC/B,CAAC;IAEF,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,GAAG,CACT,6BAA6B,SAAS,KAAK,aAAa,CAAC,MAAM,yCAAyC,CACzG,CAAC;IACJ,CAAC;IAED,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;IACjE,MAAM,UAAU,GAAG,gBAAgB,CAAC,aAAa,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,uBAAuB,CAAC,aAAa,CAAC,CAAC;IAE7D,OAAO,CACL,8BACG,UAAU,CAAC,CAAC,CAAC,CACZ;gBACE,4FAA4F;gBAC5F,uBAAuB,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,GAC/C,CACH,CAAC,CAAC,CAAC,IAAI,EACP,aAAa,CAAC,CAAC,CAAC,CACf;gBACE,2FAA2F;gBAC3F,uBAAuB,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAClD,CACH,CAAC,CAAC,CAAC,IAAI,EACR,KAAC,YAAY,IAAC,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,KAAK,EAAE,KAAK,GAAI,IACvF,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IBannerClientCandidate } from './bannerClientCandidate';
|
|
2
|
+
import { type BannerDismissSelectionOptions } from './bannerVisibility';
|
|
3
|
+
export declare function isSafeBannerId(id: string): boolean;
|
|
4
|
+
export declare function bannerDismissClassName(id: string): string;
|
|
5
|
+
/**
|
|
6
|
+
* Ids the blocking script must hide. Same rule as `isBannerDismissed`,
|
|
7
|
+
* limited to ids that are safe to put in a class and a style rule.
|
|
8
|
+
*/
|
|
9
|
+
export declare function dismissedBannerIds(banners: readonly IBannerClientCandidate[], options?: BannerDismissSelectionOptions): string[];
|
|
10
|
+
/** One rule per safe id. The class is added only when that id is dismissed. */
|
|
11
|
+
export declare function bannerDismissCss(banners: readonly IBannerClientCandidate[]): string;
|
|
12
|
+
/**
|
|
13
|
+
* Parser-blocking script. Runs before the banner markup is painted.
|
|
14
|
+
* The branch order matches `isBannerDismissed`.
|
|
15
|
+
*/
|
|
16
|
+
export declare function bannerDismissBootScript(banners: readonly IBannerClientCandidate[]): string;
|
|
17
|
+
//# sourceMappingURL=bannerDismissBootScript.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bannerDismissBootScript.d.ts","sourceRoot":"","sources":["../../../src/components/banner/bannerDismissBootScript.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACtE,OAAO,EAAE,KAAK,6BAA6B,EAAqB,MAAM,oBAAoB,CAAC;AAK3F,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,sBAAsB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,SAAS,sBAAsB,EAAE,EAC1C,OAAO,GAAE,6BAAkC,GAC1C,MAAM,EAAE,CAWV;AAED,+EAA+E;AAC/E,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,CAQnF;AAQD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,SAAS,sBAAsB,EAAE,GAAG,MAAM,CAoB1F"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isBannerDismissed } from './bannerVisibility';
|
|
2
|
+
/** Contentful entry ids. Anything else is left to the React pass. */
|
|
3
|
+
const SAFE_BANNER_ID = /^[A-Za-z0-9_-]+$/;
|
|
4
|
+
export function isSafeBannerId(id) {
|
|
5
|
+
return SAFE_BANNER_ID.test(id);
|
|
6
|
+
}
|
|
7
|
+
export function bannerDismissClassName(id) {
|
|
8
|
+
return `se-banner-dismissed-${id}`;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Ids the blocking script must hide. Same rule as `isBannerDismissed`,
|
|
12
|
+
* limited to ids that are safe to put in a class and a style rule.
|
|
13
|
+
*/
|
|
14
|
+
export function dismissedBannerIds(banners, options = {}) {
|
|
15
|
+
const ids = [];
|
|
16
|
+
for (const banner of banners) {
|
|
17
|
+
if (!isSafeBannerId(banner.id) || !isBannerDismissed(banner, options)) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (!ids.includes(banner.id)) {
|
|
21
|
+
ids.push(banner.id);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return ids;
|
|
25
|
+
}
|
|
26
|
+
/** One rule per safe id. The class is added only when that id is dismissed. */
|
|
27
|
+
export function bannerDismissCss(banners) {
|
|
28
|
+
return banners
|
|
29
|
+
.filter((banner) => isSafeBannerId(banner.id))
|
|
30
|
+
.map((banner) => `html.${bannerDismissClassName(banner.id)} [data-se-banner-id="${banner.id}"]{display:none !important}`)
|
|
31
|
+
.join('');
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Parser-blocking script. Runs before the banner markup is painted.
|
|
35
|
+
* The branch order matches `isBannerDismissed`.
|
|
36
|
+
*/
|
|
37
|
+
export function bannerDismissBootScript(banners) {
|
|
38
|
+
const payload = [];
|
|
39
|
+
for (const banner of banners) {
|
|
40
|
+
if (!isSafeBannerId(banner.id)) {
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
payload.push({
|
|
44
|
+
id: banner.id,
|
|
45
|
+
dismissType: banner.dismissType ?? null,
|
|
46
|
+
dismissDurationHours: banner.dismissDurationHours ?? null,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
if (payload.length === 0) {
|
|
50
|
+
return '';
|
|
51
|
+
}
|
|
52
|
+
const json = JSON.stringify(payload).replace(/</g, '\\u003c');
|
|
53
|
+
return `(function(){try{var banners=${json};var stored=JSON.parse(localStorage.getItem("dismissedBanners")||"{}");var now=Date.now();for(var i=0;i<banners.length;i++){var b=banners[i];var d=stored[b.id];if(!d)continue;if(b.dismissType==="Timed"&&d.timestamp){var hours=(now-new Date(d.timestamp).getTime())/36e5;if(hours>=(b.dismissDurationHours||24))continue;}if(b.dismissType==="Session"&&!sessionStorage.getItem("banner_session_"+b.id))continue;document.documentElement.classList.add("se-banner-dismissed-"+b.id);}}catch(e){}})();`;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=bannerDismissBootScript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bannerDismissBootScript.js","sourceRoot":"","sources":["../../../src/components/banner/bannerDismissBootScript.ts"],"names":[],"mappings":"AACA,OAAO,EAAsC,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE3F,qEAAqE;AACrE,MAAM,cAAc,GAAG,kBAAkB,CAAC;AAE1C,MAAM,UAAU,cAAc,CAAC,EAAU;IACvC,OAAO,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,EAAU;IAC/C,OAAO,uBAAuB,EAAE,EAAE,CAAC;AACrC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAA0C,EAC1C,OAAO,GAAkC,EAAE;IAE3C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;YACtE,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC7B,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB,CAAC,OAA0C;IACzE,OAAO,OAAO;SACX,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;SAC7C,GAAG,CACF,CAAC,MAAM,EAAE,EAAE,CACT,QAAQ,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,wBAAwB,MAAM,CAAC,EAAE,6BAA6B,CAC1G;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAQD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAA0C;IAChF,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,IAAI;YACvC,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,IAAI,IAAI;SAC1D,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAE9D,OAAO,+BAA+B,IAAI,4eAA4e,CAAC;AACzhB,CAAC"}
|