@hyvor/design 1.0.13 → 1.1.1
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/components/BoxShadowPicker/BoxShadowPicker.svelte +148 -0
- package/dist/components/BoxShadowPicker/BoxShadowPicker.svelte.d.ts +10 -0
- package/dist/components/BoxShadowPicker/ShadowPreviewBox.svelte +25 -0
- package/dist/components/BoxShadowPicker/ShadowPreviewBox.svelte.d.ts +7 -0
- package/dist/components/ColorPicker/ColorPicker.svelte +10 -2
- package/dist/components/ColorPicker/ColorPicker.svelte.d.ts +3 -0
- package/dist/components/Dark/DarkProvider.svelte +1 -1
- package/dist/components/HyvorBar/BarProducts.svelte +16 -7
- package/dist/components/HyvorBar/BarSupport.svelte +28 -16
- package/dist/components/HyvorBar/HyvorBar.svelte +8 -18
- package/dist/components/HyvorBar/HyvorBar.svelte.d.ts +2 -2
- package/dist/components/HyvorBar/bar.d.ts +2 -3
- package/dist/components/Internationalization/InternationalizationProvider.svelte +3 -2
- package/dist/components/Internationalization/InternationalizationProvider.svelte.d.ts +1 -0
- package/dist/components/Internationalization/LanguageToggle.svelte +19 -8
- package/dist/components/Internationalization/LanguageToggle.svelte.d.ts +1 -0
- package/dist/components/Internationalization/i18n.d.ts +9 -4
- package/dist/components/Internationalization/i18n.js +53 -10
- package/dist/components/NavLink/NavLink.svelte +4 -0
- package/dist/components/Slider/Slider.svelte +13 -2
- package/dist/components/Slider/Slider.svelte.d.ts +2 -0
- package/dist/components/Usage/Usage.svelte +126 -0
- package/dist/components/Usage/Usage.svelte.d.ts +12 -0
- package/dist/components/index.d.ts +3 -0
- package/dist/components/index.js +3 -0
- package/dist/marketing/Footer/Footer.svelte +14 -18
- package/dist/marketing/Footer/Footer.svelte.d.ts +3 -3
- package/dist/marketing/Header/Header.svelte +3 -1
- package/dist/marketing/Header/Header.svelte.d.ts +1 -0
- package/dist/marketing/social.d.ts +9 -0
- package/dist/marketing/social.js +8 -0
- package/dist/stores/dark.d.ts +1 -0
- package/dist/stores/dark.js +4 -3
- package/dist/variables.scss +1 -1
- package/package.json +2 -2
- package/dist/marketing/Logo/LogoBlogs.svelte +0 -46
- package/dist/marketing/Logo/LogoBlogs.svelte.d.ts +0 -6
- package/dist/marketing/Logo/LogoCore.svelte +0 -46
- package/dist/marketing/Logo/LogoCore.svelte.d.ts +0 -6
- package/dist/marketing/Logo/LogoTalk.svelte +0 -32
- package/dist/marketing/Logo/LogoTalk.svelte.d.ts +0 -6
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { deepmerge } from 'deepmerge-ts';
|
|
2
|
-
import { writable, derived } from 'svelte/store';
|
|
2
|
+
import { writable, derived, get } from 'svelte/store';
|
|
3
3
|
import { t } from './t.js';
|
|
4
4
|
import T from './T.svelte';
|
|
5
|
+
export const LOCALE_LOCAL_STORAGE_KEY = 'hds-language';
|
|
5
6
|
export class InternationalizationService {
|
|
6
7
|
languages = [];
|
|
7
8
|
locale;
|
|
@@ -9,7 +10,7 @@ export class InternationalizationService {
|
|
|
9
10
|
strings = writable({});
|
|
10
11
|
stringsCache = new Map();
|
|
11
12
|
defaultStrings;
|
|
12
|
-
constructor(languages) {
|
|
13
|
+
constructor(languages, forceLanguage) {
|
|
13
14
|
const defaultLanguage = languages.find((l) => l.default);
|
|
14
15
|
if (!defaultLanguage) {
|
|
15
16
|
throw new Error('Default language not found');
|
|
@@ -26,6 +27,28 @@ export class InternationalizationService {
|
|
|
26
27
|
for (const language of languages) {
|
|
27
28
|
this.register(language);
|
|
28
29
|
}
|
|
30
|
+
const localeStorageLocale = InternationalizationService.getLocaleFromLocalStorage();
|
|
31
|
+
const browserLocale = InternationalizationService.getClosestLanguageCode(navigator.language, this.languages.map((l) => l.code));
|
|
32
|
+
if (forceLanguage) {
|
|
33
|
+
this.setLocale(forceLanguage);
|
|
34
|
+
}
|
|
35
|
+
else if (localeStorageLocale) {
|
|
36
|
+
this.setLocale(localeStorageLocale);
|
|
37
|
+
}
|
|
38
|
+
else if (browserLocale) {
|
|
39
|
+
this.setLocale(browserLocale);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
static getLocaleFromLocalStorage() {
|
|
43
|
+
if (typeof window !== 'undefined') {
|
|
44
|
+
return localStorage.getItem(LOCALE_LOCAL_STORAGE_KEY);
|
|
45
|
+
}
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
setLocaleOnLocalStorage(code) {
|
|
49
|
+
if (typeof window !== 'undefined') {
|
|
50
|
+
localStorage.setItem(LOCALE_LOCAL_STORAGE_KEY, code);
|
|
51
|
+
}
|
|
29
52
|
}
|
|
30
53
|
setStrings(code) {
|
|
31
54
|
const defaultStrings = this.defaultStrings;
|
|
@@ -33,20 +56,28 @@ export class InternationalizationService {
|
|
|
33
56
|
const merged = deepmerge(defaultStrings, strings);
|
|
34
57
|
this.strings.set(merged);
|
|
35
58
|
}
|
|
36
|
-
setLocale(code) {
|
|
59
|
+
async setLocale(code) {
|
|
37
60
|
if (this.stringsCache.has(code)) {
|
|
38
61
|
this.setStrings(code);
|
|
39
62
|
this.locale.set(code);
|
|
40
63
|
}
|
|
41
64
|
else {
|
|
42
|
-
this.languageByCode(code)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
65
|
+
const language = this.languageByCode(code);
|
|
66
|
+
if (!language) {
|
|
67
|
+
throw new Error(`Language with code ${code} not found`);
|
|
68
|
+
}
|
|
69
|
+
let strings = language.strings;
|
|
70
|
+
if (!strings) {
|
|
71
|
+
strings = await language.loader();
|
|
72
|
+
}
|
|
73
|
+
this.stringsCache.set(code, strings);
|
|
74
|
+
this.setStrings(code);
|
|
75
|
+
this.locale.set(code);
|
|
49
76
|
}
|
|
77
|
+
this.setLocaleOnLocalStorage(code);
|
|
78
|
+
}
|
|
79
|
+
getLocale() {
|
|
80
|
+
return get(this.locale);
|
|
50
81
|
}
|
|
51
82
|
register(language) {
|
|
52
83
|
this.languages.push({
|
|
@@ -65,6 +96,18 @@ export class InternationalizationService {
|
|
|
65
96
|
t(key, params = {}) {
|
|
66
97
|
return t(key, params, this);
|
|
67
98
|
}
|
|
99
|
+
static getClosestLanguageCode(code, availableCodes) {
|
|
100
|
+
if (availableCodes.includes(code)) {
|
|
101
|
+
return code;
|
|
102
|
+
}
|
|
103
|
+
const codeLanguagePart = code.split('-')[0];
|
|
104
|
+
for (const availableCode of availableCodes) {
|
|
105
|
+
if (availableCode.split('-')[0] === codeLanguagePart) {
|
|
106
|
+
return availableCode;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
68
111
|
T = T;
|
|
69
112
|
}
|
|
70
113
|
export function getStringByKey(messages, key) {
|
|
@@ -8,9 +8,19 @@
|
|
|
8
8
|
step?: number;
|
|
9
9
|
// export let disabled = false;
|
|
10
10
|
dots?: boolean;
|
|
11
|
+
onchange?: (value: number) => void;
|
|
12
|
+
valueFormat?: (value: number) => string;
|
|
11
13
|
}
|
|
12
14
|
|
|
13
|
-
let {
|
|
15
|
+
let {
|
|
16
|
+
min,
|
|
17
|
+
max,
|
|
18
|
+
value = $bindable(),
|
|
19
|
+
step = 1,
|
|
20
|
+
dots = false,
|
|
21
|
+
onchange,
|
|
22
|
+
valueFormat = (val) => val.toString()
|
|
23
|
+
}: Props = $props();
|
|
14
24
|
|
|
15
25
|
const dispatch = createEventDispatcher<{
|
|
16
26
|
change: number;
|
|
@@ -75,6 +85,7 @@
|
|
|
75
85
|
const newValue = min + (x / width) * (max - min);
|
|
76
86
|
value = toStep(newValue);
|
|
77
87
|
dispatch('change', value);
|
|
88
|
+
onchange?.(value);
|
|
78
89
|
}
|
|
79
90
|
</script>
|
|
80
91
|
|
|
@@ -90,7 +101,7 @@
|
|
|
90
101
|
<div class="progress" style="width: {progress}%"></div>
|
|
91
102
|
<button class="handle" style="left: {progress}%">
|
|
92
103
|
<span class="tip">
|
|
93
|
-
{value}
|
|
104
|
+
{valueFormat(value)}
|
|
94
105
|
</span>
|
|
95
106
|
</button>
|
|
96
107
|
|
|
@@ -4,6 +4,8 @@ interface Props {
|
|
|
4
4
|
value: number;
|
|
5
5
|
step?: number;
|
|
6
6
|
dots?: boolean;
|
|
7
|
+
onchange?: (value: number) => void;
|
|
8
|
+
valueFormat?: (value: number) => string;
|
|
7
9
|
}
|
|
8
10
|
interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> {
|
|
9
11
|
new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & {
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount } from 'svelte';
|
|
3
|
+
// import byteFormatter from '../../../lib/helper/byte-formatter';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
name: string;
|
|
7
|
+
current: number;
|
|
8
|
+
limit: number;
|
|
9
|
+
bytes?: boolean;
|
|
10
|
+
warningPercentage?: number;
|
|
11
|
+
dangerPercentage?: number;
|
|
12
|
+
notIncludedText?: string;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
let {
|
|
16
|
+
name,
|
|
17
|
+
current,
|
|
18
|
+
limit,
|
|
19
|
+
bytes = false,
|
|
20
|
+
warningPercentage = 85,
|
|
21
|
+
dangerPercentage = 95,
|
|
22
|
+
notIncludedText = 'Your license does not include this feature.'
|
|
23
|
+
}: Props = $props();
|
|
24
|
+
|
|
25
|
+
let width = $state('0%');
|
|
26
|
+
let percentage = $derived(Math.min(limit === 0 ? 100 : (current / limit) * 100, 100));
|
|
27
|
+
|
|
28
|
+
onMount(() => {
|
|
29
|
+
setTimeout(() => {
|
|
30
|
+
width = percentage + '%';
|
|
31
|
+
}, 200);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
function byteFormatter(bytes: number) {
|
|
35
|
+
const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
36
|
+
if (bytes == 0) return '0 Bytes';
|
|
37
|
+
const i = parseInt(String(Math.floor(Math.log(bytes) / Math.log(1000))));
|
|
38
|
+
return Math.round(bytes / Math.pow(1000, i)) + ' ' + sizes[i];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function getReadableValue(num: number) {
|
|
42
|
+
if (bytes) {
|
|
43
|
+
return byteFormatter(num);
|
|
44
|
+
}
|
|
45
|
+
return num.toLocaleString();
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
let color = $derived.by(() => {
|
|
49
|
+
if (percentage >= dangerPercentage) {
|
|
50
|
+
return 'var(--red-dark)';
|
|
51
|
+
} else if (percentage >= warningPercentage) {
|
|
52
|
+
return 'var(--orange-dark)';
|
|
53
|
+
} else {
|
|
54
|
+
return 'var(--accent)';
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
</script>
|
|
58
|
+
|
|
59
|
+
<div class="usage-bar">
|
|
60
|
+
<div class="usage-bar-top">
|
|
61
|
+
<div class="usage-name">
|
|
62
|
+
{name}
|
|
63
|
+
</div>
|
|
64
|
+
{#if limit > 0}
|
|
65
|
+
<div class="usage-number">
|
|
66
|
+
<span class="usage-now" style:color={color === 'var(--accent)' ? 'var(--text)' : color}
|
|
67
|
+
>{getReadableValue(current)}</span
|
|
68
|
+
>
|
|
69
|
+
<span class="usage-full">/ {getReadableValue(limit)}</span>
|
|
70
|
+
</div>
|
|
71
|
+
{/if}
|
|
72
|
+
</div>
|
|
73
|
+
|
|
74
|
+
{#if limit === 0}
|
|
75
|
+
<div class="feature-not-included">{notIncludedText}</div>
|
|
76
|
+
{:else}
|
|
77
|
+
<div class="usage-bar-bar">
|
|
78
|
+
<div class="usage-bar-fill" style:width style:background={color}></div>
|
|
79
|
+
</div>
|
|
80
|
+
{/if}
|
|
81
|
+
</div>
|
|
82
|
+
|
|
83
|
+
<style>.usage-bar-top {
|
|
84
|
+
display: flex;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.usage-name {
|
|
88
|
+
flex: 1;
|
|
89
|
+
font-size: 14px;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
.usage-now {
|
|
93
|
+
margin-right: 4px;
|
|
94
|
+
font-weight: 600;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.usage-full {
|
|
98
|
+
color: var(--text-light);
|
|
99
|
+
font-size: 12px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.usage-bar-bar {
|
|
103
|
+
margin: 6px 0 15px;
|
|
104
|
+
width: 100%;
|
|
105
|
+
height: 15px;
|
|
106
|
+
background: var(--accent-light);
|
|
107
|
+
border-radius: 20px;
|
|
108
|
+
position: relative;
|
|
109
|
+
overflow: hidden;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
.usage-bar-fill {
|
|
113
|
+
position: absolute;
|
|
114
|
+
left: 0;
|
|
115
|
+
top: 0;
|
|
116
|
+
height: 100%;
|
|
117
|
+
background: var(--accent);
|
|
118
|
+
border-radius: 20px;
|
|
119
|
+
transition: 0.3s width ease-out;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
.feature-not-included {
|
|
123
|
+
color: var(--text-light);
|
|
124
|
+
font-size: 12px;
|
|
125
|
+
margin: 5px 0 15px;
|
|
126
|
+
}</style>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
interface Props {
|
|
2
|
+
name: string;
|
|
3
|
+
current: number;
|
|
4
|
+
limit: number;
|
|
5
|
+
bytes?: boolean;
|
|
6
|
+
warningPercentage?: number;
|
|
7
|
+
dangerPercentage?: number;
|
|
8
|
+
notIncludedText?: string;
|
|
9
|
+
}
|
|
10
|
+
declare const Usage: import("svelte").Component<Props, {}, "">;
|
|
11
|
+
type Usage = ReturnType<typeof Usage>;
|
|
12
|
+
export default Usage;
|
|
@@ -7,10 +7,12 @@ export { default as Base } from './Base/Base.svelte';
|
|
|
7
7
|
export { default as Box } from './Box/Box.svelte';
|
|
8
8
|
export { default as Button } from './Button/Button.svelte';
|
|
9
9
|
export { default as ButtonGroup } from './Button/ButtonGroup.svelte';
|
|
10
|
+
export { default as BoxShadowPicker } from './BoxShadowPicker/BoxShadowPicker.svelte';
|
|
10
11
|
export { default as Callout } from './Callout/Callout.svelte';
|
|
11
12
|
export { default as Checkbox } from './Checkbox/Checkbox.svelte';
|
|
12
13
|
export { default as CodeBlock } from './CodeBlock/CodeBlock.svelte';
|
|
13
14
|
export { default as ColorPicker } from './ColorPicker/ColorPicker.svelte';
|
|
15
|
+
export { default as DarkProvider } from './Dark/DarkProvider.svelte';
|
|
14
16
|
export { default as DarkToggle } from './Dark/DarkToggle.svelte';
|
|
15
17
|
export { default as Dropdown } from './Dropdown/Dropdown.svelte';
|
|
16
18
|
export { default as Divider } from './Divider/Divider.svelte';
|
|
@@ -43,6 +45,7 @@ export { default as Text } from './Text/Text.svelte';
|
|
|
43
45
|
export { default as TextInput } from './TextInput/TextInput.svelte';
|
|
44
46
|
export { default as toast } from './Toast/toast.js';
|
|
45
47
|
export { default as Tooltip } from './Tooltip/Tooltip.svelte';
|
|
48
|
+
export { default as Usage } from './Usage/Usage.svelte';
|
|
46
49
|
export { default as IconMessage } from './IconMessage/IconMessage.svelte';
|
|
47
50
|
export { clickOutside } from './directives/clickOutside.js';
|
|
48
51
|
export { default as InternationalizationProvider } from './Internationalization/InternationalizationProvider.svelte';
|
package/dist/components/index.js
CHANGED
|
@@ -7,10 +7,12 @@ export { default as Base } from './Base/Base.svelte';
|
|
|
7
7
|
export { default as Box } from './Box/Box.svelte';
|
|
8
8
|
export { default as Button } from './Button/Button.svelte';
|
|
9
9
|
export { default as ButtonGroup } from './Button/ButtonGroup.svelte';
|
|
10
|
+
export { default as BoxShadowPicker } from './BoxShadowPicker/BoxShadowPicker.svelte';
|
|
10
11
|
export { default as Callout } from './Callout/Callout.svelte';
|
|
11
12
|
export { default as Checkbox } from './Checkbox/Checkbox.svelte';
|
|
12
13
|
export { default as CodeBlock } from './CodeBlock/CodeBlock.svelte';
|
|
13
14
|
export { default as ColorPicker } from './ColorPicker/ColorPicker.svelte';
|
|
15
|
+
export { default as DarkProvider } from './Dark/DarkProvider.svelte';
|
|
14
16
|
export { default as DarkToggle } from './Dark/DarkToggle.svelte';
|
|
15
17
|
export { default as Dropdown } from './Dropdown/Dropdown.svelte';
|
|
16
18
|
export { default as Divider } from './Divider/Divider.svelte';
|
|
@@ -43,6 +45,7 @@ export { default as Text } from './Text/Text.svelte';
|
|
|
43
45
|
export { default as TextInput } from './TextInput/TextInput.svelte';
|
|
44
46
|
export { default as toast } from './Toast/toast.js';
|
|
45
47
|
export { default as Tooltip } from './Tooltip/Tooltip.svelte';
|
|
48
|
+
export { default as Usage } from './Usage/Usage.svelte';
|
|
46
49
|
export { default as IconMessage } from './IconMessage/IconMessage.svelte';
|
|
47
50
|
// directives
|
|
48
51
|
export { clickOutside } from './directives/clickOutside.js';
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Container from '../Container/Container.svelte';
|
|
3
|
-
|
|
4
3
|
import IconCopy from '@hyvor/icons/IconCopy';
|
|
5
4
|
import IconDiscord from '@hyvor/icons/IconDiscord';
|
|
6
5
|
import IconEnvelope from '@hyvor/icons/IconEnvelope';
|
|
@@ -8,39 +7,34 @@
|
|
|
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
|
-
|
|
12
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';
|
|
15
|
+
import { SOCIAL_LINKS, type Socials } from '../social.js';
|
|
16
16
|
|
|
17
17
|
const year = new Date().getFullYear();
|
|
18
18
|
|
|
19
19
|
interface Props {
|
|
20
20
|
email?: string | null;
|
|
21
|
-
social?:
|
|
22
|
-
emailCopied?: boolean;
|
|
21
|
+
social?: Partial<Socials>;
|
|
23
22
|
center?: import('svelte').Snippet;
|
|
24
23
|
}
|
|
25
24
|
|
|
26
25
|
let {
|
|
27
26
|
email = null,
|
|
28
27
|
social = $bindable({} as Record<string, string | null>),
|
|
29
|
-
emailCopied = $bindable(false),
|
|
30
28
|
center
|
|
31
29
|
}: Props = $props();
|
|
32
30
|
|
|
33
31
|
social = {
|
|
34
|
-
...
|
|
35
|
-
x: null,
|
|
36
|
-
discord: 'https://discord.com/invite/2WRJxQB',
|
|
37
|
-
github: 'https://github.com/hyvor',
|
|
38
|
-
youtube: 'https://www.youtube.com/@HYVOR',
|
|
39
|
-
linkedin: 'https://www.linkedin.com/company/30240435'
|
|
40
|
-
},
|
|
32
|
+
...SOCIAL_LINKS,
|
|
41
33
|
...social
|
|
42
34
|
};
|
|
43
35
|
|
|
36
|
+
let emailCopied = $state(false);
|
|
37
|
+
|
|
44
38
|
function handleCopy() {
|
|
45
39
|
navigator.clipboard.writeText(email!);
|
|
46
40
|
emailCopied = true;
|
|
@@ -79,25 +73,27 @@
|
|
|
79
73
|
{#if social.github}
|
|
80
74
|
<a href={social.github} target="_blank" rel="nofollow"><IconGithub /></a>
|
|
81
75
|
{/if}
|
|
82
|
-
{#if social.x}
|
|
83
|
-
<a href={social.x} target="_blank" rel="nofollow"><IconTwitterX /></a>
|
|
84
|
-
{/if}
|
|
85
76
|
{#if social.discord}
|
|
86
77
|
<a href={social.discord} target="_blank" rel="nofollow"><IconDiscord /></a>
|
|
87
78
|
{/if}
|
|
79
|
+
{#if social.blueksy}
|
|
80
|
+
<a href={social.blueksy} target="_blank" rel="nofollow"><IconBluesky /></a>
|
|
81
|
+
{/if}
|
|
82
|
+
{#if social.x}
|
|
83
|
+
<a href={social.x} target="_blank" rel="nofollow"><IconTwitterX /></a>
|
|
84
|
+
{/if}
|
|
88
85
|
{#if social.youtube}
|
|
89
86
|
<a href={social.youtube} target="_blank" rel="nofollow"><IconYoutube /></a>
|
|
90
87
|
{/if}
|
|
91
88
|
{#if social.linkedin}
|
|
92
|
-
<a href={social.linkedin} target="_blank" rel="nofollow"><IconLinkedin /></a
|
|
93
|
-
>
|
|
89
|
+
<a href={social.linkedin} target="_blank" rel="nofollow"><IconLinkedin /></a>
|
|
94
90
|
{/if}
|
|
95
91
|
</div>
|
|
96
92
|
</div>
|
|
97
93
|
|
|
98
94
|
<div class="footer-top-right">
|
|
99
95
|
<span class="language-toggle-wrap">
|
|
100
|
-
<LanguageToggle />
|
|
96
|
+
<LanguageToggle align="end" position="top" staticPage />
|
|
101
97
|
</span>
|
|
102
98
|
</div>
|
|
103
99
|
</div>
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import { type Socials } from '../social.js';
|
|
1
2
|
interface Props {
|
|
2
3
|
email?: string | null;
|
|
3
|
-
social?:
|
|
4
|
-
emailCopied?: boolean;
|
|
4
|
+
social?: Partial<Socials>;
|
|
5
5
|
center?: import('svelte').Snippet;
|
|
6
6
|
}
|
|
7
|
-
declare const Footer: import("svelte").Component<Props, {}, "social"
|
|
7
|
+
declare const Footer: import("svelte").Component<Props, {}, "social">;
|
|
8
8
|
type Footer = ReturnType<typeof Footer>;
|
|
9
9
|
export default Footer;
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
interface Props {
|
|
9
9
|
logo: string;
|
|
10
10
|
name?: string;
|
|
11
|
+
href?: string;
|
|
11
12
|
subName?: undefined | string;
|
|
12
13
|
darkToggle?: boolean;
|
|
13
14
|
center?: import('svelte').Snippet;
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
let {
|
|
18
19
|
logo,
|
|
19
20
|
name = 'HYVOR',
|
|
21
|
+
href = '/',
|
|
20
22
|
subName = undefined,
|
|
21
23
|
darkToggle = true,
|
|
22
24
|
center,
|
|
@@ -27,7 +29,7 @@
|
|
|
27
29
|
<header>
|
|
28
30
|
<Container as="nav">
|
|
29
31
|
<div class="nav-start">
|
|
30
|
-
<a class="nav-brand" href
|
|
32
|
+
<a class="nav-brand" {href}>
|
|
31
33
|
<img src={logo} alt="Hyvor Logo" width="30" height="30" />
|
|
32
34
|
<span class="brand-product">
|
|
33
35
|
<span class="brand">{name}</span>
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export declare const SOCIAL_LINKS: {
|
|
2
|
+
readonly x: "https://x.com/HyvorHQ";
|
|
3
|
+
readonly blueksy: "https://bsky.app/profile/hyvor.com";
|
|
4
|
+
readonly discord: "https://discord.com/invite/2WRJxQB";
|
|
5
|
+
readonly github: "https://github.com/hyvor";
|
|
6
|
+
readonly youtube: "https://www.youtube.com/@HYVOR";
|
|
7
|
+
readonly linkedin: "https://www.linkedin.com/company/30240435";
|
|
8
|
+
};
|
|
9
|
+
export type Socials = typeof SOCIAL_LINKS;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const SOCIAL_LINKS = {
|
|
2
|
+
x: 'https://x.com/HyvorHQ',
|
|
3
|
+
blueksy: 'https://bsky.app/profile/hyvor.com',
|
|
4
|
+
discord: 'https://discord.com/invite/2WRJxQB',
|
|
5
|
+
github: 'https://github.com/hyvor',
|
|
6
|
+
youtube: 'https://www.youtube.com/@HYVOR',
|
|
7
|
+
linkedin: 'https://www.linkedin.com/company/30240435'
|
|
8
|
+
};
|
package/dist/stores/dark.d.ts
CHANGED
package/dist/stores/dark.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { writable } from 'svelte/store';
|
|
2
2
|
export const dark = writable(false);
|
|
3
|
+
export const DARK_LOCAL_STORAGE_KEY = 'hds-dark';
|
|
3
4
|
export function setInitialState() {
|
|
4
5
|
const isDark = isDarkScheme();
|
|
5
6
|
if (isDark) {
|
|
@@ -8,16 +9,16 @@ export function setInitialState() {
|
|
|
8
9
|
dark.subscribe((isDark) => {
|
|
9
10
|
if (isDark) {
|
|
10
11
|
document.documentElement.classList.add('dark');
|
|
11
|
-
window.localStorage.setItem(
|
|
12
|
+
window.localStorage.setItem(DARK_LOCAL_STORAGE_KEY, 'true');
|
|
12
13
|
}
|
|
13
14
|
else {
|
|
14
15
|
document.documentElement.classList.remove('dark');
|
|
15
|
-
window.localStorage.removeItem(
|
|
16
|
+
window.localStorage.removeItem(DARK_LOCAL_STORAGE_KEY);
|
|
16
17
|
}
|
|
17
18
|
});
|
|
18
19
|
}
|
|
19
20
|
function isDarkScheme() {
|
|
20
|
-
const localStorageData = window.localStorage.getItem(
|
|
21
|
+
const localStorageData = window.localStorage.getItem(DARK_LOCAL_STORAGE_KEY);
|
|
21
22
|
if (localStorageData) {
|
|
22
23
|
return !!localStorageData;
|
|
23
24
|
}
|
package/dist/variables.scss
CHANGED
package/package.json
CHANGED
|
@@ -48,7 +48,7 @@
|
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
50
|
"@fontsource/readex-pro": "^5.0.8",
|
|
51
|
-
"@hyvor/icons": "^1.1.
|
|
51
|
+
"@hyvor/icons": "^1.1.1",
|
|
52
52
|
"deepmerge-ts": "^5.1.0",
|
|
53
53
|
"highlight.js": "^11.9.0",
|
|
54
54
|
"intl-messageformat": "^10.5.11",
|
|
@@ -59,5 +59,5 @@
|
|
|
59
59
|
"publishConfig": {
|
|
60
60
|
"access": "public"
|
|
61
61
|
},
|
|
62
|
-
"version": "1.
|
|
62
|
+
"version": "1.1.1"
|
|
63
63
|
}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props {
|
|
3
|
-
size?: number;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
let { size = 40 }: Props = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<svg width={size} height={size} viewBox="0 0 132.29166 132.29167" version="1.1">
|
|
10
|
-
<g id="layer1">
|
|
11
|
-
<g id="g1067">
|
|
12
|
-
<rect
|
|
13
|
-
style="mix-blend-mode:normal;fill:#f1e8e8;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:7.15826;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
14
|
-
id="rect1001"
|
|
15
|
-
width="77.870262"
|
|
16
|
-
height="123.57672"
|
|
17
|
-
x="26.535261"
|
|
18
|
-
y="5.0260782"
|
|
19
|
-
ry="38.935131"
|
|
20
|
-
transform="rotate(-0.58211807)"
|
|
21
|
-
/>
|
|
22
|
-
<path
|
|
23
|
-
id="path1003"
|
|
24
|
-
style="mix-blend-mode:normal;fill:#896c6b;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:7.15826;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
25
|
-
d="m 105.07895,65.75026 0.23219,22.852048 C 105.53028,110.17126 88.342531,127.71185 66.773582,127.931 45.204632,128.15014 27.664036,110.96239 27.44489,89.393446 L 27.212709,66.541399 Z"
|
|
26
|
-
/>
|
|
27
|
-
<g id="g1011" transform="matrix(1.0727824,0,0,1.0727824,-4.7282157,-11.786447)">
|
|
28
|
-
<path
|
|
29
|
-
id="path1005"
|
|
30
|
-
style="fill:none;stroke:#000000;stroke-width:6.19866;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
|
31
|
-
d="m 59.684412,40.713463 c 0,-2.381274 -3.065933,-4.311677 -6.847956,-4.311677 -3.782022,0 -6.847956,1.930403 -6.847956,4.311677"
|
|
32
|
-
/>
|
|
33
|
-
<path
|
|
34
|
-
id="path1007"
|
|
35
|
-
style="fill:none;stroke:#000000;stroke-width:6.19866;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
|
36
|
-
d="m 86.142762,40.713463 c 0,-2.381274 -3.065933,-4.311677 -6.847956,-4.311677 -3.782022,0 -6.847956,1.930403 -6.847956,4.311677"
|
|
37
|
-
/>
|
|
38
|
-
<path
|
|
39
|
-
id="path1009"
|
|
40
|
-
style="fill:none;stroke:#000000;stroke-width:6.19866;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
|
41
|
-
d="m 72.699971,55.496735 c 0,2.381274 -3.065933,4.311677 -6.847956,4.311677 -3.782022,0 -6.847956,-1.930403 -6.847956,-4.311677"
|
|
42
|
-
/>
|
|
43
|
-
</g>
|
|
44
|
-
</g>
|
|
45
|
-
</g>
|
|
46
|
-
</svg>
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface Props {
|
|
3
|
-
size?: number;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
let { size = 40 }: Props = $props();
|
|
7
|
-
</script>
|
|
8
|
-
|
|
9
|
-
<svg width={size} height={size} viewBox="0 0 500 500" version="1.1">
|
|
10
|
-
<g id="layer1">
|
|
11
|
-
<g id="g5140" transform="translate(-986.41349,-538.31731)">
|
|
12
|
-
<rect
|
|
13
|
-
style="mix-blend-mode:normal;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:27.0548;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
14
|
-
id="rect1001"
|
|
15
|
-
width="294.31281"
|
|
16
|
-
height="467.06161"
|
|
17
|
-
x="1081.1842"
|
|
18
|
-
y="567.30737"
|
|
19
|
-
ry="147.1564"
|
|
20
|
-
transform="rotate(-0.582118)"
|
|
21
|
-
/>
|
|
22
|
-
<path
|
|
23
|
-
id="path1003"
|
|
24
|
-
style="mix-blend-mode:normal;fill:#666666;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:27.0548;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
|
25
|
-
d="m 1383.5623,786.82223 0.8775,86.36995 c 0.8283,81.52045 -64.1333,147.81562 -145.6537,148.64392 -81.5205,0.8282 -147.8157,-64.13337 -148.6439,-145.65379 l -0.8776,-86.36995 z"
|
|
26
|
-
/>
|
|
27
|
-
<g id="g1011" transform="matrix(4.0546107,0,0,4.0546107,968.54304,493.77011)">
|
|
28
|
-
<path
|
|
29
|
-
id="path1005"
|
|
30
|
-
style="fill:none;stroke:#000000;stroke-width:6.19866;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
|
31
|
-
d="m 59.684412,40.713463 c 0,-2.381274 -3.065933,-4.311677 -6.847956,-4.311677 -3.782022,0 -6.847956,1.930403 -6.847956,4.311677"
|
|
32
|
-
/>
|
|
33
|
-
<path
|
|
34
|
-
id="path1007"
|
|
35
|
-
style="fill:none;stroke:#000000;stroke-width:6.19866;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
|
36
|
-
d="m 86.142762,40.713463 c 0,-2.381274 -3.065933,-4.311677 -6.847956,-4.311677 -3.782022,0 -6.847956,1.930403 -6.847956,4.311677"
|
|
37
|
-
/>
|
|
38
|
-
<path
|
|
39
|
-
id="path1009"
|
|
40
|
-
style="fill:none;stroke:#000000;stroke-width:6.19866;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
|
41
|
-
d="m 72.699971,55.496735 c 0,2.381274 -3.065933,4.311677 -6.847956,4.311677 -3.782022,0 -6.847956,-1.930403 -6.847956,-4.311677"
|
|
42
|
-
/>
|
|
43
|
-
</g>
|
|
44
|
-
</g>
|
|
45
|
-
</g>
|
|
46
|
-
</svg>
|