@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.
Files changed (64) hide show
  1. package/dist/cloud/HyvorBar/BarNotice/BarNotice.svelte +1 -1
  2. package/dist/cloud/HyvorBar/BarSupport.svelte +1 -1
  3. package/dist/cloud/HyvorBar/Organization/BarOrganization.svelte +1 -1
  4. package/dist/components/Avatar/Avatar.svelte +50 -4
  5. package/dist/components/Avatar/Avatar.svelte.d.ts +4 -1
  6. package/dist/components/Avatar/AvatarStack.svelte +6 -3
  7. package/dist/components/ButtonGroup/ButtonGroup.svelte +82 -0
  8. package/dist/components/{Button → ButtonGroup}/ButtonGroup.svelte.d.ts +1 -0
  9. package/dist/components/Modal/ConfirmModalProvider.svelte +6 -9
  10. package/dist/components/Modal/ModalFooter.svelte +24 -27
  11. package/dist/components/Toast/ToastMessage.svelte +3 -6
  12. package/dist/components/Toast/ToastProvider.svelte +8 -4
  13. package/dist/components/Tooltip/Tooltip.svelte +54 -28
  14. package/dist/components/Tooltip/Tooltip.svelte.d.ts +15 -35
  15. package/dist/components/index.d.ts +1 -1
  16. package/dist/components/index.js +1 -1
  17. package/dist/index.css +4 -1
  18. package/dist/marketing/Docs/Docs.svelte +2 -2
  19. package/dist/marketing/Footer/Footer.svelte +98 -402
  20. package/dist/marketing/Footer/Footer.svelte.d.ts +2 -18
  21. package/dist/marketing/Footer/FooterLinkList.svelte +3 -10
  22. package/dist/marketing/Header/Header.svelte +28 -72
  23. package/dist/marketing/Header/Header.svelte.d.ts +2 -5
  24. package/dist/marketing/index.d.ts +0 -18
  25. package/dist/marketing/index.js +0 -17
  26. package/dist/marketing/social.d.ts +1 -1
  27. package/dist/marketing/social.js +1 -1
  28. package/package.json +1 -1
  29. package/dist/components/Button/ButtonGroup.svelte +0 -18
  30. package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordion.svelte +0 -251
  31. package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordion.svelte.d.ts +0 -23
  32. package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordionFeature.svelte +0 -75
  33. package/dist/marketing/AllFeaturesAccordion/AllFeaturesAccordionFeature.svelte.d.ts +0 -10
  34. package/dist/marketing/FAQ/FAQ.svelte +0 -233
  35. package/dist/marketing/FAQ/FAQ.svelte.d.ts +0 -13
  36. package/dist/marketing/FeatureSplit/FeatureSplit.svelte +0 -325
  37. package/dist/marketing/FeatureSplit/FeatureSplit.svelte.d.ts +0 -24
  38. package/dist/marketing/FullTrialSignup/FullTrialSignup.svelte +0 -164
  39. package/dist/marketing/FullTrialSignup/FullTrialSignup.svelte.d.ts +0 -18
  40. package/dist/marketing/Header/HeaderLanguageToggle.svelte +0 -121
  41. package/dist/marketing/Header/HeaderLanguageToggle.svelte.d.ts +0 -14
  42. package/dist/marketing/Header/HeaderNavLink.svelte +0 -148
  43. package/dist/marketing/Header/HeaderNavLink.svelte.d.ts +0 -17
  44. package/dist/marketing/Header/language.d.ts +0 -18
  45. package/dist/marketing/Header/language.js +0 -35
  46. package/dist/marketing/Hero/Hero.svelte +0 -353
  47. package/dist/marketing/Hero/Hero.svelte.d.ts +0 -16
  48. package/dist/marketing/LogoStrip/LogoStrip.svelte +0 -204
  49. package/dist/marketing/LogoStrip/LogoStrip.svelte.d.ts +0 -19
  50. package/dist/marketing/Seal/CcpaSeal.svelte +0 -29
  51. package/dist/marketing/Seal/CcpaSeal.svelte.d.ts +0 -6
  52. package/dist/marketing/Seal/GdprSeal.svelte +0 -60
  53. package/dist/marketing/Seal/GdprSeal.svelte.d.ts +0 -6
  54. package/dist/marketing/Seal/IsoSeal.svelte +0 -44
  55. package/dist/marketing/Seal/IsoSeal.svelte.d.ts +0 -6
  56. package/dist/marketing/Seal/Seal.svelte +0 -62
  57. package/dist/marketing/Seal/Seal.svelte.d.ts +0 -8
  58. package/dist/marketing/Seal/SsoSeal.svelte +0 -31
  59. package/dist/marketing/Seal/SsoSeal.svelte.d.ts +0 -6
  60. package/dist/marketing/Seal/ccpa.svg +0 -131
  61. package/dist/marketing/SpotlightSplit/SpotlightSplit.svelte +0 -256
  62. package/dist/marketing/SpotlightSplit/SpotlightSplit.svelte.d.ts +0 -19
  63. package/dist/marketing/Testimonials/Testimonials.svelte +0 -382
  64. 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 IconBluesky from '@hyvor/icons/IconBluesky';
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
- languageToggle?: boolean;
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
- languageToggle = true,
58
- gdpr = true,
32
+ social = $bindable({} as Record<string, string | null>),
33
+ center,
59
34
  affiliate = true,
