@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,12 +1,9 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
import { onMount } from 'svelte';
|
|
3
|
-
import type { Snippet } from 'svelte';
|
|
4
2
|
import Container from './../Container/Container.svelte';
|
|
5
3
|
import DarkToggle from '../../components/Dark/DarkToggle.svelte';
|
|
6
4
|
import IconButton from '../../components/IconButton/IconButton.svelte';
|
|
7
5
|
import Dropdown from '../../components/Dropdown/Dropdown.svelte';
|
|
8
6
|
import IconList from '@hyvor/icons/IconList';
|
|
9
|
-
import IconX from '@hyvor/icons/IconX';
|
|
10
7
|
import HeaderNotification from './HeaderNotification.svelte';
|
|
11
8
|
|
|
12
9
|
interface Props {
|
|
@@ -17,11 +14,9 @@
|
|
|
17
14
|
href?: string;
|
|
18
15
|
subName?: undefined | string;
|
|
19
16
|
darkToggle?: boolean;
|
|
20
|
-
center?: Snippet;
|
|
21
|
-
end?: Snippet;
|
|
17
|
+
center?: import('svelte').Snippet;
|
|
18
|
+
end?: import('svelte').Snippet;
|
|
22
19
|
max?: boolean;
|
|
23
|
-
logoAltText?: string;
|
|
24
|
-
menuLabel?: string;
|
|
25
20
|
}
|
|
26
21
|
|
|
27
22
|
let {
|
|
@@ -34,40 +29,20 @@
|
|
|
34
29
|
darkToggle = true,
|
|
35
30
|
center,
|
|
36
31
|
end,
|
|
37
|
-
max = false
|
|
38
|
-
logoAltText = 'Logo',
|
|
39
|
-
menuLabel = 'Menu'
|
|
32
|
+
max = false
|
|
40
33
|
}: Props = $props();
|
|
41
|
-
|
|
42
|
-
let scrolled = $state(false);
|
|
43
|
-
let mobileOpen = $state(false);
|
|
44
|
-
|
|
45
|
-
onMount(() => {
|
|
46
|
-
const onScroll = () => (scrolled = window.scrollY > 8);
|
|
47
|
-
onScroll();
|
|
48
|
-
window.addEventListener('scroll', onScroll, { passive: true });
|
|
49
|
-
return () => window.removeEventListener('scroll', onScroll);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
// close the mobile menu once a link inside it is clicked
|
|
53
|
-
function closeOnLinkClick(e: MouseEvent) {
|
|
54
|
-
const target = e.target as HTMLElement;
|
|
55
|
-
if (target.tagName === 'A' || target.closest('a')) {
|
|
56
|
-
mobileOpen = false;
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
34
|
</script>
|
|
60
35
|
|
|
61
|
-
<header
|
|
36
|
+
<header>
|
|
62
37
|
<HeaderNotification {instance} {product} />
|
|
63
38
|
<Container as="nav" {max}>
|
|
64
39
|
<div class="nav-start">
|
|
65
40
|
<a class="nav-brand" {href}>
|
|
66
41
|
<img
|
|
67
42
|
src={logo || `${instance}/api/public/logo/${product}.svg`}
|
|
68
|
-
alt="{name + (subName ? ' ' + subName : '')}
|
|
69
|
-
width="
|
|
70
|
-
height="
|
|
43
|
+
alt="{name + (subName ? ' ' + subName : '')} Logo"
|
|
44
|
+
width="30"
|
|
45
|
+
height="30"
|
|
71
46
|
/>
|
|
72
47
|
<span class="brand-product">
|
|
73
48
|
<span class="brand">{name}</span>
|
|
@@ -95,30 +70,20 @@
|
|
|
95
70
|
</div>
|
|
96
71
|
|
|
97
72
|
<span class="mobile-nav-wrap">
|
|
98
|
-
<Dropdown
|
|
73
|
+
<Dropdown align="end" width={300}>
|
|
99
74
|
{#snippet trigger()}
|
|
100
|
-
<IconButton variant="invisible"
|
|
101
|
-
{
|
|
102
|
-
<IconX size={18} />
|
|
103
|
-
{:else}
|
|
104
|
-
<IconList size={18} />
|
|
105
|
-
{/if}
|
|
75
|
+
<IconButton variant="invisible">
|
|
76
|
+
<IconList size={18} />
|
|
106
77
|
</IconButton>
|
|
107
78
|
{/snippet}
|
|
108
79
|
{#snippet content()}
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
{#if end}
|
|
117
|
-
<div class="mobile-divider"></div>
|
|
118
|
-
<div class="mobile-inner end">
|
|
119
|
-
{@render end()}
|
|
120
|
-
</div>
|
|
121
|
-
{/if}
|
|
80
|
+
<div class="mobile-content">
|
|
81
|
+
<div class="mobile-inner center">
|
|
82
|
+
{@render center?.()}
|
|
83
|
+
</div>
|
|
84
|
+
<div class="mobile-inner end">
|
|
85
|
+
{@render end?.()}
|
|
86
|
+
</div>
|
|
122
87
|
</div>
|
|
123
88
|
{/snippet}
|
|
124
89
|
</Dropdown>
|
|
@@ -140,15 +105,10 @@
|
|
|
140
105
|
width: 100%;
|
|
141
106
|
z-index: 100;
|
|
142
107
|
background-color: var(--background, var(--accent-lightest));
|
|
143
|
-
border-bottom: 1px solid
|
|
108
|
+
border-bottom: 1px solid var(--border);
|
|
144
109
|
height: var(--header-height);
|
|
145
110
|
display: flex;
|
|
146
111
|
flex-direction: column;
|
|
147
|
-
transition: border-color 0.2s ease;
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
header.scrolled {
|
|
151
|
-
border-bottom-color: var(--border);
|
|
152
112
|
}
|
|
153
113
|
|
|
154
114
|
header :global(> nav) {
|
|
@@ -157,9 +117,7 @@
|
|
|
157
117
|
flex: 1;
|
|
158
118
|
}
|
|
159
119
|
.nav-brand {
|
|
160
|
-
display: inline-
|
|
161
|
-
align-items: center;
|
|
162
|
-
gap: 8px;
|
|
120
|
+
display: inline-block;
|
|
163
121
|
line-height: inherit;
|
|
164
122
|
white-space: nowrap;
|
|
165
123
|
color: inherit;
|
|
@@ -167,10 +125,11 @@
|
|
|
167
125
|
font-weight: 600;
|
|
168
126
|
}
|
|
169
127
|
.nav-brand img {
|
|
170
|
-
|
|
128
|
+
vertical-align: middle;
|
|
171
129
|
}
|
|
172
130
|
|
|
173
131
|
.brand-product {
|
|
132
|
+
vertical-align: middle;
|
|
174
133
|
display: inline-flex;
|
|
175
134
|
flex-direction: column;
|
|
176
135
|
justify-content: center;
|
|
@@ -189,7 +148,7 @@
|
|
|
189
148
|
flex: 1;
|
|
190
149
|
display: flex;
|
|
191
150
|
align-items: center;
|
|
192
|
-
gap:
|
|
151
|
+
gap: 6px;
|
|
193
152
|
justify-content: center;
|
|
194
153
|
}
|
|
195
154
|
|
|
@@ -233,21 +192,18 @@
|
|
|
233
192
|
.mobile-inner {
|
|
234
193
|
display: flex;
|
|
235
194
|
flex-direction: column;
|
|
236
|
-
|
|
195
|
+
}
|
|
196
|
+
.mobile-content {
|
|
197
|
+
gap: 10px;
|
|
237
198
|
}
|
|
238
199
|
|
|
239
200
|
.mobile-content :global(.button) {
|
|
240
201
|
display: flex;
|
|
241
202
|
}
|
|
242
203
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
margin: 6px 4px;
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
/*
|
|
250
|
-
used to prevent the content from being hidden behind the header
|
|
204
|
+
/*
|
|
205
|
+
Scroll padding top is used to prevent the content from being hidden behind the header
|
|
206
|
+
https://developer.mozilla.org/en-US/docs/Web/CSS/scroll-padding-top
|
|
251
207
|
*/
|
|
252
208
|
:global(html) {
|
|
253
209
|
scroll-padding-top: calc(var(--header-height) + 20px);
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { Snippet } from 'svelte';
|
|
2
1
|
interface Props {
|
|
3
2
|
product: string;
|
|
4
3
|
instance?: string;
|
|
@@ -7,11 +6,9 @@ interface Props {
|
|
|
7
6
|
href?: string;
|
|
8
7
|
subName?: undefined | string;
|
|
9
8
|
darkToggle?: boolean;
|
|
10
|
-
center?: Snippet;
|
|
11
|
-
end?: Snippet;
|
|
9
|
+
center?: import('svelte').Snippet;
|
|
10
|
+
end?: import('svelte').Snippet;
|
|
12
11
|
max?: boolean;
|
|
13
|
-
logoAltText?: string;
|
|
14
|
-
menuLabel?: string;
|
|
15
12
|
}
|
|
16
13
|
declare const Header: import("svelte").Component<Props, {}, "">;
|
|
17
14
|
type Header = ReturnType<typeof Header>;
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
export { default as Accordion } from './DetailsAccordion/DetailsAccordion.svelte';
|
|
2
2
|
export { default as Header } from './Header/Header.svelte';
|
|
3
|
-
export { default as HeaderNavLink } from './Header/HeaderNavLink.svelte';
|
|
4
|
-
export { default as HeaderLanguageToggle } from './Header/HeaderLanguageToggle.svelte';
|
|
5
|
-
export { buildLocalizedUrl } from './Header/language.js';
|
|
6
|
-
export type { LanguageOption } from './Header/language.js';
|
|
7
3
|
export { default as Container } from './Container/Container.svelte';
|
|
8
4
|
export { default as Docs } from './Docs/Docs.svelte';
|
|
9
5
|
export { default as DocsImage } from './Docs/DocsImage.svelte';
|
|
@@ -12,17 +8,3 @@ export type { NavSectionConfig, NavConfig, NavPageConfig, NavFoldingSectionConfi
|
|
|
12
8
|
export { default as Footer } from './Footer/Footer.svelte';
|
|
13
9
|
export { default as FooterLinkList } from './Footer/FooterLinkList.svelte';
|
|
14
10
|
export { default as Document } from './Document/Document.svelte';
|
|
15
|
-
export { default as Hero } from './Hero/Hero.svelte';
|
|
16
|
-
export { default as FeatureSplit } from './FeatureSplit/FeatureSplit.svelte';
|
|
17
|
-
export { default as Testimonials } from './Testimonials/Testimonials.svelte';
|
|
18
|
-
export { default as FullTrialSignup } from './FullTrialSignup/FullTrialSignup.svelte';
|
|
19
|
-
export { default as SpotlightSplit } from './SpotlightSplit/SpotlightSplit.svelte';
|
|
20
|
-
export { default as Seal } from './Seal/Seal.svelte';
|
|
21
|
-
export { default as GdprSeal } from './Seal/GdprSeal.svelte';
|
|
22
|
-
export { default as CcpaSeal } from './Seal/CcpaSeal.svelte';
|
|
23
|
-
export { default as SsoSeal } from './Seal/SsoSeal.svelte';
|
|
24
|
-
export { default as IsoSeal } from './Seal/IsoSeal.svelte';
|
|
25
|
-
export { default as LogoStrip } from './LogoStrip/LogoStrip.svelte';
|
|
26
|
-
export { default as AllFeaturesAccordion } from './AllFeaturesAccordion/AllFeaturesAccordion.svelte';
|
|
27
|
-
export { default as AllFeaturesAccordionFeature } from './AllFeaturesAccordion/AllFeaturesAccordionFeature.svelte';
|
|
28
|
-
export { default as FAQ } from './FAQ/FAQ.svelte';
|
package/dist/marketing/index.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
export { default as Accordion } from './DetailsAccordion/DetailsAccordion.svelte';
|
|
2
2
|
export { default as Header } from './Header/Header.svelte';
|
|
3
|
-
export { default as HeaderNavLink } from './Header/HeaderNavLink.svelte';
|
|
4
|
-
export { default as HeaderLanguageToggle } from './Header/HeaderLanguageToggle.svelte';
|
|
5
|
-
export { buildLocalizedUrl } from './Header/language.js';
|
|
6
3
|
export { default as Container } from './Container/Container.svelte';
|
|
7
4
|
export { default as Docs } from './Docs/Docs.svelte';
|
|
8
5
|
export { default as DocsImage } from './Docs/DocsImage.svelte';
|
|
@@ -10,17 +7,3 @@ export { loadDocsPage } from './Docs/fulldocs.js';
|
|
|
10
7
|
export { default as Footer } from './Footer/Footer.svelte';
|
|
11
8
|
export { default as FooterLinkList } from './Footer/FooterLinkList.svelte';
|
|
12
9
|
export { default as Document } from './Document/Document.svelte';
|
|
13
|
-
export { default as Hero } from './Hero/Hero.svelte';
|
|
14
|
-
export { default as FeatureSplit } from './FeatureSplit/FeatureSplit.svelte';
|
|
15
|
-
export { default as Testimonials } from './Testimonials/Testimonials.svelte';
|
|
16
|
-
export { default as FullTrialSignup } from './FullTrialSignup/FullTrialSignup.svelte';
|
|
17
|
-
export { default as SpotlightSplit } from './SpotlightSplit/SpotlightSplit.svelte';
|
|
18
|
-
export { default as Seal } from './Seal/Seal.svelte';
|
|
19
|
-
export { default as GdprSeal } from './Seal/GdprSeal.svelte';
|
|
20
|
-
export { default as CcpaSeal } from './Seal/CcpaSeal.svelte';
|
|
21
|
-
export { default as SsoSeal } from './Seal/SsoSeal.svelte';
|
|
22
|
-
export { default as IsoSeal } from './Seal/IsoSeal.svelte';
|
|
23
|
-
export { default as LogoStrip } from './LogoStrip/LogoStrip.svelte';
|
|
24
|
-
export { default as AllFeaturesAccordion } from './AllFeaturesAccordion/AllFeaturesAccordion.svelte';
|
|
25
|
-
export { default as AllFeaturesAccordionFeature } from './AllFeaturesAccordion/AllFeaturesAccordionFeature.svelte';
|
|
26
|
-
export { default as FAQ } from './FAQ/FAQ.svelte';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export declare const SOCIAL_LINKS: {
|
|
2
2
|
readonly x: "https://x.com/HyvorHQ";
|
|
3
|
-
readonly
|
|
3
|
+
readonly blueksy: "https://bsky.app/profile/hyvor.com";
|
|
4
4
|
readonly discord: "https://discord.com/invite/2WRJxQB";
|
|
5
5
|
readonly github: "https://github.com/hyvor";
|
|
6
6
|
readonly youtube: "https://www.youtube.com/@HYVOR";
|
package/dist/marketing/social.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export const SOCIAL_LINKS = {
|
|
2
2
|
x: 'https://x.com/HyvorHQ',
|
|
3
|
-
|
|
3
|
+
blueksy: 'https://bsky.app/profile/hyvor.com',
|
|
4
4
|
discord: 'https://discord.com/invite/2WRJxQB',
|
|
5
5
|
github: 'https://github.com/hyvor',
|
|
6
6
|
youtube: 'https://www.youtube.com/@HYVOR',
|
package/package.json
CHANGED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props {
|
|
3
|
-
children?: import('svelte').Snippet;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
let { children }: Props = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<div class="button-group">
|
|
10
|
-
{@render children?.()}
|
|
11
|
-
</div>
|
|
12
|
-
|
|
13
|
-
<style>
|
|
14
|
-
.button-group {
|
|
15
|
-
display: inline-flex;
|
|
16
|
-
gap: 6px;
|
|
17
|
-
}
|
|
18
|
-
</style>
|
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import IconCaretDown from '@hyvor/icons/IconCaretDown';
|
|
3
|
-
import type { Component } from 'svelte';
|
|
4
|
-
import Feature from './AllFeaturesAccordionFeature.svelte';
|
|
5
|
-
|
|
6
|
-
interface FeatureItem {
|
|
7
|
-
icon: Component;
|
|
8
|
-
title: string;
|
|
9
|
-
description: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
interface Category {
|
|
13
|
-
label: string;
|
|
14
|
-
icon: Component;
|
|
15
|
-
color?: string;
|
|
16
|
-
features: FeatureItem[];
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
interface Props {
|
|
20
|
-
title?: string;
|
|
21
|
-
description?: string;
|
|
22
|
-
categories: Category[];
|
|
23
|
-
defaultOpenIndex?: number;
|
|
24
|
-
accentColor?: string;
|
|
25
|
-
accentColorDark?: string;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
let {
|
|
29
|
-
title = "And There's More...",
|
|
30
|
-
description = '',
|
|
31
|
-
categories,
|
|
32
|
-
defaultOpenIndex = 0,
|
|
33
|
-
accentColor,
|
|
34
|
-
accentColorDark
|
|
35
|
-
}: Props = $props();
|
|
36
|
-
|
|
37
|
-
let openIndex = $state(defaultOpenIndex);
|
|
38
|
-
|
|
39
|
-
function toggle(i: number) {
|
|
40
|
-
openIndex = openIndex === i ? -1 : i;
|
|
41
|
-
}
|
|
42
|
-
</script>
|
|
43
|
-
|
|
44
|
-
<section
|
|
45
|
-
class="hds-all-features-accordion hds-container"
|
|
46
|
-
style:--afa-accent={accentColor}
|
|
47
|
-
style:--afa-accent-dark={accentColorDark}
|
|
48
|
-
>
|
|
49
|
-
<div class="section-header">
|
|
50
|
-
<h2>{title}</h2>
|
|
51
|
-
{#if description}
|
|
52
|
-
<p>{description}</p>
|
|
53
|
-
{/if}
|
|
54
|
-
</div>
|
|
55
|
-
|
|
56
|
-
<div class="accordion">
|
|
57
|
-
{#each categories as cat, i}
|
|
58
|
-
{@const CatIcon = cat.icon}
|
|
59
|
-
{@const catColor = cat.color || 'var(--accent)'}
|
|
60
|
-
<div class="accordion-item" class:open={openIndex === i}>
|
|
61
|
-
<h3 class="accordion-heading">
|
|
62
|
-
<button
|
|
63
|
-
class="accordion-trigger"
|
|
64
|
-
id="hds-accordion-trigger-{i}"
|
|
65
|
-
onclick={() => toggle(i)}
|
|
66
|
-
aria-expanded={openIndex === i}
|
|
67
|
-
aria-controls="hds-accordion-panel-{i}"
|
|
68
|
-
style="--cat-color: {catColor}"
|
|
69
|
-
>
|
|
70
|
-
<span class="cat-icon" aria-hidden="true">
|
|
71
|
-
<CatIcon size={18} />
|
|
72
|
-
</span>
|
|
73
|
-
<span class="cat-label">{cat.label}</span>
|
|
74
|
-
<span class="cat-count">{cat.features.length} features</span>
|
|
75
|
-
<span class="chevron" class:rotated={openIndex === i} aria-hidden="true">
|
|
76
|
-
<IconCaretDown size={16} />
|
|
77
|
-
</span>
|
|
78
|
-
</button>
|
|
79
|
-
</h3>
|
|
80
|
-
|
|
81
|
-
<div
|
|
82
|
-
class="accordion-body"
|
|
83
|
-
class:open={openIndex === i}
|
|
84
|
-
role="region"
|
|
85
|
-
id="hds-accordion-panel-{i}"
|
|
86
|
-
aria-labelledby="hds-accordion-trigger-{i}"
|
|
87
|
-
>
|
|
88
|
-
<div class="accordion-body-inner">
|
|
89
|
-
<div class="accordion-content">
|
|
90
|
-
<ul class="features-grid">
|
|
91
|
-
{#each cat.features as feat}
|
|
92
|
-
<Feature
|
|
93
|
-
icon={feat.icon}
|
|
94
|
-
title={feat.title}
|
|
95
|
-
description={feat.description}
|
|
96
|
-
color={catColor}
|
|
97
|
-
/>
|
|
98
|
-
{/each}
|
|
99
|
-
</ul>
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
</div>
|
|
103
|
-
</div>
|
|
104
|
-
{/each}
|
|
105
|
-
</div>
|
|
106
|
-
</section>
|
|
107
|
-
|
|
108
|
-
<style>
|
|
109
|
-
.hds-all-features-accordion {
|
|
110
|
-
padding: 80px 0;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
.section-header {
|
|
114
|
-
text-align: center;
|
|
115
|
-
margin-bottom: 48px;
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
.section-header h2 {
|
|
119
|
-
font-size: 32px;
|
|
120
|
-
font-weight: 700;
|
|
121
|
-
margin: 0 0 6px;
|
|
122
|
-
font-family: var(--font-serif);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
.section-header p {
|
|
126
|
-
font-size: 1rem;
|
|
127
|
-
color: var(--text-light);
|
|
128
|
-
margin: 0;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
.accordion {
|
|
132
|
-
display: flex;
|
|
133
|
-
flex-direction: column;
|
|
134
|
-
gap: 4px;
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
.accordion-item {
|
|
138
|
-
border-radius: 16px;
|
|
139
|
-
transition: background 0.2s ease;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
.accordion-item.open {
|
|
143
|
-
background: color-mix(in srgb, var(--afa-accent, var(--accent)) 6%, transparent);
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
:global(:root.dark) .accordion-item.open {
|
|
147
|
-
background: color-mix(
|
|
148
|
-
in srgb,
|
|
149
|
-
var(--afa-accent-dark, var(--afa-accent, var(--accent))) 6%,
|
|
150
|
-
transparent
|
|
151
|
-
);
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
.accordion-heading {
|
|
155
|
-
margin: 0;
|
|
156
|
-
font-size: inherit;
|
|
157
|
-
font-weight: inherit;
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
.accordion-trigger {
|
|
161
|
-
width: 100%;
|
|
162
|
-
display: flex;
|
|
163
|
-
align-items: center;
|
|
164
|
-
gap: 14px;
|
|
165
|
-
padding: 18px 20px;
|
|
166
|
-
background: none;
|
|
167
|
-
border: none;
|
|
168
|
-
border-radius: inherit;
|
|
169
|
-
cursor: pointer;
|
|
170
|
-
text-align: left;
|
|
171
|
-
transition: background 0.15s;
|
|
172
|
-
color: var(--text);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
.accordion-item:not(.open) .accordion-trigger:hover {
|
|
176
|
-
background: var(--hover);
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
.cat-icon {
|
|
180
|
-
display: flex;
|
|
181
|
-
align-items: center;
|
|
182
|
-
justify-content: center;
|
|
183
|
-
width: 34px;
|
|
184
|
-
height: 34px;
|
|
185
|
-
border-radius: 10px;
|
|
186
|
-
color: var(--cat-color);
|
|
187
|
-
background: color-mix(in srgb, var(--cat-color) 16%, transparent);
|
|
188
|
-
flex-shrink: 0;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
.cat-label {
|
|
192
|
-
font-size: 16px;
|
|
193
|
-
font-weight: 600;
|
|
194
|
-
flex: 1;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.cat-count {
|
|
198
|
-
font-size: 13px;
|
|
199
|
-
color: var(--text-light);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
.chevron {
|
|
203
|
-
display: flex;
|
|
204
|
-
align-items: center;
|
|
205
|
-
color: var(--text-light);
|
|
206
|
-
transition: transform 0.2s;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
.chevron.rotated {
|
|
210
|
-
transform: rotate(180deg);
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/* CSS grid row trick: content stays in DOM for SEO, height animates via grid */
|
|
214
|
-
.accordion-body {
|
|
215
|
-
display: grid;
|
|
216
|
-
grid-template-rows: 0fr;
|
|
217
|
-
transition: grid-template-rows 0.22s ease;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
.accordion-body.open {
|
|
221
|
-
grid-template-rows: 1fr;
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
.accordion-body-inner {
|
|
225
|
-
overflow: hidden;
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
.accordion-content {
|
|
229
|
-
padding: 8px 20px 28px;
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
.features-grid {
|
|
233
|
-
display: grid;
|
|
234
|
-
grid-template-columns: repeat(3, 1fr);
|
|
235
|
-
gap: 28px 20px;
|
|
236
|
-
margin: 0;
|
|
237
|
-
padding: 0;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
/* Override AllFeaturesAccordionFeature's width since we're using grid now */
|
|
241
|
-
/* TODO */
|
|
242
|
-
.features-grid :global(.feature) {
|
|
243
|
-
width: auto;
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
@media (max-width: 768px) {
|
|
247
|
-
.features-grid {
|
|
248
|
-
grid-template-columns: 1fr;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
</style>
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import type { Component } from 'svelte';
|
|
2
|
-
interface FeatureItem {
|
|
3
|
-
icon: Component;
|
|
4
|
-
title: string;
|
|
5
|
-
description: string;
|
|
6
|
-
}
|
|
7
|
-
interface Category {
|
|
8
|
-
label: string;
|
|
9
|
-
icon: Component;
|
|
10
|
-
color?: string;
|
|
11
|
-
features: FeatureItem[];
|
|
12
|
-
}
|
|
13
|
-
interface Props {
|
|
14
|
-
title?: string;
|
|
15
|
-
description?: string;
|
|
16
|
-
categories: Category[];
|
|
17
|
-
defaultOpenIndex?: number;
|
|
18
|
-
accentColor?: string;
|
|
19
|
-
accentColorDark?: string;
|
|
20
|
-
}
|
|
21
|
-
declare const AllFeaturesAccordion: Component<Props, {}, "">;
|
|
22
|
-
type AllFeaturesAccordion = ReturnType<typeof AllFeaturesAccordion>;
|
|
23
|
-
export default AllFeaturesAccordion;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Component } from 'svelte';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
icon: Component;
|
|
6
|
-
title: string;
|
|
7
|
-
description: string;
|
|
8
|
-
// any CSS color, e.g. 'var(--green)' or '#4b874b' — defaults to the
|
|
9
|
-
// theme accent so this works out of the box on any product
|
|
10
|
-
color?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
let { icon, title, description, color = 'var(--accent)' }: Props = $props();
|
|
14
|
-
|
|
15
|
-
const SvelteComponent = $derived(icon);
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<li class="feature">
|
|
19
|
-
<div class="icon-bg" style:color aria-hidden="true">
|
|
20
|
-
<SvelteComponent size={52} />
|
|
21
|
-
</div>
|
|
22
|
-
<div class="content">
|
|
23
|
-
<h4 class="title">{title}</h4>
|
|
24
|
-
<p class="description">{description}</p>
|
|
25
|
-
</div>
|
|
26
|
-
</li>
|
|
27
|
-
|
|
28
|
-
<style>
|
|
29
|
-
.feature {
|
|
30
|
-
position: relative;
|
|
31
|
-
width: calc(33.33% - 15px);
|
|
32
|
-
list-style: none;
|
|
33
|
-
overflow: hidden;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
.content {
|
|
37
|
-
position: relative;
|
|
38
|
-
z-index: 1;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/* a large, faint watermark of the feature's own icon, sitting behind the
|
|
42
|
-
title/description rather than as a small marker above them */
|
|
43
|
-
.icon-bg {
|
|
44
|
-
position: absolute;
|
|
45
|
-
top: 50%;
|
|
46
|
-
right: -8px;
|
|
47
|
-
transform: translateY(-50%);
|
|
48
|
-
z-index: 0;
|
|
49
|
-
opacity: 0.14;
|
|
50
|
-
pointer-events: none;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
.title {
|
|
54
|
-
font-weight: 600;
|
|
55
|
-
font-size: 20px;
|
|
56
|
-
margin: 0;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
.description {
|
|
60
|
-
font-size: 16px;
|
|
61
|
-
margin: 10px 0 0;
|
|
62
|
-
color: var(--text-light);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
@media (max-width: 992px) {
|
|
66
|
-
.feature {
|
|
67
|
-
width: 100%;
|
|
68
|
-
text-align: center;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.icon-bg {
|
|
72
|
-
display: none;
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
</style>
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { Component } from 'svelte';
|
|
2
|
-
interface Props {
|
|
3
|
-
icon: Component;
|
|
4
|
-
title: string;
|
|
5
|
-
description: string;
|
|
6
|
-
color?: string;
|
|
7
|
-
}
|
|
8
|
-
declare const AllFeaturesAccordionFeature: Component<Props, {}, "">;
|
|
9
|
-
type AllFeaturesAccordionFeature = ReturnType<typeof AllFeaturesAccordionFeature>;
|
|
10
|
-
export default AllFeaturesAccordionFeature;
|