@hyvor/design 2.1.8-beta.5 → 2.1.9
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/cloud/HyvorBar/BarNotice/BarNotice.svelte +1 -1
- package/dist/cloud/HyvorBar/BarSupport.svelte +1 -1
- package/dist/cloud/HyvorBar/Organization/BarOrganization.svelte +1 -1
- package/dist/components/Avatar/Avatar.svelte +50 -4
- package/dist/components/Avatar/Avatar.svelte.d.ts +4 -1
- package/dist/components/Avatar/AvatarStack.svelte +6 -3
- package/dist/components/ButtonGroup/ButtonGroup.svelte +82 -0
- package/dist/components/{Button → ButtonGroup}/ButtonGroup.svelte.d.ts +1 -0
- package/dist/components/Modal/ConfirmModalProvider.svelte +6 -9
- package/dist/components/Modal/ModalFooter.svelte +24 -27
- package/dist/components/Toast/ToastMessage.svelte +3 -6
- package/dist/components/Toast/ToastProvider.svelte +8 -4
- package/dist/components/Tooltip/Tooltip.svelte +54 -28
- package/dist/components/Tooltip/Tooltip.svelte.d.ts +15 -35
- package/dist/components/index.d.ts +1 -1
- package/dist/components/index.js +1 -1
- package/dist/index.css +4 -1
- package/dist/marketing/Docs/Docs.svelte +2 -2
- package/dist/marketing/Footer/Footer.svelte +98 -402
- package/dist/marketing/Footer/Footer.svelte.d.ts +2 -18
- package/dist/marketing/Footer/FooterLinkList.svelte +3 -10
- package/dist/marketing/Header/Header.svelte +28 -72
- package/dist/marketing/Header/Header.svelte.d.ts +2 -5
- package/dist/marketing/index.d.ts +0 -18
- package/dist/marketing/index.js +0 -17
- package/dist/marketing/social.d.ts +1 -1
- package/dist/marketing/social.js +1 -1
- package/package.json +1 -1
- package/dist/components/Button/ButtonGroup.svelte +0 -18
- package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordion.svelte +0 -251
- package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordion.svelte.d.ts +0 -23
- package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordionFeature.svelte +0 -75
- package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordionFeature.svelte.d.ts +0 -10
- package/dist/marketing/FAQ/FAQ.svelte +0 -233
- package/dist/marketing/FAQ/FAQ.svelte.d.ts +0 -13
- package/dist/marketing/FeatureSplit/FeatureSplit.svelte +0 -325
- package/dist/marketing/FeatureSplit/FeatureSplit.svelte.d.ts +0 -24
- package/dist/marketing/FullTrialSignup/FullTrialSignup.svelte +0 -164
- package/dist/marketing/FullTrialSignup/FullTrialSignup.svelte.d.ts +0 -18
- package/dist/marketing/Header/HeaderLanguageToggle.svelte +0 -121
- package/dist/marketing/Header/HeaderLanguageToggle.svelte.d.ts +0 -14
- package/dist/marketing/Header/HeaderNavLink.svelte +0 -148
- package/dist/marketing/Header/HeaderNavLink.svelte.d.ts +0 -17
- package/dist/marketing/Header/language.d.ts +0 -18
- package/dist/marketing/Header/language.js +0 -35
- package/dist/marketing/Hero/Hero.svelte +0 -353
- package/dist/marketing/Hero/Hero.svelte.d.ts +0 -16
- package/dist/marketing/LogoStrip/LogoStrip.svelte +0 -204
- package/dist/marketing/LogoStrip/LogoStrip.svelte.d.ts +0 -19
- package/dist/marketing/Seal/CcpaSeal.svelte +0 -29
- package/dist/marketing/Seal/CcpaSeal.svelte.d.ts +0 -6
- package/dist/marketing/Seal/GdprSeal.svelte +0 -60
- package/dist/marketing/Seal/GdprSeal.svelte.d.ts +0 -6
- package/dist/marketing/Seal/IsoSeal.svelte +0 -44
- package/dist/marketing/Seal/IsoSeal.svelte.d.ts +0 -6
- package/dist/marketing/Seal/Seal.svelte +0 -62
- package/dist/marketing/Seal/Seal.svelte.d.ts +0 -8
- package/dist/marketing/Seal/SsoSeal.svelte +0 -31
- package/dist/marketing/Seal/SsoSeal.svelte.d.ts +0 -6
- package/dist/marketing/Seal/ccpa.svg +0 -131
- package/dist/marketing/SpotlightSplit/SpotlightSplit.svelte +0 -256
- package/dist/marketing/SpotlightSplit/SpotlightSplit.svelte.d.ts +0 -19
- package/dist/marketing/Testimonials/Testimonials.svelte +0 -382
- package/dist/marketing/Testimonials/Testimonials.svelte.d.ts +0 -23
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
2
|
import Container from '../Container/Container.svelte';
|
|
4
|
-
import IconEnvelope from '@hyvor/icons/IconEnvelope';
|
|
5
3
|
import IconCopy from '@hyvor/icons/IconCopy';
|
|
6
4
|
import IconDiscord from '@hyvor/icons/IconDiscord';
|
|
5
|
+
import IconEnvelope from '@hyvor/icons/IconEnvelope';
|
|
7
6
|
import IconGithub from '@hyvor/icons/IconGithub';
|
|
8
7
|
import IconLinkedin from '@hyvor/icons/IconLinkedin';
|
|
9
8
|
import IconTwitterX from '@hyvor/icons/IconTwitterX';
|
|
10
9
|
import IconYoutube from '@hyvor/icons/IconYoutube';
|
|
11
|
-
import
|
|
12
|
-
import IconLockFill from '@hyvor/icons/IconLockFill';
|
|
10
|
+
import Link from '../../components/Link/Link.svelte';
|
|
13
11
|
import IconButton from '../../components/IconButton/IconButton.svelte';
|
|
14
12
|
import Tooltip from '../../components/Tooltip/Tooltip.svelte';
|
|
15
13
|
import LanguageToggle from '../../components/Internationalization/LanguageToggle.svelte';
|
|
14
|
+
import IconBluesky from '@hyvor/icons/IconBluesky';
|
|
16
15
|
import { SOCIAL_LINKS, type Socials } from '../social.js';
|
|
17
16
|
import Affiliate from '../Affiliate/Affiliate.svelte';
|
|
18
17
|
import RecordVisit from './RecordVisit.svelte';
|
|
@@ -20,212 +19,104 @@
|
|
|
20
19
|
const year = new Date().getFullYear();
|
|
21
20
|
|
|
22
21
|
interface Props {
|
|
23
|
-
name?: string;
|
|
24
|
-
subname?: string;
|
|
25
|
-
product?: string;
|
|
26
|
-
instance?: string;
|
|
27
|
-
logo?: string;
|
|
28
|
-
background?: string;
|
|
29
|
-
backgroundDark?: string;
|
|
30
|
-
card?: boolean;
|
|
31
22
|
email?: string | null;
|
|
32
23
|
social?: Partial<Socials>;
|
|
33
|
-
|
|
34
|
-
gdpr?: boolean;
|
|
24
|
+
center?: import('svelte').Snippet;
|
|
35
25
|
affiliate?: boolean;
|
|
36
26
|
recordVisit?: boolean;
|
|
37
|
-
center?: Snippet;
|
|
38
27
|
max?: boolean;
|
|
39
|
-
logoAltText?: string;
|
|
40
|
-
copyEmailLabel?: string;
|
|
41
|
-
copiedLabel?: string;
|
|
42
|
-
gdprText?: string;
|
|
43
|
-
fromFranceText?: string;
|
|
44
28
|
}
|
|
45
29
|
|
|
46
30
|
let {
|
|
47
|
-
name = 'HYVOR',
|
|
48
|
-
subname,
|
|
49
|
-
product,
|
|
50
|
-
instance = 'https://hyvor.com',
|
|
51
|
-
logo,
|
|
52
|
-
background,
|
|
53
|
-
backgroundDark,
|
|
54
|
-
card = false,
|
|
55
31
|
email = null,
|
|
56
|
-
social = {},
|
|
57
|
-
|
|
58
|
-
gdpr = true,
|
|
32
|
+
social = $bindable({} as Record<string, string | null>),
|
|
33
|
+
center,
|
|
59
34
|
affiliate = true,
|
|
60
35
|
recordVisit = true,
|
|
61
|
-
|
|
62
|
-
max = false,
|
|
63
|
-
logoAltText = 'Logo',
|
|
64
|
-
copyEmailLabel = 'Copy email',
|
|
65
|
-
copiedLabel = 'Copied!',
|
|
66
|
-
gdprText = 'GDPR Compliant',
|
|
67
|
-
fromFranceText = 'From France'
|
|
36
|
+
max = false
|
|
68
37
|
}: Props = $props();
|
|
69
|
-
const mascotLogo = $derived(
|
|
70
|
-
logo || (product ? `${instance}/api/public/logo/${product}.svg` : undefined)
|
|
71
|
-
);
|
|
72
|
-
|
|
73
|
-
const socialLinks = $derived({ ...SOCIAL_LINKS, ...social });
|
|
74
38
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
{ key: 'linkedin', icon: IconLinkedin, label: 'LinkedIn' },
|
|
80
|
-
{ key: 'youtube', icon: IconYoutube, label: 'YouTube' },
|
|
81
|
-
{ key: 'bluesky', icon: IconBluesky, label: 'Bluesky' }
|
|
82
|
-
] as const satisfies { key: keyof Socials; icon: unknown; label: string }[];
|
|
39
|
+
social = {
|
|
40
|
+
...SOCIAL_LINKS,
|
|
41
|
+
...social
|
|
42
|
+
};
|
|
83
43
|
|
|
84
44
|
let emailCopied = $state(false);
|
|
85
|
-
function handleCopyEmail() {
|
|
86
|
-
if (!email) return;
|
|
87
|
-
navigator.clipboard.writeText(email);
|
|
88
|
-
emailCopied = true;
|
|
89
|
-
setTimeout(() => (emailCopied = false), 1000);
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
// the floating mascot (only shown when a `logo` is given) tilts/fades in
|
|
93
|
-
// once it's scrolled into view, instead of just appearing on page load
|
|
94
|
-
let mascotInView = $state(false);
|
|
95
|
-
function onView(node: HTMLElement, callback: () => void) {
|
|
96
|
-
const observer = new IntersectionObserver(
|
|
97
|
-
(entries) => {
|
|
98
|
-
if (entries[0]?.isIntersecting) {
|
|
99
|
-
setTimeout(callback, 400);
|
|
100
|
-
observer.disconnect();
|
|
101
|
-
}
|
|
102
|
-
},
|
|
103
|
-
{ threshold: 0.3 }
|
|
104
|
-
);
|
|
105
|
-
observer.observe(node);
|
|
106
|
-
return {
|
|
107
|
-
destroy() {
|
|
108
|
-
observer.disconnect();
|
|
109
|
-
}
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
45
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
const angle = -Math.PI / 2 + (i * Math.PI) / 5;
|
|
120
|
-
const r = i % 2 === 0 ? outerR : innerR;
|
|
121
|
-
points.push(`${(r * Math.cos(angle)).toFixed(2)},${(r * Math.sin(angle)).toFixed(2)}`);
|
|
122
|
-
}
|
|
123
|
-
return `M${points.join('L')}Z`;
|
|
46
|
+
function handleCopy() {
|
|
47
|
+
navigator.clipboard.writeText(email!);
|
|
48
|
+
emailCopied = true;
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
emailCopied = false;
|
|
51
|
+
}, 1000);
|
|
124
52
|
}
|
|
125
|
-
const gdprStarPath = starPath(1.7, 0.68);
|
|
126
|
-
|
|
127
|
-
// positions for the 12-star EU ring on the small GDPR badge
|
|
128
|
-
const gdprStars = Array.from({ length: 12 }, (_, i) => {
|
|
129
|
-
const angle = (i * 30 * Math.PI) / 180;
|
|
130
|
-
return {
|
|
131
|
-
x: 16 + 12 * Math.cos(angle),
|
|
132
|
-
y: 16 + 12 * Math.sin(angle)
|
|
133
|
-
};
|
|
134
|
-
});
|
|
135
53
|
</script>
|
|
136
54
|
|
|
137
|
-
<
|
|
138
|
-
{
|
|
139
|
-
<div class="
|
|
140
|
-
<
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
55
|
+
<footer>
|
|
56
|
+
<Container {max}>
|
|
57
|
+
<div class="footer-top">
|
|
58
|
+
<div class="footer-top-left">
|
|
59
|
+
{#if email}
|
|
60
|
+
<div class="email-wrap">
|
|
61
|
+
<Link href="mailto:{email}" underline={false} color="text" rel="nofollow">
|
|
62
|
+
{#snippet start()}
|
|
63
|
+
<IconEnvelope />
|
|
64
|
+
{/snippet}
|
|
65
|
+
{email}
|
|
66
|
+
</Link>
|
|
67
|
+
<Tooltip text={emailCopied ? 'Copied!' : 'Copy email'} position="top">
|
|
68
|
+
<IconButton
|
|
69
|
+
size="small"
|
|
70
|
+
variant="invisible"
|
|
71
|
+
on:click={handleCopy}
|
|
72
|
+
on:mouseleave={() => (emailCopied = false)}
|
|
73
|
+
>
|
|
74
|
+
<IconCopy size={12} />
|
|
75
|
+
</IconButton>
|
|
76
|
+
</Tooltip>
|
|
77
|
+
</div>
|
|
78
|
+
{/if}
|
|
149
79
|
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
<div class="brand">
|
|
154
|
-
<span>{name}</span>
|
|
155
|
-
{#if subname}
|
|
156
|
-
<div class="subname">{subname}</div>
|
|
80
|
+
<div class="social-media">
|
|
81
|
+
{#if social.github}
|
|
82
|
+
<a href={social.github} target="_blank" rel="nofollow"><IconGithub /></a>
|
|
157
83
|
{/if}
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
<div class="top-row-right">
|
|
161
|
-
{#if email}
|
|
162
|
-
<div class="email-wrap">
|
|
163
|
-
<a class="email" href="mailto:{email}">
|
|
164
|
-
<IconEnvelope size={14} />
|
|
165
|
-
{email}
|
|
166
|
-
</a>
|
|
167
|
-
<Tooltip text={emailCopied ? copiedLabel : copyEmailLabel} position="top">
|
|
168
|
-
<IconButton
|
|
169
|
-
size="small"
|
|
170
|
-
variant="invisible"
|
|
171
|
-
onclick={handleCopyEmail}
|
|
172
|
-
onmouseleave={() => (emailCopied = false)}
|
|
173
|
-
>
|
|
174
|
-
<IconCopy size={12} />
|
|
175
|
-
</IconButton>
|
|
176
|
-
</Tooltip>
|
|
177
|
-
</div>
|
|
84
|
+
{#if social.discord}
|
|
85
|
+
<a href={social.discord} target="_blank" rel="nofollow"><IconDiscord /></a>
|
|
178
86
|
{/if}
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
{#if languageToggle}
|
|
192
|
-
<span class="language-toggle-wrap">
|
|
193
|
-
<LanguageToggle align="end" position="top" staticPage />
|
|
194
|
-
</span>
|
|
87
|
+
{#if social.blueksy}
|
|
88
|
+
<a href={social.blueksy} target="_blank" rel="nofollow"><IconBluesky /></a>
|
|
89
|
+
{/if}
|
|
90
|
+
{#if social.x}
|
|
91
|
+
<a href={social.x} target="_blank" rel="nofollow"><IconTwitterX /></a>
|
|
92
|
+
{/if}
|
|
93
|
+
{#if social.youtube}
|
|
94
|
+
<a href={social.youtube} target="_blank" rel="nofollow"><IconYoutube /></a>
|
|
95
|
+
{/if}
|
|
96
|
+
{#if social.linkedin}
|
|
97
|
+
<a href={social.linkedin} target="_blank" rel="nofollow"><IconLinkedin /></a>
|
|
195
98
|
{/if}
|
|
196
99
|
</div>
|
|
197
100
|
</div>
|
|
198
101
|
|
|
199
|
-
<div class="footer-
|
|
200
|
-
|
|
102
|
+
<div class="footer-top-right">
|
|
103
|
+
<span class="language-toggle-wrap">
|
|
104
|
+
<LanguageToggle align="end" position="top" staticPage />
|
|
105
|
+
</span>
|
|
201
106
|
</div>
|
|
107
|
+
</div>
|
|
202
108
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
{#if gdpr}
|
|
207
|
-
<div class="bottom-center">
|
|
208
|
-
<a class="gdpr-chip" href="https://hyvor.com/compliance" target="_blank">
|
|
209
|
-
<span class="gdpr-chip-icon">
|
|
210
|
-
<svg class="ring" viewBox="0 0 32 32" aria-hidden="true">
|
|
211
|
-
<circle cx="16" cy="16" r="16" fill="#173a8a" />
|
|
212
|
-
{#each gdprStars as s}
|
|
213
|
-
<path d={gdprStarPath} fill="#ffcd3c" transform="translate({s.x}, {s.y})" />
|
|
214
|
-
{/each}
|
|
215
|
-
</svg>
|
|
216
|
-
<span class="lock"><IconLockFill size={10} /></span>
|
|
217
|
-
</span>
|
|
218
|
-
<span class="gdpr-chip-text">{gdprText}</span>
|
|
219
|
-
</a>
|
|
220
|
-
</div>
|
|
221
|
-
{/if}
|
|
109
|
+
<div class="footer-center">
|
|
110
|
+
{@render center?.()}
|
|
111
|
+
</div>
|
|
222
112
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
113
|
+
<div class="footer-bottom">
|
|
114
|
+
<div class="footer-bottom-left">
|
|
115
|
+
HYVOR © {year}
|
|
226
116
|
</div>
|
|
227
|
-
|
|
228
|
-
|
|
117
|
+
<div class="footer-bottom-right">From France 🇫🇷</div>
|
|
118
|
+
</div>
|
|
119
|
+
</Container>
|
|
229
120
|
|
|
230
121
|
{#if affiliate}
|
|
231
122
|
<Affiliate />
|
|
@@ -234,252 +125,57 @@
|
|
|
234
125
|
{#if recordVisit}
|
|
235
126
|
<RecordVisit />
|
|
236
127
|
{/if}
|
|
237
|
-
</
|
|
128
|
+
</footer>
|
|
238
129
|
|
|
239
130
|
<style>
|
|
240
|
-
.footer-outer {
|
|
241
|
-
position: relative;
|
|
242
|
-
margin-top: 100px;
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
.mascot-wrap {
|
|
246
|
-
position: absolute;
|
|
247
|
-
z-index: 10;
|
|
248
|
-
display: flex;
|
|
249
|
-
justify-content: center;
|
|
250
|
-
pointer-events: none;
|
|
251
|
-
left: 0;
|
|
252
|
-
bottom: 100%;
|
|
253
|
-
transform: translate(-35%, 45%) rotate(20deg);
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
.mascot-wrap img {
|
|
257
|
-
opacity: 0;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
.mascot-wrap img.in-view {
|
|
261
|
-
animation: mascot-tilt-in 0.8s ease forwards;
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
@keyframes mascot-tilt-in {
|
|
265
|
-
0% {
|
|
266
|
-
opacity: 0;
|
|
267
|
-
transform: rotate(-14deg) scale(0.9) translateY(16px);
|
|
268
|
-
}
|
|
269
|
-
55% {
|
|
270
|
-
opacity: 1;
|
|
271
|
-
transform: rotate(10deg) scale(1.06) translateY(-4px);
|
|
272
|
-
}
|
|
273
|
-
100% {
|
|
274
|
-
opacity: 1;
|
|
275
|
-
transform: rotate(0deg) scale(1) translateY(0);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
@media (prefers-reduced-motion: reduce) {
|
|
280
|
-
.mascot-wrap img {
|
|
281
|
-
opacity: 1;
|
|
282
|
-
}
|
|
283
|
-
.mascot-wrap img.in-view {
|
|
284
|
-
animation: none;
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
131
|
footer {
|
|
289
|
-
|
|
290
|
-
--footer-text-strong: var(--text);
|
|
291
|
-
--footer-muted: var(--text-light);
|
|
292
|
-
--footer-border: var(--border);
|
|
293
|
-
--footer-hover: var(--accent);
|
|
294
|
-
|
|
295
|
-
position: relative;
|
|
296
|
-
z-index: 1;
|
|
297
|
-
background: var(--footer-bg, transparent);
|
|
298
|
-
color: var(--footer-text);
|
|
299
|
-
padding-top: 50px;
|
|
132
|
+
border-top: 1px solid var(--border);
|
|
300
133
|
}
|
|
301
134
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
*/
|
|
305
|
-
:global(:root.dark) footer {
|
|
306
|
-
background: var(--footer-bg-dark, var(--footer-bg, transparent));
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
footer.card {
|
|
310
|
-
--footer-text: rgba(255, 255, 255, 0.75);
|
|
311
|
-
--footer-text-strong: #fff;
|
|
312
|
-
--footer-muted: rgba(255, 255, 255, 0.45);
|
|
313
|
-
--footer-border: rgba(255, 255, 255, 0.08);
|
|
314
|
-
--footer-hover: #fff;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
.top-row {
|
|
135
|
+
.footer-top {
|
|
136
|
+
padding-top: 60px;
|
|
318
137
|
display: flex;
|
|
319
|
-
align-items:
|
|
320
|
-
justify-content: space-between;
|
|
321
|
-
flex-wrap: wrap;
|
|
322
|
-
gap: 20px;
|
|
323
|
-
padding-bottom: 40px;
|
|
324
|
-
border-bottom: 1px solid var(--footer-border);
|
|
138
|
+
align-items: flex-start;
|
|
325
139
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
font-size: 16px;
|
|
329
|
-
font-weight: 700;
|
|
330
|
-
color: var(--footer-text-strong);
|
|
140
|
+
.footer-center {
|
|
141
|
+
padding-top: 50px;
|
|
331
142
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
font-size: 13px;
|
|
335
|
-
font-weight: 400;
|
|
336
|
-
color: var(--footer-muted);
|
|
143
|
+
.footer-top-left {
|
|
144
|
+
flex: 1;
|
|
337
145
|
}
|
|
338
|
-
|
|
339
|
-
.top-row-right {
|
|
146
|
+
.footer-top-right {
|
|
340
147
|
display: flex;
|
|
341
|
-
align-items: center;
|
|
342
|
-
gap: 24px;
|
|
343
|
-
flex-wrap: wrap;
|
|
344
148
|
}
|
|
345
|
-
|
|
346
149
|
.email-wrap {
|
|
347
150
|
display: inline-flex;
|
|
348
151
|
align-items: center;
|
|
349
|
-
gap:
|
|
152
|
+
gap: 4px;
|
|
153
|
+
margin-bottom: 15px;
|
|
350
154
|
}
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
font-size: 13px;
|
|
357
|
-
color: var(--footer-text);
|
|
155
|
+
.social-media a {
|
|
156
|
+
display: inline-block;
|
|
157
|
+
padding: 3px;
|
|
158
|
+
margin-right: 8px;
|
|
159
|
+
color: var(--text-light);
|
|
358
160
|
}
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
color: var(--footer-hover);
|
|
161
|
+
.social-media a:first-child {
|
|
162
|
+
padding-left: 0;
|
|
362
163
|
}
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
display: flex;
|
|
366
|
-
align-items: center;
|
|
367
|
-
gap: 14px;
|
|
164
|
+
.social-media a:hover {
|
|
165
|
+
color: var(--accent);
|
|
368
166
|
}
|
|
369
167
|
|
|
370
|
-
.
|
|
371
|
-
|
|
168
|
+
.footer-bottom {
|
|
169
|
+
padding-top: 50px;
|
|
170
|
+
padding-bottom: 30px;
|
|
372
171
|
display: flex;
|
|
373
172
|
}
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
color: var(--footer-hover);
|
|
173
|
+
.footer-bottom-left {
|
|
174
|
+
flex: 1;
|
|
377
175
|
}
|
|
378
176
|
|
|
379
177
|
.language-toggle-wrap {
|
|
178
|
+
margin-left: 8px;
|
|
380
179
|
font-size: 18px;
|
|
381
180
|
}
|
|
382
|
-
|
|
383
|
-
.footer-center:not(:empty) {
|
|
384
|
-
padding: 48px 0;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/* only if there is no center element - to prevent double border apperance */
|
|
388
|
-
.footer-center:not(:empty) + .bottom-bar {
|
|
389
|
-
border-top: 1px solid var(--footer-border);
|
|
390
|
-
}
|
|
391
|
-
|
|
392
|
-
.bottom-bar {
|
|
393
|
-
display: flex;
|
|
394
|
-
align-items: center;
|
|
395
|
-
justify-content: space-between;
|
|
396
|
-
flex-wrap: wrap;
|
|
397
|
-
gap: 10px;
|
|
398
|
-
padding: 24px 0 32px;
|
|
399
|
-
font-size: 13px;
|
|
400
|
-
color: var(--footer-muted);
|
|
401
|
-
}
|
|
402
|
-
|
|
403
|
-
.bottom-right {
|
|
404
|
-
display: flex;
|
|
405
|
-
align-items: center;
|
|
406
|
-
gap: 16px;
|
|
407
|
-
flex-wrap: wrap;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
.france {
|
|
411
|
-
display: inline-flex;
|
|
412
|
-
align-items: center;
|
|
413
|
-
gap: 6px;
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
.gdpr-chip {
|
|
417
|
-
display: inline-flex;
|
|
418
|
-
align-items: center;
|
|
419
|
-
gap: 8px;
|
|
420
|
-
padding: 5px 12px 5px 5px;
|
|
421
|
-
border-radius: 100px;
|
|
422
|
-
background: #1f2f57;
|
|
423
|
-
color: #fff;
|
|
424
|
-
opacity: 0.9;
|
|
425
|
-
transition: opacity 0.15s ease;
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
.gdpr-chip:hover {
|
|
429
|
-
opacity: 1;
|
|
430
|
-
}
|
|
431
|
-
|
|
432
|
-
.gdpr-chip-icon {
|
|
433
|
-
position: relative;
|
|
434
|
-
width: 22px;
|
|
435
|
-
height: 22px;
|
|
436
|
-
flex-shrink: 0;
|
|
437
|
-
}
|
|
438
|
-
|
|
439
|
-
.gdpr-chip-icon .ring {
|
|
440
|
-
position: absolute;
|
|
441
|
-
inset: 0;
|
|
442
|
-
width: 100%;
|
|
443
|
-
height: 100%;
|
|
444
|
-
display: block;
|
|
445
|
-
}
|
|
446
|
-
|
|
447
|
-
.gdpr-chip-icon .lock {
|
|
448
|
-
position: absolute;
|
|
449
|
-
inset: 0;
|
|
450
|
-
display: flex;
|
|
451
|
-
align-items: center;
|
|
452
|
-
justify-content: center;
|
|
453
|
-
color: #fff;
|
|
454
|
-
}
|
|
455
|
-
|
|
456
|
-
.gdpr-chip-text {
|
|
457
|
-
font-size: 11px;
|
|
458
|
-
font-weight: 800;
|
|
459
|
-
letter-spacing: 0.02em;
|
|
460
|
-
color: #fff;
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
/* emoji glyphs are pre-colored — never let the surrounding muted text
|
|
464
|
-
color dim or filter them */
|
|
465
|
-
.flag {
|
|
466
|
-
color: initial;
|
|
467
|
-
filter: none;
|
|
468
|
-
}
|
|
469
|
-
|
|
470
|
-
@media (max-width: 560px) {
|
|
471
|
-
.mascot-wrap {
|
|
472
|
-
/* keep it clear of the brand wordmark that sits right below it */
|
|
473
|
-
margin-bottom: -40px;
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
footer {
|
|
477
|
-
padding-top: 130px;
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
.top-row {
|
|
481
|
-
flex-direction: column;
|
|
482
|
-
align-items: flex-start;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
485
181
|
</style>
|
|
@@ -1,28 +1,12 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
1
|
import { type Socials } from '../social.js';
|
|
3
2
|
interface Props {
|
|
4
|
-
name?: string;
|
|
5
|
-
subname?: string;
|
|
6
|
-
product?: string;
|
|
7
|
-
instance?: string;
|
|
8
|
-
logo?: string;
|
|
9
|
-
background?: string;
|
|
10
|
-
backgroundDark?: string;
|
|
11
|
-
card?: boolean;
|
|
12
3
|
email?: string | null;
|
|
13
4
|
social?: Partial<Socials>;
|
|
14
|
-
|
|
15
|
-
gdpr?: boolean;
|
|
5
|
+
center?: import('svelte').Snippet;
|
|
16
6
|
affiliate?: boolean;
|
|
17
7
|
recordVisit?: boolean;
|
|
18
|
-
center?: Snippet;
|
|
19
8
|
max?: boolean;
|
|
20
|
-
logoAltText?: string;
|
|
21
|
-
copyEmailLabel?: string;
|
|
22
|
-
copiedLabel?: string;
|
|
23
|
-
gdprText?: string;
|
|
24
|
-
fromFranceText?: string;
|
|
25
9
|
}
|
|
26
|
-
declare const Footer: import("svelte").Component<Props, {}, "">;
|
|
10
|
+
declare const Footer: import("svelte").Component<Props, {}, "social">;
|
|
27
11
|
type Footer = ReturnType<typeof Footer>;
|
|
28
12
|
export default Footer;
|
|
@@ -17,16 +17,12 @@
|
|
|
17
17
|
<style>
|
|
18
18
|
.link-list {
|
|
19
19
|
flex: 1;
|
|
20
|
-
min-width: 150px;
|
|
21
20
|
}
|
|
22
21
|
|
|
23
22
|
.title {
|
|
24
|
-
font-
|
|
25
|
-
font-weight: 700;
|
|
23
|
+
font-weight: 600;
|
|
26
24
|
text-transform: uppercase;
|
|
27
|
-
|
|
28
|
-
color: var(--footer-muted, var(--text-light));
|
|
29
|
-
margin-bottom: 14px;
|
|
25
|
+
margin-bottom: 10px;
|
|
30
26
|
}
|
|
31
27
|
|
|
32
28
|
.links {
|
|
@@ -36,12 +32,9 @@
|
|
|
36
32
|
}
|
|
37
33
|
|
|
38
34
|
.links :global(a) {
|
|
39
|
-
|
|
40
|
-
color: var(--footer-text, var(--text-light));
|
|
41
|
-
margin-top: 10px;
|
|
35
|
+
margin-top: 12px;
|
|
42
36
|
}
|
|
43
37
|
.links :global(a:hover) {
|
|
44
|
-
color: var(--footer-text-strong, var(--text));
|
|
45
38
|
text-decoration: underline;
|
|
46
39
|
}
|
|
47
40
|
</style>
|