60
35
  recordVisit = true,
61
- center,
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
- const SOCIAL_PLATFORMS = [
76
- { key: 'x', icon: IconTwitterX, label: 'X (Twitter)' },
77
- { key: 'github', icon: IconGithub, label: 'GitHub' },
78
- { key: 'discord', icon: IconDiscord, label: 'Discord' },
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
- // a single 5-pointed star (outer/inner vertices alternating), centered on
114
- // its own origin — reused via `transform="translate(...)"` per position
115
- // below, rather than a plain dot, for the EU ring on the GDPR badge
116
- function starPath(outerR: number, innerR: number) {
117
- const points: string[] = [];
118
- for (let i = 0; i < 10; i++) {
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
- <div class="footer-outer">
138
- {#if mascotLogo}
139
- <div class="mascot-wrap" use:onView={() => (mascotInView = true)}>
140
- <img
141
- src={mascotLogo}
142
- alt="{name} {logoAltText}"
143
- width="100"
144
- height="100"
145
- class:in-view={mascotInView}
146
- />
147
- </div>
148
- {/if}
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
- <footer class:card style:--footer-bg={background} style:--footer-bg-dark={backgroundDark}>
151
- <Container {max}>
152
- <div class="top-row">
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
- </div>
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
- <div class="socials">
181
- {#each SOCIAL_PLATFORMS as platform (platform.key)}
182
- {@const href = socialLinks[platform.key]}
183
- {#if href}
184
- <a {href} target="_blank" rel="nofollow" aria-label={platform.label}>
185
- <platform.icon size={16} />
186
- </a>
187
- {/if}
188
- {/each}
189
- </div>
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-center">
200
- {@render center?.()}
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
- <div class="bottom-bar">
204
- <div>HYVOR &copy; {year}</div>
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
- <div class="bottom-right">
224
- <div class="france">{fromFranceText} <span class="flag">🇫🇷</span></div>
225
- </div>
113
+ <div class="footer-bottom">
114
+ <div class="footer-bottom-left">
115
+ HYVOR © {year}
226
116
  </div>
227
- </Container>
228
- </footer>
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
- </div>
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
- --footer-text: var(--text);
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
- `backgroundDark` only when needed for dark mode - not complusory
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: center;
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
- .brand {
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
- .subname {
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: 2px;
152
+ gap: 4px;
153
+ margin-bottom: 15px;
350
154
  }
351
-
352
- .email {
353
- display: inline-flex;
354
- align-items: center;
355
- gap: 6px;
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
- .email:hover {
361
- color: var(--footer-hover);
161
+ .social-media a:first-child {
162
+ padding-left: 0;
362
163
  }
363
-
364
- .socials {
365
- display: flex;
366
- align-items: center;
367
- gap: 14px;
164
+ .social-media a:hover {
165
+ color: var(--accent);
368
166
  }
369
167
 
370
- .socials a {
371
- color: var(--footer-text);
168
+ .footer-bottom {
169
+ padding-top: 50px;
170
+ padding-bottom: 30px;
372
171
  display: flex;
373
172
  }
374
-
375
- .socials a:hover {
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
- languageToggle?: boolean;
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-size: 12px;
25
- font-weight: 700;
23
+ font-weight: 600;
26
24
  text-transform: uppercase;
27
- letter-spacing: 0.05em;
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
- font-size: 14px;
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>