@dani-builder/blocks 0.2.0
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/LICENSE +21 -0
- package/README.md +53 -0
- package/dist/blocks/bento-grid.d.ts +7 -0
- package/dist/blocks/bento-grid.d.ts.map +1 -0
- package/dist/blocks/bento-grid.js +20 -0
- package/dist/blocks/bento-grid.js.map +1 -0
- package/dist/blocks/block-renderer.d.ts +19 -0
- package/dist/blocks/block-renderer.d.ts.map +1 -0
- package/dist/blocks/block-renderer.js +71 -0
- package/dist/blocks/block-renderer.js.map +1 -0
- package/dist/blocks/content.d.ts +7 -0
- package/dist/blocks/content.d.ts.map +1 -0
- package/dist/blocks/content.js +18 -0
- package/dist/blocks/content.js.map +1 -0
- package/dist/blocks/cta.d.ts +7 -0
- package/dist/blocks/cta.d.ts.map +1 -0
- package/dist/blocks/cta.js +48 -0
- package/dist/blocks/cta.js.map +1 -0
- package/dist/blocks/faq.d.ts +7 -0
- package/dist/blocks/faq.d.ts.map +1 -0
- package/dist/blocks/faq.js +7 -0
- package/dist/blocks/faq.js.map +1 -0
- package/dist/blocks/features.d.ts +11 -0
- package/dist/blocks/features.d.ts.map +1 -0
- package/dist/blocks/features.js +41 -0
- package/dist/blocks/features.js.map +1 -0
- package/dist/blocks/hero.d.ts +7 -0
- package/dist/blocks/hero.d.ts.map +1 -0
- package/dist/blocks/hero.js +57 -0
- package/dist/blocks/hero.js.map +1 -0
- package/dist/blocks/highlights.d.ts +7 -0
- package/dist/blocks/highlights.d.ts.map +1 -0
- package/dist/blocks/highlights.js +29 -0
- package/dist/blocks/highlights.js.map +1 -0
- package/dist/blocks/inquiry-form.d.ts +7 -0
- package/dist/blocks/inquiry-form.d.ts.map +1 -0
- package/dist/blocks/inquiry-form.js +62 -0
- package/dist/blocks/inquiry-form.js.map +1 -0
- package/dist/blocks/logo-cloud.d.ts +7 -0
- package/dist/blocks/logo-cloud.d.ts.map +1 -0
- package/dist/blocks/logo-cloud.js +46 -0
- package/dist/blocks/logo-cloud.js.map +1 -0
- package/dist/blocks/pricing.d.ts +7 -0
- package/dist/blocks/pricing.d.ts.map +1 -0
- package/dist/blocks/pricing.js +40 -0
- package/dist/blocks/pricing.js.map +1 -0
- package/dist/blocks/slider.d.ts +7 -0
- package/dist/blocks/slider.d.ts.map +1 -0
- package/dist/blocks/slider.js +27 -0
- package/dist/blocks/slider.js.map +1 -0
- package/dist/blocks/stats.d.ts +7 -0
- package/dist/blocks/stats.d.ts.map +1 -0
- package/dist/blocks/stats.js +35 -0
- package/dist/blocks/stats.js.map +1 -0
- package/dist/blocks/team.d.ts +7 -0
- package/dist/blocks/team.d.ts.map +1 -0
- package/dist/blocks/team.js +36 -0
- package/dist/blocks/team.js.map +1 -0
- package/dist/blocks/testimonials.d.ts +7 -0
- package/dist/blocks/testimonials.d.ts.map +1 -0
- package/dist/blocks/testimonials.js +47 -0
- package/dist/blocks/testimonials.js.map +1 -0
- package/dist/context.d.ts +37 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +15 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +28 -0
- package/dist/index.js.map +1 -0
- package/dist/shared/block-image.d.ts +14 -0
- package/dist/shared/block-image.d.ts.map +1 -0
- package/dist/shared/block-image.js +38 -0
- package/dist/shared/block-image.js.map +1 -0
- package/dist/shared/blocks-renderer.d.ts +8 -0
- package/dist/shared/blocks-renderer.d.ts.map +1 -0
- package/dist/shared/blocks-renderer.js +76 -0
- package/dist/shared/blocks-renderer.js.map +1 -0
- package/dist/shared/count-up.d.ts +12 -0
- package/dist/shared/count-up.d.ts.map +1 -0
- package/dist/shared/count-up.js +74 -0
- package/dist/shared/count-up.js.map +1 -0
- package/dist/shared/icon-renderer.d.ts +10 -0
- package/dist/shared/icon-renderer.d.ts.map +1 -0
- package/dist/shared/icon-renderer.js +76 -0
- package/dist/shared/icon-renderer.js.map +1 -0
- package/dist/shared/reveal.d.ts +12 -0
- package/dist/shared/reveal.d.ts.map +1 -0
- package/dist/shared/reveal.js +34 -0
- package/dist/shared/reveal.js.map +1 -0
- package/dist/shared/section-wrapper.d.ts +21 -0
- package/dist/shared/section-wrapper.d.ts.map +1 -0
- package/dist/shared/section-wrapper.js +44 -0
- package/dist/shared/section-wrapper.js.map +1 -0
- package/dist/shared/strapi-image.d.ts +26 -0
- package/dist/shared/strapi-image.d.ts.map +1 -0
- package/dist/shared/strapi-image.js +22 -0
- package/dist/shared/strapi-image.js.map +1 -0
- package/dist/shared/strapi-link.d.ts +10 -0
- package/dist/shared/strapi-link.d.ts.map +1 -0
- package/dist/shared/strapi-link.js +21 -0
- package/dist/shared/strapi-link.js.map +1 -0
- package/package.json +66 -0
- package/src/styles/blocks.css +291 -0
package/package.json
ADDED
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dani-builder/blocks",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Framework-agnostic React block renderers for Daniworks Builder (Strapi v5)",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js"
|
|
11
|
+
},
|
|
12
|
+
"./styles.css": "./src/styles/blocks.css"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist",
|
|
16
|
+
"src/styles",
|
|
17
|
+
"LICENSE",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
},
|
|
23
|
+
"repository": {
|
|
24
|
+
"type": "git",
|
|
25
|
+
"url": "https://github.com/HJ-company/daniworks-builder-v2.git",
|
|
26
|
+
"directory": "packages/blocks"
|
|
27
|
+
},
|
|
28
|
+
"peerDependencies": {
|
|
29
|
+
"@dani-builder/strapi-client": ">=0.3.0 <1",
|
|
30
|
+
"react": "^18 || ^19",
|
|
31
|
+
"react-dom": "^18 || ^19"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@storybook/addon-a11y": "^10.5.7",
|
|
35
|
+
"@storybook/react-vite": "^10.5.7",
|
|
36
|
+
"@tailwindcss/postcss": "^4.3.3",
|
|
37
|
+
"@types/node": "^26.1.1",
|
|
38
|
+
"@types/react": "^19",
|
|
39
|
+
"@types/react-dom": "^19",
|
|
40
|
+
"@vitejs/plugin-react": "^6.0.5",
|
|
41
|
+
"react": "^19",
|
|
42
|
+
"react-dom": "^19",
|
|
43
|
+
"storybook": "^10.5.7",
|
|
44
|
+
"tailwindcss": "^4.3.3",
|
|
45
|
+
"typescript": "^6.0.3",
|
|
46
|
+
"vite": "^8.2.1",
|
|
47
|
+
"@dani-builder/strapi-client": "0.3.0",
|
|
48
|
+
"@repo/typescript-config": "0.0.0"
|
|
49
|
+
},
|
|
50
|
+
"keywords": [
|
|
51
|
+
"strapi",
|
|
52
|
+
"strapi-v5",
|
|
53
|
+
"daniworks-builder",
|
|
54
|
+
"react",
|
|
55
|
+
"blocks",
|
|
56
|
+
"cms-blocks"
|
|
57
|
+
],
|
|
58
|
+
"homepage": "https://github.com/HJ-company/daniworks-builder-v2/tree/main/packages/blocks#readme",
|
|
59
|
+
"author": "HJ-company",
|
|
60
|
+
"scripts": {
|
|
61
|
+
"build": "tsc",
|
|
62
|
+
"check-types": "tsc -p tsconfig.check.json",
|
|
63
|
+
"storybook": "storybook dev -p 6006 --no-open",
|
|
64
|
+
"build-storybook": "storybook build"
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @dani-builder/blocks — block styles.
|
|
3
|
+
*
|
|
4
|
+
* Pure CSS that references design-token CSS variables (--color-*, --card-*,
|
|
5
|
+
* --font-*, --section-link). The consuming app supplies those tokens (e.g. via
|
|
6
|
+
* Tailwind v4 `@theme`) and Tailwind's utility classes. Import once, after
|
|
7
|
+
* Tailwind, so the `@layer base` rule below merges into Tailwind's layers.
|
|
8
|
+
*
|
|
9
|
+
* @import "@dani-builder/blocks/styles.css";
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
/* Card surface tokens. Light defaults; each dark `.section-*` preset re-scopes
|
|
13
|
+
them so cards adapt to the section theme. Cards reference these via
|
|
14
|
+
bg-(--card-bg) / text-(--card-fg) / border-(--card-border). */
|
|
15
|
+
:root {
|
|
16
|
+
--card-bg: #ffffff;
|
|
17
|
+
--card-border: #e6e5dc;
|
|
18
|
+
--card-fg: var(--color-text);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/* ── Section theme presets ───────────────────────────────── */
|
|
22
|
+
.section-default {
|
|
23
|
+
background-color: #ffffff;
|
|
24
|
+
color: var(--color-text);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.section-light {
|
|
28
|
+
background-color: var(--color-bg);
|
|
29
|
+
color: var(--color-text);
|
|
30
|
+
--card-border: color-mix(in srgb, var(--color-text) 12%, transparent);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.section-dark {
|
|
34
|
+
background-color: #10261e;
|
|
35
|
+
color: #f4f7f5;
|
|
36
|
+
--color-text-muted: #9fb3a9;
|
|
37
|
+
--card-bg: rgba(255, 255, 255, 0.06);
|
|
38
|
+
--card-border: rgba(255, 255, 255, 0.12);
|
|
39
|
+
--card-fg: #f4f7f5;
|
|
40
|
+
--color-primary: var(--color-primary-light);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.section-accent {
|
|
44
|
+
background-color: var(--color-primary);
|
|
45
|
+
color: #ffffff;
|
|
46
|
+
--color-text-muted: rgba(255, 255, 255, 0.85);
|
|
47
|
+
/* Black overlay (not a white tint) so white --card-fg keeps >=4.5:1 over
|
|
48
|
+
the indigo accent background. */
|
|
49
|
+
--card-bg: rgba(0, 0, 0, 0.22);
|
|
50
|
+
--card-border: rgba(255, 255, 255, 0.28);
|
|
51
|
+
--card-fg: #ffffff;
|
|
52
|
+
--section-link: #ffffff;
|
|
53
|
+
/* Do NOT redefine --color-primary here: background-color above resolves it,
|
|
54
|
+
so a local override would repaint the section. */
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.section-muted {
|
|
58
|
+
background-color: #edece4;
|
|
59
|
+
color: #3d4a43;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
.section-contrast {
|
|
63
|
+
background-color: var(--color-text);
|
|
64
|
+
color: #ffffff;
|
|
65
|
+
--color-text-muted: rgba(255, 255, 255, 0.72);
|
|
66
|
+
--card-bg: rgba(255, 255, 255, 0.08);
|
|
67
|
+
--card-border: rgba(255, 255, 255, 0.18);
|
|
68
|
+
--card-fg: #ffffff;
|
|
69
|
+
--color-primary: var(--color-primary-light);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* ── Shared primitives ───────────────────────────────────────
|
|
73
|
+
Buttons, kicker, and card surfaces every block reuses. Plain classes (not
|
|
74
|
+
utilities) so the look is consistent and token-driven in one place. */
|
|
75
|
+
.block-btn,
|
|
76
|
+
.block-btn-ghost {
|
|
77
|
+
display: inline-flex;
|
|
78
|
+
align-items: center;
|
|
79
|
+
justify-content: center;
|
|
80
|
+
gap: 0.5rem;
|
|
81
|
+
border-radius: 9999px;
|
|
82
|
+
padding: 0.7rem 1.6rem;
|
|
83
|
+
font-size: 0.875rem;
|
|
84
|
+
font-weight: 600;
|
|
85
|
+
line-height: 1.25;
|
|
86
|
+
transition:
|
|
87
|
+
background-color 150ms ease,
|
|
88
|
+
border-color 150ms ease,
|
|
89
|
+
color 150ms ease,
|
|
90
|
+
transform 150ms ease;
|
|
91
|
+
}
|
|
92
|
+
.block-btn {
|
|
93
|
+
background-color: var(--color-cta);
|
|
94
|
+
color: #ffffff;
|
|
95
|
+
}
|
|
96
|
+
.block-btn:hover {
|
|
97
|
+
background-color: var(--color-cta-hover);
|
|
98
|
+
}
|
|
99
|
+
.block-btn:active {
|
|
100
|
+
transform: translateY(1px);
|
|
101
|
+
}
|
|
102
|
+
.block-btn-ghost {
|
|
103
|
+
border: 1px solid color-mix(in srgb, currentColor 30%, transparent);
|
|
104
|
+
color: inherit;
|
|
105
|
+
}
|
|
106
|
+
.block-btn-ghost:hover {
|
|
107
|
+
border-color: color-mix(in srgb, currentColor 55%, transparent);
|
|
108
|
+
background-color: color-mix(in srgb, currentColor 6%, transparent);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/* Signature: kicker label with a small square "block" marker. */
|
|
112
|
+
.section-kicker {
|
|
113
|
+
display: inline-flex;
|
|
114
|
+
align-items: center;
|
|
115
|
+
gap: 0.55rem;
|
|
116
|
+
font-size: 0.75rem;
|
|
117
|
+
font-weight: 650;
|
|
118
|
+
letter-spacing: 0.14em;
|
|
119
|
+
text-transform: uppercase;
|
|
120
|
+
color: var(--color-primary);
|
|
121
|
+
}
|
|
122
|
+
.section-kicker::before {
|
|
123
|
+
content: "";
|
|
124
|
+
width: 0.55em;
|
|
125
|
+
height: 0.55em;
|
|
126
|
+
border-radius: 1px;
|
|
127
|
+
background-color: currentColor;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* Card surface. Hover lift is opt-in via .block-card-hover. */
|
|
131
|
+
.block-card {
|
|
132
|
+
border-radius: 1.25rem;
|
|
133
|
+
border: 1px solid var(--card-border);
|
|
134
|
+
background-color: var(--card-bg);
|
|
135
|
+
color: var(--card-fg);
|
|
136
|
+
}
|
|
137
|
+
.block-card-hover {
|
|
138
|
+
transition:
|
|
139
|
+
border-color 200ms ease,
|
|
140
|
+
box-shadow 200ms ease,
|
|
141
|
+
transform 200ms ease;
|
|
142
|
+
}
|
|
143
|
+
.block-card-hover:hover {
|
|
144
|
+
border-color: color-mix(in srgb, var(--color-primary) 45%, transparent);
|
|
145
|
+
box-shadow: 0 12px 32px -16px color-mix(in srgb, var(--color-text) 35%, transparent);
|
|
146
|
+
transform: translateY(-2px);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/* Auto-color only unstyled text links inside dark theme sections; class-styled
|
|
150
|
+
anchors (buttons) keep their own colors. */
|
|
151
|
+
@layer base {
|
|
152
|
+
.section-dark a:not([class]),
|
|
153
|
+
.section-accent a:not([class]),
|
|
154
|
+
.section-contrast a:not([class]) {
|
|
155
|
+
color: var(--section-link, currentColor);
|
|
156
|
+
text-decoration: underline;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/* ── Transparent site header overlay ─────────────────────────
|
|
161
|
+
A hero with headerMode=transparent-* drops a `data-hero-header` marker;
|
|
162
|
+
:has() lets the earlier-in-DOM header overlay it transparently. Unlayered so
|
|
163
|
+
it wins over the header's utility classes. */
|
|
164
|
+
body:has([data-hero-header^="transparent"]) header {
|
|
165
|
+
position: absolute;
|
|
166
|
+
inset-inline: 0;
|
|
167
|
+
background-color: transparent;
|
|
168
|
+
border-color: transparent;
|
|
169
|
+
backdrop-filter: none;
|
|
170
|
+
}
|
|
171
|
+
body:has([data-hero-header="transparent-white"]) header
|
|
172
|
+
:where(a, button, span):not([class*="bg-"]) {
|
|
173
|
+
color: #ffffff;
|
|
174
|
+
}
|
|
175
|
+
body:has([data-hero-header="transparent-black"]) header
|
|
176
|
+
:where(a, button, span):not([class*="bg-"]) {
|
|
177
|
+
color: #111827;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/* Stat values render in the brand color, which disappears on the strong
|
|
181
|
+
section themes (accent bg IS the brand color) — force white there. */
|
|
182
|
+
.section-accent .stat-value,
|
|
183
|
+
.section-dark .stat-value,
|
|
184
|
+
.section-contrast .stat-value {
|
|
185
|
+
color: #ffffff;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* Form inputs: neutral ink-tinted border (the default --card-border is a
|
|
189
|
+
warm tan tuned for cards, too faint for inputs) + brand focus ring. */
|
|
190
|
+
.form-input {
|
|
191
|
+
border: 1px solid color-mix(in srgb, var(--color-text) 22%, transparent);
|
|
192
|
+
background-color: #ffffff;
|
|
193
|
+
}
|
|
194
|
+
.form-input:focus {
|
|
195
|
+
border-color: var(--color-primary);
|
|
196
|
+
outline: 2px solid color-mix(in srgb, var(--color-primary) 30%, transparent);
|
|
197
|
+
outline-offset: 0;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/* Rich-text content: links carry the brand color (the typography plugin's
|
|
201
|
+
default palette link blue is the only off-palette hue otherwise), and the
|
|
202
|
+
wide variant flows into columns on large screens so short structured
|
|
203
|
+
content fills its fold. */
|
|
204
|
+
.block-content a {
|
|
205
|
+
color: var(--color-primary);
|
|
206
|
+
text-decoration-color: color-mix(in srgb, var(--color-primary) 40%, transparent);
|
|
207
|
+
}
|
|
208
|
+
.block-content a:hover {
|
|
209
|
+
text-decoration-color: var(--color-primary);
|
|
210
|
+
}
|
|
211
|
+
@media (min-width: 1024px) {
|
|
212
|
+
.block-content-wide {
|
|
213
|
+
columns: 2;
|
|
214
|
+
column-gap: 4rem;
|
|
215
|
+
}
|
|
216
|
+
.block-content-wide h2,
|
|
217
|
+
.block-content-wide h3 {
|
|
218
|
+
break-after: avoid;
|
|
219
|
+
}
|
|
220
|
+
.block-content-wide p,
|
|
221
|
+
.block-content-wide ul,
|
|
222
|
+
.block-content-wide h2,
|
|
223
|
+
.block-content-wide h3 {
|
|
224
|
+
break-inside: avoid;
|
|
225
|
+
}
|
|
226
|
+
/* CSS columns keep a heading's top margin at the top of a later column,
|
|
227
|
+
so column starts misalign. Space groups with bottom margins instead. */
|
|
228
|
+
.block-content-wide :is(h2, h3) {
|
|
229
|
+
margin-top: 0;
|
|
230
|
+
}
|
|
231
|
+
.block-content-wide p {
|
|
232
|
+
margin-bottom: 1.75rem;
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/* Reveal animations must never hide content in non-interactive rendering
|
|
237
|
+
contexts (print, PDF capture) where animations may not run. */
|
|
238
|
+
@media print {
|
|
239
|
+
html.js [data-reveal] > * {
|
|
240
|
+
opacity: 1 !important;
|
|
241
|
+
animation: none !important;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/* ── Motion ──────────────────────────────────────────────────
|
|
246
|
+
Entrance/marquee motion, gated on prefers-reduced-motion. */
|
|
247
|
+
@keyframes reveal-fade-up {
|
|
248
|
+
from { opacity: 0; transform: translateY(16px); }
|
|
249
|
+
to { opacity: 1; transform: translateY(0); }
|
|
250
|
+
}
|
|
251
|
+
@keyframes logo-marquee {
|
|
252
|
+
from { transform: translateX(0); }
|
|
253
|
+
to { transform: translateX(-50%); }
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
@keyframes reveal-fallback {
|
|
257
|
+
to { opacity: 1; }
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
261
|
+
/* Gated on `html.js` (host sets it before paint) so JS-disabled content
|
|
262
|
+
stays visible instead of stuck at opacity:0. The delayed reveal-fallback
|
|
263
|
+
keyframe makes the hide fail-visible: if hydration never flips
|
|
264
|
+
data-reveal to "in" (blocked script, hydration error), content still
|
|
265
|
+
appears after 1.8s instead of staying invisible forever. */
|
|
266
|
+
html.js [data-reveal="out"] > * {
|
|
267
|
+
opacity: 0;
|
|
268
|
+
animation: reveal-fallback 0.6s ease 1.8s both;
|
|
269
|
+
}
|
|
270
|
+
html.js [data-reveal="in"] > * {
|
|
271
|
+
animation: reveal-fade-up 0.6s cubic-bezier(0.22, 1, 0.36, 1) both;
|
|
272
|
+
}
|
|
273
|
+
html.js [data-reveal="in"] > *:nth-child(2) { animation-delay: 0.08s; }
|
|
274
|
+
html.js [data-reveal="in"] > *:nth-child(3) { animation-delay: 0.16s; }
|
|
275
|
+
html.js [data-reveal="in"] > *:nth-child(4) { animation-delay: 0.24s; }
|
|
276
|
+
html.js [data-reveal="in"] > *:nth-child(n + 5) { animation-delay: 0.3s; }
|
|
277
|
+
|
|
278
|
+
.logo-marquee-track {
|
|
279
|
+
animation: logo-marquee 30s linear infinite;
|
|
280
|
+
}
|
|
281
|
+
.logo-marquee:hover .logo-marquee-track,
|
|
282
|
+
.logo-marquee:focus-within .logo-marquee-track {
|
|
283
|
+
animation-play-state: paused;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/* Fade the marquee edges. */
|
|
288
|
+
.logo-marquee {
|
|
289
|
+
-webkit-mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
|
|
290
|
+
mask-image: linear-gradient(to right, transparent, #000 8%, #000 92%, transparent);
|
|
291
|
+
}
|