@gradial/aci 0.1.40 → 0.1.41
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 +13 -9
- package/README.md +4 -4
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/react/VideoPlayer.d.ts +2 -2
- package/dist/react/index.d.ts +2 -2
- package/package.json +15 -25
- package/src/cli/validate-content.mjs +0 -0
- package/dist/consent-banner/index.d.ts +0 -33
- package/dist/consent-banner/index.js +0 -99
- package/src/astro/ConsentBanner.astro +0 -62
- package/src/consent-banner/styles.css +0 -110
package/CHANGELOG.md
CHANGED
|
@@ -1,16 +1,20 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
## 0.1.
|
|
3
|
+
## 0.1.41 - 2026-07-22
|
|
4
4
|
|
|
5
|
-
###
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- First published release to actually ship the layout-default preservation and
|
|
8
|
+
validation fix in the CLI binary. Earlier binaries (through 0.1.39) predated
|
|
9
|
+
the fix, and the 0.1.40 meta package pinned platform CLI packages that were
|
|
10
|
+
never published, leaving its `aci` command unresolvable. The publish process
|
|
11
|
+
now stamps one release version into the SDK, all six platform packages, and
|
|
12
|
+
the README in lockstep, and gates publishing on registry verification of
|
|
13
|
+
every platform package.
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
- `ConsentBanner.astro` wrapper component for Astro sites, importable from
|
|
11
|
-
`@gradial/aci/astro/ConsentBanner`.
|
|
12
|
-
- Base CSS styles for the consent banner in `@gradial/aci/consent-banner/styles.css`.
|
|
13
|
-
Sites override with their own CSS.
|
|
15
|
+
After upgrading, delete any `.aci/compiled` directory produced by an older
|
|
16
|
+
compiler and rerun `aci content compile`. Existing compiled output is derived
|
|
17
|
+
state and is not repaired in place.
|
|
14
18
|
|
|
15
19
|
## 0.1.34 - 2026-07-20
|
|
16
20
|
|
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agentic Content Infrastructure SDK
|
|
2
2
|
|
|
3
|
-
`@gradial/aci` `0.1.
|
|
3
|
+
`@gradial/aci` `0.1.41` is a pre-1.0 public-surface reset for the ACI
|
|
4
4
|
client SDK. Breaking changes from the old `0.1.x` accidental surface are
|
|
5
5
|
intentional: the root import is framework-neutral, framework runtime behavior is
|
|
6
6
|
behind explicit subpaths, and the first required customer path is React/Next.
|
|
@@ -8,7 +8,7 @@ behind explicit subpaths, and the first required customer path is React/Next.
|
|
|
8
8
|
## Install
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
npm install @gradial/aci@0.1.
|
|
11
|
+
npm install @gradial/aci@0.1.41 zod@^4
|
|
12
12
|
```
|
|
13
13
|
|
|
14
14
|
## Root Import
|
|
@@ -85,13 +85,13 @@ go through an app-owned HTTP endpoint backed server-side by a `ContentProvider`.
|
|
|
85
85
|
The first RC scaffold path is Next:
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
|
-
npx @gradial/aci@0.1.
|
|
88
|
+
npx @gradial/aci@0.1.41 init my-site --template next-starter
|
|
89
89
|
```
|
|
90
90
|
|
|
91
91
|
List available templates:
|
|
92
92
|
|
|
93
93
|
```bash
|
|
94
|
-
npx @gradial/aci@0.1.
|
|
94
|
+
npx @gradial/aci@0.1.41 init --list
|
|
95
95
|
```
|
|
96
96
|
|
|
97
97
|
## Personalization: The One-Tag Install
|
package/dist/index.d.ts
CHANGED
|
@@ -15,4 +15,3 @@ export { AssetSchema, isImage, isAsset, } from './types/media.js';
|
|
|
15
15
|
export * from './audience-data-models.js';
|
|
16
16
|
export * from './define-data-model.js';
|
|
17
17
|
export * from './types/index.js';
|
|
18
|
-
export { mountConsentBanner, hasConsentCookie, type ConsentBannerOptions, } from './consent-banner/index.js';
|
package/dist/index.js
CHANGED
|
@@ -9,7 +9,6 @@ export { AssetSchema, isImage, isAsset, } from './types/media.js';
|
|
|
9
9
|
export * from './audience-data-models.js';
|
|
10
10
|
export * from './define-data-model.js';
|
|
11
11
|
export * from './types/index.js';
|
|
12
|
-
export { mountConsentBanner, hasConsentCookie, } from './consent-banner/index.js';
|
|
13
12
|
// Note: content/ is NOT re-exported here because it imports node:path,
|
|
14
13
|
// making it incompatible with client-side bundlers. Import server-only
|
|
15
14
|
// content utilities from '@gradial/aci/content' explicitly.
|
|
@@ -16,10 +16,10 @@ export declare function VideoPlayer({ video, ...attrs }: VideoPlayerProps): impo
|
|
|
16
16
|
title: string;
|
|
17
17
|
rel?: string | undefined | undefined;
|
|
18
18
|
content?: string | undefined | undefined;
|
|
19
|
-
slot?: string | undefined | undefined;
|
|
20
|
-
style?: import("react").CSSProperties | undefined;
|
|
21
19
|
dir?: string | undefined | undefined;
|
|
22
20
|
hidden?: boolean | undefined | undefined;
|
|
21
|
+
slot?: string | undefined | undefined;
|
|
22
|
+
style?: import("react").CSSProperties | undefined;
|
|
23
23
|
children?: import("react").ReactNode;
|
|
24
24
|
className?: string | undefined | undefined;
|
|
25
25
|
crossOrigin?: "" | "anonymous" | "use-credentials" | undefined;
|
package/dist/react/index.d.ts
CHANGED
|
@@ -25,10 +25,10 @@ export declare function Image({ image, value, ...attrs }: ImageProps): import("r
|
|
|
25
25
|
rel?: string | undefined | undefined;
|
|
26
26
|
content?: string | undefined | undefined;
|
|
27
27
|
referrerPolicy?: import("react").HTMLAttributeReferrerPolicy | undefined;
|
|
28
|
-
slot?: string | undefined | undefined;
|
|
29
|
-
style?: import("react").CSSProperties | undefined;
|
|
30
28
|
dir?: string | undefined | undefined;
|
|
31
29
|
hidden?: boolean | undefined | undefined;
|
|
30
|
+
slot?: string | undefined | undefined;
|
|
31
|
+
style?: import("react").CSSProperties | undefined;
|
|
32
32
|
children?: ReactNode;
|
|
33
33
|
className?: string | undefined | undefined;
|
|
34
34
|
crossOrigin?: "" | "anonymous" | "use-credentials" | undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gradial/aci",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.41",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -9,8 +9,6 @@
|
|
|
9
9
|
"bin/aci.js",
|
|
10
10
|
"src/cli/*.mjs",
|
|
11
11
|
"src/types/*.ts",
|
|
12
|
-
"src/astro/*.astro",
|
|
13
|
-
"src/consent-banner/*.css",
|
|
14
12
|
"templates/common",
|
|
15
13
|
"templates/nextjs",
|
|
16
14
|
"templates/astro",
|
|
@@ -86,26 +84,11 @@
|
|
|
86
84
|
"import": "./dist/astro/index.js",
|
|
87
85
|
"default": "./dist/astro/index.js"
|
|
88
86
|
},
|
|
89
|
-
"./astro/ConsentBanner": {
|
|
90
|
-
"import": "./src/astro/ConsentBanner.astro"
|
|
91
|
-
},
|
|
92
|
-
"./consent-banner": {
|
|
93
|
-
"types": "./dist/consent-banner/index.d.ts",
|
|
94
|
-
"import": "./dist/consent-banner/index.js"
|
|
95
|
-
},
|
|
96
87
|
"./testing": {
|
|
97
88
|
"types": "./dist/testing/conformance/index.d.ts",
|
|
98
89
|
"import": "./dist/testing/conformance/index.js"
|
|
99
90
|
}
|
|
100
91
|
},
|
|
101
|
-
"scripts": {
|
|
102
|
-
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
|
|
103
|
-
"test": "node --import tsx --test \"src/**/*.test.ts\"",
|
|
104
|
-
"build:cli": "cd ../.. && ./scripts/build-cli.sh",
|
|
105
|
-
"generate-starters": "cd ../.. && tsx scripts/generate-starters.ts",
|
|
106
|
-
"compile-registry": "tsx src/cli/compile-registry.mjs",
|
|
107
|
-
"prepack": "npm run generate-starters && npm run build && node scripts/ensure-bin-modes.mjs"
|
|
108
|
-
},
|
|
109
92
|
"dependencies": {
|
|
110
93
|
"markdown-it": "^14.1.0",
|
|
111
94
|
"sanitize-html": "^2.13.1",
|
|
@@ -145,11 +128,18 @@
|
|
|
145
128
|
"zod": "^4.0.0"
|
|
146
129
|
},
|
|
147
130
|
"optionalDependencies": {
|
|
148
|
-
"@gradial/aci-cli-darwin-arm64": "0.1.
|
|
149
|
-
"@gradial/aci-cli-darwin-x64": "0.1.
|
|
150
|
-
"@gradial/aci-cli-linux-arm64": "0.1.
|
|
151
|
-
"@gradial/aci-cli-linux-x64": "0.1.
|
|
152
|
-
"@gradial/aci-cli-win32-arm64": "0.1.
|
|
153
|
-
"@gradial/aci-cli-win32-x64": "0.1.
|
|
131
|
+
"@gradial/aci-cli-darwin-arm64": "0.1.41",
|
|
132
|
+
"@gradial/aci-cli-darwin-x64": "0.1.41",
|
|
133
|
+
"@gradial/aci-cli-linux-arm64": "0.1.41",
|
|
134
|
+
"@gradial/aci-cli-linux-x64": "0.1.41",
|
|
135
|
+
"@gradial/aci-cli-win32-arm64": "0.1.41",
|
|
136
|
+
"@gradial/aci-cli-win32-x64": "0.1.41"
|
|
137
|
+
},
|
|
138
|
+
"scripts": {
|
|
139
|
+
"build": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\" && tsc -p tsconfig.json",
|
|
140
|
+
"test": "node --import tsx --test \"src/**/*.test.ts\"",
|
|
141
|
+
"build:cli": "cd ../.. && ./scripts/build-cli.sh",
|
|
142
|
+
"generate-starters": "cd ../.. && tsx scripts/generate-starters.ts",
|
|
143
|
+
"compile-registry": "tsx src/cli/compile-registry.mjs"
|
|
154
144
|
}
|
|
155
|
-
}
|
|
145
|
+
}
|
|
File without changes
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
export interface ConsentBannerOptions {
|
|
2
|
-
/** Heading text. Default: "Privacy" */
|
|
3
|
-
heading?: string;
|
|
4
|
-
/** Body text explaining what the user is consenting to. */
|
|
5
|
-
message?: string;
|
|
6
|
-
/** Label for the accept button. Default: "Accept" */
|
|
7
|
-
acceptLabel?: string;
|
|
8
|
-
/** Label for the reject button. Default: "Reject" */
|
|
9
|
-
rejectLabel?: string;
|
|
10
|
-
/** Label for a link to the privacy policy. Optional. */
|
|
11
|
-
privacyPolicyLabel?: string;
|
|
12
|
-
/** URL to the privacy policy. Optional. */
|
|
13
|
-
privacyPolicyHref?: string;
|
|
14
|
-
/** Source identifier written to the cookie envelope. Default: "banner" */
|
|
15
|
-
source?: string;
|
|
16
|
-
/** Callback fired after a consent decision is written. */
|
|
17
|
-
onDecision?: (granted: boolean) => void;
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* hasConsentCookie returns true when the aci_consent cookie exists (the user
|
|
21
|
-
* has already made a decision, regardless of whether they granted or denied).
|
|
22
|
-
*/
|
|
23
|
-
export declare function hasConsentCookie(doc: {
|
|
24
|
-
cookie: string;
|
|
25
|
-
}): boolean;
|
|
26
|
-
/**
|
|
27
|
-
* mountConsentBanner checks for an existing consent cookie. If none exists,
|
|
28
|
-
* it injects a banner into the document body and wires up accept/reject
|
|
29
|
-
* buttons. If a cookie already exists, it does nothing (idempotent).
|
|
30
|
-
*
|
|
31
|
-
* Returns a cleanup function that removes the banner and event listeners.
|
|
32
|
-
*/
|
|
33
|
-
export declare function mountConsentBanner(doc: Document, opts?: ConsentBannerOptions): () => void;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// First-party consent banner (design/04, preset="manual"): a self-contained
|
|
2
|
-
// client-side component for sites that don't have an external CMP (c15t,
|
|
3
|
-
// OneTrust, etc.). Checks for the aci_consent cookie, shows a banner if
|
|
4
|
-
// absent, and calls applyConsent() on user decision.
|
|
5
|
-
//
|
|
6
|
-
// The banner is framework-agnostic — it renders plain DOM and is driven by
|
|
7
|
-
// CSS classes so each site can style it. The Astro wrapper component
|
|
8
|
-
// (packages/sdk/src/astro/ConsentBanner.astro) imports and invokes this,
|
|
9
|
-
// then applies site-specific styles.
|
|
10
|
-
import { applyConsent, readConsentCookie, PERSONALIZATION_PURPOSE, } from "../collect/consent/envelope.js";
|
|
11
|
-
const DEFAULTS = {
|
|
12
|
-
heading: "Privacy",
|
|
13
|
-
message: "We use cookies to personalize content and improve your experience. You can accept or reject personalization.",
|
|
14
|
-
acceptLabel: "Accept",
|
|
15
|
-
rejectLabel: "Reject",
|
|
16
|
-
source: "banner",
|
|
17
|
-
};
|
|
18
|
-
const BANNER_ID = "aci-consent-banner";
|
|
19
|
-
const BANNER_ATTR = "data-aci-consent-banner";
|
|
20
|
-
const BANNER_HIDDEN = "aci-consent-banner--hidden";
|
|
21
|
-
/**
|
|
22
|
-
* hasConsentCookie returns true when the aci_consent cookie exists (the user
|
|
23
|
-
* has already made a decision, regardless of whether they granted or denied).
|
|
24
|
-
*/
|
|
25
|
-
export function hasConsentCookie(doc) {
|
|
26
|
-
return readConsentCookie(doc) !== undefined;
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* mountConsentBanner checks for an existing consent cookie. If none exists,
|
|
30
|
-
* it injects a banner into the document body and wires up accept/reject
|
|
31
|
-
* buttons. If a cookie already exists, it does nothing (idempotent).
|
|
32
|
-
*
|
|
33
|
-
* Returns a cleanup function that removes the banner and event listeners.
|
|
34
|
-
*/
|
|
35
|
-
export function mountConsentBanner(doc, opts = {}) {
|
|
36
|
-
if (hasConsentCookie(doc))
|
|
37
|
-
return () => { };
|
|
38
|
-
if (doc.getElementById(BANNER_ID))
|
|
39
|
-
return () => { };
|
|
40
|
-
const config = { ...DEFAULTS, ...opts };
|
|
41
|
-
const banner = createBannerElement(config, doc);
|
|
42
|
-
doc.body.appendChild(banner);
|
|
43
|
-
const cleanup = () => {
|
|
44
|
-
banner.remove();
|
|
45
|
-
};
|
|
46
|
-
const decide = (granted) => {
|
|
47
|
-
const purposes = granted ? [PERSONALIZATION_PURPOSE] : [];
|
|
48
|
-
applyConsent(purposes, config.source, { document: doc });
|
|
49
|
-
banner.classList.add(BANNER_HIDDEN);
|
|
50
|
-
setTimeout(cleanup, 300);
|
|
51
|
-
opts.onDecision?.(granted);
|
|
52
|
-
};
|
|
53
|
-
banner.querySelector("[data-aci-consent-accept]")?.addEventListener("click", () => decide(true));
|
|
54
|
-
banner.querySelector("[data-aci-consent-reject]")?.addEventListener("click", () => decide(false));
|
|
55
|
-
return cleanup;
|
|
56
|
-
}
|
|
57
|
-
function createBannerElement(config, doc) {
|
|
58
|
-
const banner = doc.createElement("div");
|
|
59
|
-
banner.id = BANNER_ID;
|
|
60
|
-
banner.setAttribute(BANNER_ATTR, "");
|
|
61
|
-
banner.className = BANNER_ID;
|
|
62
|
-
const content = doc.createElement("div");
|
|
63
|
-
content.className = `${BANNER_ID}__content`;
|
|
64
|
-
const text = doc.createElement("div");
|
|
65
|
-
text.className = `${BANNER_ID}__text`;
|
|
66
|
-
const heading = doc.createElement("p");
|
|
67
|
-
heading.className = `${BANNER_ID}__heading`;
|
|
68
|
-
heading.textContent = config.heading;
|
|
69
|
-
text.appendChild(heading);
|
|
70
|
-
const message = doc.createElement("p");
|
|
71
|
-
message.className = `${BANNER_ID}__message`;
|
|
72
|
-
message.textContent = config.message;
|
|
73
|
-
text.appendChild(message);
|
|
74
|
-
if (config.privacyPolicyHref && config.privacyPolicyLabel) {
|
|
75
|
-
const link = doc.createElement("a");
|
|
76
|
-
link.className = `${BANNER_ID}__privacy-link`;
|
|
77
|
-
link.href = config.privacyPolicyHref;
|
|
78
|
-
link.textContent = config.privacyPolicyLabel;
|
|
79
|
-
text.appendChild(link);
|
|
80
|
-
}
|
|
81
|
-
content.appendChild(text);
|
|
82
|
-
const actions = doc.createElement("div");
|
|
83
|
-
actions.className = `${BANNER_ID}__actions`;
|
|
84
|
-
const rejectBtn = doc.createElement("button");
|
|
85
|
-
rejectBtn.type = "button";
|
|
86
|
-
rejectBtn.className = `${BANNER_ID}__btn ${BANNER_ID}__btn--reject`;
|
|
87
|
-
rejectBtn.setAttribute("data-aci-consent-reject", "");
|
|
88
|
-
rejectBtn.textContent = config.rejectLabel;
|
|
89
|
-
actions.appendChild(rejectBtn);
|
|
90
|
-
const acceptBtn = doc.createElement("button");
|
|
91
|
-
acceptBtn.type = "button";
|
|
92
|
-
acceptBtn.className = `${BANNER_ID}__btn ${BANNER_ID}__btn--accept`;
|
|
93
|
-
acceptBtn.setAttribute("data-aci-consent-accept", "");
|
|
94
|
-
acceptBtn.textContent = config.acceptLabel;
|
|
95
|
-
actions.appendChild(acceptBtn);
|
|
96
|
-
content.appendChild(actions);
|
|
97
|
-
banner.appendChild(content);
|
|
98
|
-
return banner;
|
|
99
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
// ConsentBanner.astro — Astro wrapper around the SDK's first-party consent
|
|
3
|
-
// banner. Import this into your layout and pass site-specific text/styles.
|
|
4
|
-
//
|
|
5
|
-
// Usage:
|
|
6
|
-
// import ConsentBanner from '@gradial/aci/astro/ConsentBanner.astro';
|
|
7
|
-
// <ConsentBanner
|
|
8
|
-
// heading="Cookie Preferences"
|
|
9
|
-
// message="We use cookies to personalize your experience."
|
|
10
|
-
// acceptLabel="Accept all"
|
|
11
|
-
// rejectLabel="Reject"
|
|
12
|
-
// privacyPolicyHref="/privacy"
|
|
13
|
-
// privacyPolicyLabel="Privacy Policy"
|
|
14
|
-
// />
|
|
15
|
-
|
|
16
|
-
export interface Props {
|
|
17
|
-
heading?: string;
|
|
18
|
-
message?: string;
|
|
19
|
-
acceptLabel?: string;
|
|
20
|
-
rejectLabel?: string;
|
|
21
|
-
privacyPolicyLabel?: string;
|
|
22
|
-
privacyPolicyHref?: string;
|
|
23
|
-
source?: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const {
|
|
27
|
-
heading,
|
|
28
|
-
message,
|
|
29
|
-
acceptLabel,
|
|
30
|
-
rejectLabel,
|
|
31
|
-
privacyPolicyLabel,
|
|
32
|
-
privacyPolicyHref,
|
|
33
|
-
source,
|
|
34
|
-
} = Astro.props as Props;
|
|
35
|
-
|
|
36
|
-
const opts = JSON.stringify({
|
|
37
|
-
heading,
|
|
38
|
-
message,
|
|
39
|
-
acceptLabel,
|
|
40
|
-
rejectLabel,
|
|
41
|
-
privacyPolicyLabel,
|
|
42
|
-
privacyPolicyHref,
|
|
43
|
-
source,
|
|
44
|
-
});
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
<div
|
|
48
|
-
id="aci-consent-banner-mount"
|
|
49
|
-
data-aci-consent-banner-mount
|
|
50
|
-
data-opts={opts}
|
|
51
|
-
>
|
|
52
|
-
</div>
|
|
53
|
-
|
|
54
|
-
<script>
|
|
55
|
-
import { mountConsentBanner } from '../consent-banner/index.js';
|
|
56
|
-
|
|
57
|
-
const mount = document.getElementById('aci-consent-banner-mount');
|
|
58
|
-
if (mount) {
|
|
59
|
-
const opts = JSON.parse(mount.getAttribute('data-opts') || '{}');
|
|
60
|
-
mountConsentBanner(document, opts);
|
|
61
|
-
}
|
|
62
|
-
</script>
|
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
/* Base consent banner styles — sites override with their own CSS. */
|
|
2
|
-
/* The banner is injected into document.body by mountConsentBanner(). */
|
|
3
|
-
|
|
4
|
-
#aci-consent-banner {
|
|
5
|
-
position: fixed;
|
|
6
|
-
bottom: 0;
|
|
7
|
-
left: 0;
|
|
8
|
-
right: 0;
|
|
9
|
-
z-index: 9999;
|
|
10
|
-
background: #1a1a2e;
|
|
11
|
-
color: #fff;
|
|
12
|
-
font-family: system-ui, -apple-system, sans-serif;
|
|
13
|
-
font-size: 14px;
|
|
14
|
-
line-height: 1.5;
|
|
15
|
-
transition: opacity 0.3s ease, transform 0.3s ease;
|
|
16
|
-
opacity: 1;
|
|
17
|
-
transform: translateY(0);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
#aci-consent-banner.aci-consent-banner--hidden {
|
|
21
|
-
opacity: 0;
|
|
22
|
-
transform: translateY(100%);
|
|
23
|
-
pointer-events: none;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
#aci-consent-banner .aci-consent-banner__content {
|
|
27
|
-
display: flex;
|
|
28
|
-
align-items: center;
|
|
29
|
-
justify-content: space-between;
|
|
30
|
-
gap: 16px;
|
|
31
|
-
max-width: 1200px;
|
|
32
|
-
margin: 0 auto;
|
|
33
|
-
padding: 16px 24px;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
#aci-consent-banner .aci-consent-banner__text {
|
|
37
|
-
flex: 1;
|
|
38
|
-
min-width: 0;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
#aci-consent-banner .aci-consent-banner__heading {
|
|
42
|
-
margin: 0 0 4px 0;
|
|
43
|
-
font-size: 16px;
|
|
44
|
-
font-weight: 600;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
#aci-consent-banner .aci-consent-banner__message {
|
|
48
|
-
margin: 0;
|
|
49
|
-
font-size: 13px;
|
|
50
|
-
opacity: 0.85;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
#aci-consent-banner .aci-consent-banner__privacy-link {
|
|
54
|
-
margin-left: 8px;
|
|
55
|
-
color: #8ecae6;
|
|
56
|
-
text-decoration: underline;
|
|
57
|
-
font-size: 13px;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
#aci-consent-banner .aci-consent-banner__actions {
|
|
61
|
-
display: flex;
|
|
62
|
-
gap: 8px;
|
|
63
|
-
flex-shrink: 0;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
#aci-consent-banner .aci-consent-banner__btn {
|
|
67
|
-
padding: 8px 20px;
|
|
68
|
-
border: none;
|
|
69
|
-
border-radius: 6px;
|
|
70
|
-
font-size: 14px;
|
|
71
|
-
font-weight: 500;
|
|
72
|
-
cursor: pointer;
|
|
73
|
-
transition: background-color 0.15s ease;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
#aci-consent-banner .aci-consent-banner__btn--accept {
|
|
77
|
-
background: #2196f3;
|
|
78
|
-
color: #fff;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
#aci-consent-banner .aci-consent-banner__btn--accept:hover {
|
|
82
|
-
background: #1976d2;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
#aci-consent-banner .aci-consent-banner__btn--reject {
|
|
86
|
-
background: transparent;
|
|
87
|
-
color: #fff;
|
|
88
|
-
border: 1px solid rgba(255, 255, 255, 0.3);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
#aci-consent-banner .aci-consent-banner__btn--reject:hover {
|
|
92
|
-
background: rgba(255, 255, 255, 0.1);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
@media (max-width: 640px) {
|
|
96
|
-
#aci-consent-banner .aci-consent-banner__content {
|
|
97
|
-
flex-direction: column;
|
|
98
|
-
align-items: stretch;
|
|
99
|
-
gap: 12px;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
#aci-consent-banner .aci-consent-banner__actions {
|
|
103
|
-
flex-direction: column-reverse;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
#aci-consent-banner .aci-consent-banner__btn {
|
|
107
|
-
width: 100%;
|
|
108
|
-
text-align: center;
|
|
109
|
-
}
|
|
110
|
-
}
|