@functionalcms/svelte-components 5.0.0-beta2 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/Icon.svelte +16 -16
- package/dist/components/content/Markdown.svelte +10 -10
- package/dist/components/form/AntiBot.svelte +12 -12
- package/dist/components/form/Dropzone.svelte +180 -180
- package/dist/components/form/SmartForm.svelte +251 -251
- package/dist/components/integrations/EasyTools.svelte +30 -30
- package/dist/components/layouts/DefaultLayout.svelte +110 -110
- package/dist/components/layouts/FlexBox.svelte +73 -73
- package/dist/components/layouts/MenuLayout.svelte +60 -60
- package/dist/components/layouts/Meta.svelte +28 -28
- package/dist/components/layouts/StyleBox.svelte +17 -17
- package/dist/components/layouts/Tracker.svelte +18 -18
- package/dist/components/layouts/Well.svelte +20 -20
- package/dist/components/presentation/ImageCompare.svelte +180 -180
- package/dist/components/presentation/Logo.svelte +37 -37
- package/package.json +75 -75
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import { page } from '$app/state';
|
|
3
|
-
import type { Snippet } from 'svelte';
|
|
4
|
-
import {
|
|
5
|
-
Navbar,
|
|
6
|
-
NavBrand,
|
|
7
|
-
NavHamburger,
|
|
8
|
-
NavUl,
|
|
9
|
-
NavLi,
|
|
10
|
-
Dropdown,
|
|
11
|
-
DropdownItem,
|
|
12
|
-
} from 'flowbite-svelte';
|
|
13
|
-
import { type MenuOption } from './menuItems.js';
|
|
14
|
-
import { ChevronDownOutline } from 'flowbite-svelte-icons';
|
|
15
|
-
|
|
16
|
-
interface Styles {
|
|
17
|
-
logo?: string;
|
|
18
|
-
companyName?: string;
|
|
19
|
-
navigation?: string;
|
|
20
|
-
menuItem?: string;
|
|
21
|
-
activeClass?: string;
|
|
22
|
-
nonActiveClass?: string;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
interface Props {
|
|
26
|
-
children: Snippet;
|
|
27
|
-
canonicalUrl: string;
|
|
28
|
-
logoUrl?: string;
|
|
29
|
-
companyName?: string;
|
|
30
|
-
renderCompanyName?: boolean;
|
|
31
|
-
menuItems?: Array<MenuOption>;
|
|
32
|
-
footerRender?: Snippet;
|
|
33
|
-
classes?: Styles;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
let {
|
|
37
|
-
children,
|
|
38
|
-
canonicalUrl,
|
|
39
|
-
logoUrl = undefined,
|
|
40
|
-
companyName = '',
|
|
41
|
-
renderCompanyName = true,
|
|
42
|
-
menuItems = [],
|
|
43
|
-
footerRender = undefined,
|
|
44
|
-
classes = {},
|
|
45
|
-
}: Partial<Props> = $props();
|
|
46
|
-
|
|
47
|
-
const defaultClasses = {
|
|
48
|
-
logo: 'me-3 h-6 sm:h-9',
|
|
49
|
-
companyName: 'self-center whitespace-nowrap text-xl font-semibold dark:text-white',
|
|
50
|
-
navigation: '',
|
|
51
|
-
menuItem: '',
|
|
52
|
-
activeClass: 'text-blue-700 dark:text-white',
|
|
53
|
-
nonActiveClass: 'text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white',
|
|
54
|
-
footer:
|
|
55
|
-
'absolute start-0 bottom-0 z-20 w-full border-t border-gray-200 bg-white p-4 shadow-sm md:flex md:items-center md:justify-between md:p-6 dark:border-gray-600 dark:bg-gray-800',
|
|
56
|
-
footerLinks: ''
|
|
57
|
-
};
|
|
58
|
-
const mergedClasses = $derived(() => ({ ...defaultClasses, ...classes }));
|
|
59
|
-
|
|
60
|
-
let activeUrl = $state(page.url.pathname);
|
|
61
|
-
|
|
62
|
-
$effect(() => {
|
|
63
|
-
activeUrl = page.url.pathname;
|
|
64
|
-
});
|
|
65
|
-
</script>
|
|
66
|
-
|
|
67
|
-
<svelte:head>
|
|
68
|
-
<link rel="canonical" href="{canonicalUrl}{page.url.pathname}" />
|
|
69
|
-
</svelte:head>
|
|
70
|
-
|
|
71
|
-
<div class="w-full relative" id="defaultLayout">
|
|
72
|
-
<Navbar class={mergedClasses().navigation}>
|
|
73
|
-
<NavBrand href="/" class="logo">
|
|
74
|
-
<img src={logoUrl} class={mergedClasses().logo} alt={companyName} />
|
|
75
|
-
{#if renderCompanyName}
|
|
76
|
-
<span class={mergedClasses().companyName}>{companyName}</span>
|
|
77
|
-
{/if}
|
|
78
|
-
</NavBrand>
|
|
79
|
-
<NavHamburger />
|
|
80
|
-
<NavUl
|
|
81
|
-
{activeUrl}
|
|
82
|
-
classes={{ active: mergedClasses().activeClass, nonActive: mergedClasses().nonActiveClass }}
|
|
83
|
-
>
|
|
84
|
-
{#each menuItems as item}
|
|
85
|
-
{#if item?.items}
|
|
86
|
-
<NavLi class={mergedClasses().menuItem}>
|
|
87
|
-
<a href={item.href}>{item.label}</a>
|
|
88
|
-
<ChevronDownOutline class="text-primary-800 ms-2 inline h-6 w-6 dark:text-white" />
|
|
89
|
-
</NavLi>
|
|
90
|
-
<Dropdown simple class="w-44">
|
|
91
|
-
{#each item.items as subItem}
|
|
92
|
-
<DropdownItem class={mergedClasses().menuItem} href={subItem.href}
|
|
93
|
-
>{subItem.label}</DropdownItem
|
|
94
|
-
>
|
|
95
|
-
{/each}
|
|
96
|
-
</Dropdown>
|
|
97
|
-
{:else}
|
|
98
|
-
<NavLi class={mergedClasses().menuItem}>
|
|
99
|
-
<a href={item.href}>{item.label}</a>
|
|
100
|
-
</NavLi>
|
|
101
|
-
{/if}
|
|
102
|
-
{/each}
|
|
103
|
-
</NavUl>
|
|
104
|
-
</Navbar>
|
|
105
|
-
<main>
|
|
106
|
-
{@render children?.()}
|
|
107
|
-
</main>
|
|
108
|
-
{@render footerRender?.()}
|
|
109
|
-
|
|
110
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { page } from '$app/state';
|
|
3
|
+
import type { Snippet } from 'svelte';
|
|
4
|
+
import {
|
|
5
|
+
Navbar,
|
|
6
|
+
NavBrand,
|
|
7
|
+
NavHamburger,
|
|
8
|
+
NavUl,
|
|
9
|
+
NavLi,
|
|
10
|
+
Dropdown,
|
|
11
|
+
DropdownItem,
|
|
12
|
+
} from 'flowbite-svelte';
|
|
13
|
+
import { type MenuOption } from './menuItems.js';
|
|
14
|
+
import { ChevronDownOutline } from 'flowbite-svelte-icons';
|
|
15
|
+
|
|
16
|
+
interface Styles {
|
|
17
|
+
logo?: string;
|
|
18
|
+
companyName?: string;
|
|
19
|
+
navigation?: string;
|
|
20
|
+
menuItem?: string;
|
|
21
|
+
activeClass?: string;
|
|
22
|
+
nonActiveClass?: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
interface Props {
|
|
26
|
+
children: Snippet;
|
|
27
|
+
canonicalUrl: string;
|
|
28
|
+
logoUrl?: string;
|
|
29
|
+
companyName?: string;
|
|
30
|
+
renderCompanyName?: boolean;
|
|
31
|
+
menuItems?: Array<MenuOption>;
|
|
32
|
+
footerRender?: Snippet;
|
|
33
|
+
classes?: Styles;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
let {
|
|
37
|
+
children,
|
|
38
|
+
canonicalUrl,
|
|
39
|
+
logoUrl = undefined,
|
|
40
|
+
companyName = '',
|
|
41
|
+
renderCompanyName = true,
|
|
42
|
+
menuItems = [],
|
|
43
|
+
footerRender = undefined,
|
|
44
|
+
classes = {},
|
|
45
|
+
}: Partial<Props> = $props();
|
|
46
|
+
|
|
47
|
+
const defaultClasses = {
|
|
48
|
+
logo: 'me-3 h-6 sm:h-9',
|
|
49
|
+
companyName: 'self-center whitespace-nowrap text-xl font-semibold dark:text-white',
|
|
50
|
+
navigation: '',
|
|
51
|
+
menuItem: '',
|
|
52
|
+
activeClass: 'text-blue-700 dark:text-white',
|
|
53
|
+
nonActiveClass: 'text-gray-700 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white',
|
|
54
|
+
footer:
|
|
55
|
+
'absolute start-0 bottom-0 z-20 w-full border-t border-gray-200 bg-white p-4 shadow-sm md:flex md:items-center md:justify-between md:p-6 dark:border-gray-600 dark:bg-gray-800',
|
|
56
|
+
footerLinks: ''
|
|
57
|
+
};
|
|
58
|
+
const mergedClasses = $derived(() => ({ ...defaultClasses, ...classes }));
|
|
59
|
+
|
|
60
|
+
let activeUrl = $state(page.url.pathname);
|
|
61
|
+
|
|
62
|
+
$effect(() => {
|
|
63
|
+
activeUrl = page.url.pathname;
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
66
|
+
|
|
67
|
+
<svelte:head>
|
|
68
|
+
<link rel="canonical" href="{canonicalUrl}{page.url.pathname}" />
|
|
69
|
+
</svelte:head>
|
|
70
|
+
|
|
71
|
+
<div class="w-full relative" id="defaultLayout">
|
|
72
|
+
<Navbar class={mergedClasses().navigation}>
|
|
73
|
+
<NavBrand href="/" class="logo">
|
|
74
|
+
<img src={logoUrl} class={mergedClasses().logo} alt={companyName} />
|
|
75
|
+
{#if renderCompanyName}
|
|
76
|
+
<span class={mergedClasses().companyName}>{companyName}</span>
|
|
77
|
+
{/if}
|
|
78
|
+
</NavBrand>
|
|
79
|
+
<NavHamburger />
|
|
80
|
+
<NavUl
|
|
81
|
+
{activeUrl}
|
|
82
|
+
classes={{ active: mergedClasses().activeClass, nonActive: mergedClasses().nonActiveClass }}
|
|
83
|
+
>
|
|
84
|
+
{#each menuItems as item}
|
|
85
|
+
{#if item?.items}
|
|
86
|
+
<NavLi class={mergedClasses().menuItem}>
|
|
87
|
+
<a href={item.href}>{item.label}</a>
|
|
88
|
+
<ChevronDownOutline class="text-primary-800 ms-2 inline h-6 w-6 dark:text-white" />
|
|
89
|
+
</NavLi>
|
|
90
|
+
<Dropdown simple class="w-44">
|
|
91
|
+
{#each item.items as subItem}
|
|
92
|
+
<DropdownItem class={mergedClasses().menuItem} href={subItem.href}
|
|
93
|
+
>{subItem.label}</DropdownItem
|
|
94
|
+
>
|
|
95
|
+
{/each}
|
|
96
|
+
</Dropdown>
|
|
97
|
+
{:else}
|
|
98
|
+
<NavLi class={mergedClasses().menuItem}>
|
|
99
|
+
<a href={item.href}>{item.label}</a>
|
|
100
|
+
</NavLi>
|
|
101
|
+
{/if}
|
|
102
|
+
{/each}
|
|
103
|
+
</NavUl>
|
|
104
|
+
</Navbar>
|
|
105
|
+
<main>
|
|
106
|
+
{@render children?.()}
|
|
107
|
+
</main>
|
|
108
|
+
{@render footerRender?.()}
|
|
109
|
+
|
|
110
|
+
</div>
|
|
@@ -1,73 +1,73 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
children: Snippet;
|
|
6
|
-
width?: string;
|
|
7
|
-
height?: string;
|
|
8
|
-
direction: 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
|
9
|
-
justify?:
|
|
10
|
-
| 'start'
|
|
11
|
-
| 'end'
|
|
12
|
-
| 'end-safe'
|
|
13
|
-
| 'center'
|
|
14
|
-
| 'center-safe'
|
|
15
|
-
| 'between'
|
|
16
|
-
| 'around'
|
|
17
|
-
| 'evenly'
|
|
18
|
-
| 'stretch'
|
|
19
|
-
| 'baseline'
|
|
20
|
-
| 'normal';
|
|
21
|
-
align?:
|
|
22
|
-
| 'start'
|
|
23
|
-
| 'end'
|
|
24
|
-
| 'end-safe'
|
|
25
|
-
| 'center'
|
|
26
|
-
| 'center-safe'
|
|
27
|
-
| 'baseline'
|
|
28
|
-
| 'baseline-last'
|
|
29
|
-
| 'stretch';
|
|
30
|
-
wrap: 'wrap' | 'nowrap' | 'wrap-reverse';
|
|
31
|
-
grow?: string;
|
|
32
|
-
shrink?: string;
|
|
33
|
-
gap?: string;
|
|
34
|
-
margin?: string;
|
|
35
|
-
padding?: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
let {
|
|
39
|
-
children,
|
|
40
|
-
width = 'auto',
|
|
41
|
-
height = 'auto',
|
|
42
|
-
direction = 'row',
|
|
43
|
-
justify = 'start',
|
|
44
|
-
align = 'stretch',
|
|
45
|
-
gap = '0',
|
|
46
|
-
wrap = 'nowrap',
|
|
47
|
-
grow = undefined,
|
|
48
|
-
shrink = undefined,
|
|
49
|
-
margin = undefined,
|
|
50
|
-
padding = undefined,
|
|
51
|
-
}: Partial<Props> = $props();
|
|
52
|
-
|
|
53
|
-
const cssClass = $derived(
|
|
54
|
-
[
|
|
55
|
-
`box`,
|
|
56
|
-
`flex flex-${direction}`,
|
|
57
|
-
`justify-${justify}`,
|
|
58
|
-
`items-${align}`,
|
|
59
|
-
`gap-${gap}`,
|
|
60
|
-
`flex-${wrap}`,
|
|
61
|
-
`w-${width}`,
|
|
62
|
-
`h-${height}`,
|
|
63
|
-
grow ? `flex-grow-${grow}` : '',
|
|
64
|
-
shrink ? `flex-shrink-${shrink}` : '',
|
|
65
|
-
margin ? `m-${margin}` : '',
|
|
66
|
-
padding ? `p-${padding}` : '',
|
|
67
|
-
].join(' ')
|
|
68
|
-
);
|
|
69
|
-
</script>
|
|
70
|
-
|
|
71
|
-
<div class={cssClass}>
|
|
72
|
-
{@render children?.()}
|
|
73
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
children: Snippet;
|
|
6
|
+
width?: string;
|
|
7
|
+
height?: string;
|
|
8
|
+
direction: 'row' | 'column' | 'row-reverse' | 'column-reverse';
|
|
9
|
+
justify?:
|
|
10
|
+
| 'start'
|
|
11
|
+
| 'end'
|
|
12
|
+
| 'end-safe'
|
|
13
|
+
| 'center'
|
|
14
|
+
| 'center-safe'
|
|
15
|
+
| 'between'
|
|
16
|
+
| 'around'
|
|
17
|
+
| 'evenly'
|
|
18
|
+
| 'stretch'
|
|
19
|
+
| 'baseline'
|
|
20
|
+
| 'normal';
|
|
21
|
+
align?:
|
|
22
|
+
| 'start'
|
|
23
|
+
| 'end'
|
|
24
|
+
| 'end-safe'
|
|
25
|
+
| 'center'
|
|
26
|
+
| 'center-safe'
|
|
27
|
+
| 'baseline'
|
|
28
|
+
| 'baseline-last'
|
|
29
|
+
| 'stretch';
|
|
30
|
+
wrap: 'wrap' | 'nowrap' | 'wrap-reverse';
|
|
31
|
+
grow?: string;
|
|
32
|
+
shrink?: string;
|
|
33
|
+
gap?: string;
|
|
34
|
+
margin?: string;
|
|
35
|
+
padding?: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
let {
|
|
39
|
+
children,
|
|
40
|
+
width = 'auto',
|
|
41
|
+
height = 'auto',
|
|
42
|
+
direction = 'row',
|
|
43
|
+
justify = 'start',
|
|
44
|
+
align = 'stretch',
|
|
45
|
+
gap = '0',
|
|
46
|
+
wrap = 'nowrap',
|
|
47
|
+
grow = undefined,
|
|
48
|
+
shrink = undefined,
|
|
49
|
+
margin = undefined,
|
|
50
|
+
padding = undefined,
|
|
51
|
+
}: Partial<Props> = $props();
|
|
52
|
+
|
|
53
|
+
const cssClass = $derived(
|
|
54
|
+
[
|
|
55
|
+
`box`,
|
|
56
|
+
`flex flex-${direction}`,
|
|
57
|
+
`justify-${justify}`,
|
|
58
|
+
`items-${align}`,
|
|
59
|
+
`gap-${gap}`,
|
|
60
|
+
`flex-${wrap}`,
|
|
61
|
+
`w-${width}`,
|
|
62
|
+
`h-${height}`,
|
|
63
|
+
grow ? `flex-grow-${grow}` : '',
|
|
64
|
+
shrink ? `flex-shrink-${shrink}` : '',
|
|
65
|
+
margin ? `m-${margin}` : '',
|
|
66
|
+
padding ? `p-${padding}` : '',
|
|
67
|
+
].join(' ')
|
|
68
|
+
);
|
|
69
|
+
</script>
|
|
70
|
+
|
|
71
|
+
<div class={cssClass}>
|
|
72
|
+
{@render children?.()}
|
|
73
|
+
</div>
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
import type { MenuItem, MenuSection } from './menuItems.js';
|
|
4
|
-
import Icon from '../Icon.svelte';
|
|
5
|
-
import {
|
|
6
|
-
Sidebar,
|
|
7
|
-
SidebarDropdownItem,
|
|
8
|
-
SidebarDropdownWrapper,
|
|
9
|
-
SidebarGroup,
|
|
10
|
-
SidebarItem,
|
|
11
|
-
SidebarButton,
|
|
12
|
-
uiHelpers } from "flowbite-svelte";
|
|
13
|
-
|
|
14
|
-
interface TwoColumnLayoutProps {
|
|
15
|
-
children: Snippet;
|
|
16
|
-
menuItems: Array<MenuSection | MenuItem>;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
let {
|
|
20
|
-
children,
|
|
21
|
-
menuItems = []
|
|
22
|
-
}: Partial<TwoColumnLayoutProps> = $props();
|
|
23
|
-
|
|
24
|
-
let container: HTMLElement | undefined = undefined;
|
|
25
|
-
const helpers = uiHelpers();
|
|
26
|
-
</script>
|
|
27
|
-
<section class="flex flex-column md:flex-row" bind:this={container}>
|
|
28
|
-
<SidebarButton onclick={helpers.toggle} class="mb-2" />
|
|
29
|
-
<Sidebar
|
|
30
|
-
backdrop={false}
|
|
31
|
-
isOpen={helpers.isOpen}
|
|
32
|
-
closeSidebar={helpers.close}
|
|
33
|
-
position="fixed"
|
|
34
|
-
class="z-50 h-full">
|
|
35
|
-
<SidebarGroup>
|
|
36
|
-
{#each menuItems as item}
|
|
37
|
-
{#if 'items' in item}
|
|
38
|
-
<SidebarDropdownWrapper label={item.label}>
|
|
39
|
-
{#each item.items as subItem}
|
|
40
|
-
<SidebarDropdownItem label={subItem.label} href={subItem.href} />
|
|
41
|
-
{/each}
|
|
42
|
-
</SidebarDropdownWrapper>
|
|
43
|
-
{:else}
|
|
44
|
-
<SidebarItem label={item.label} href={item.href}>
|
|
45
|
-
{#snippet icon()}
|
|
46
|
-
<Icon
|
|
47
|
-
icon={item.icon} />
|
|
48
|
-
{/snippet}
|
|
49
|
-
</SidebarItem>
|
|
50
|
-
{/if}
|
|
51
|
-
{/each}
|
|
52
|
-
</SidebarGroup>
|
|
53
|
-
</Sidebar>
|
|
54
|
-
<div class="content" style:flex="1">
|
|
55
|
-
{@render children?.()}
|
|
56
|
-
</div>
|
|
57
|
-
</section>
|
|
58
|
-
|
|
59
|
-
<style>
|
|
60
|
-
</style>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
import type { MenuItem, MenuSection } from './menuItems.js';
|
|
4
|
+
import Icon from '../Icon.svelte';
|
|
5
|
+
import {
|
|
6
|
+
Sidebar,
|
|
7
|
+
SidebarDropdownItem,
|
|
8
|
+
SidebarDropdownWrapper,
|
|
9
|
+
SidebarGroup,
|
|
10
|
+
SidebarItem,
|
|
11
|
+
SidebarButton,
|
|
12
|
+
uiHelpers } from "flowbite-svelte";
|
|
13
|
+
|
|
14
|
+
interface TwoColumnLayoutProps {
|
|
15
|
+
children: Snippet;
|
|
16
|
+
menuItems: Array<MenuSection | MenuItem>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let {
|
|
20
|
+
children,
|
|
21
|
+
menuItems = []
|
|
22
|
+
}: Partial<TwoColumnLayoutProps> = $props();
|
|
23
|
+
|
|
24
|
+
let container: HTMLElement | undefined = undefined;
|
|
25
|
+
const helpers = uiHelpers();
|
|
26
|
+
</script>
|
|
27
|
+
<section class="flex flex-column md:flex-row" bind:this={container}>
|
|
28
|
+
<SidebarButton onclick={helpers.toggle} class="mb-2" />
|
|
29
|
+
<Sidebar
|
|
30
|
+
backdrop={false}
|
|
31
|
+
isOpen={helpers.isOpen}
|
|
32
|
+
closeSidebar={helpers.close}
|
|
33
|
+
position="fixed"
|
|
34
|
+
class="z-50 h-full">
|
|
35
|
+
<SidebarGroup>
|
|
36
|
+
{#each menuItems as item}
|
|
37
|
+
{#if 'items' in item}
|
|
38
|
+
<SidebarDropdownWrapper label={item.label}>
|
|
39
|
+
{#each item.items as subItem}
|
|
40
|
+
<SidebarDropdownItem label={subItem.label} href={subItem.href} />
|
|
41
|
+
{/each}
|
|
42
|
+
</SidebarDropdownWrapper>
|
|
43
|
+
{:else}
|
|
44
|
+
<SidebarItem label={item.label} href={item.href}>
|
|
45
|
+
{#snippet icon()}
|
|
46
|
+
<Icon
|
|
47
|
+
icon={item.icon} />
|
|
48
|
+
{/snippet}
|
|
49
|
+
</SidebarItem>
|
|
50
|
+
{/if}
|
|
51
|
+
{/each}
|
|
52
|
+
</SidebarGroup>
|
|
53
|
+
</Sidebar>
|
|
54
|
+
<div class="content" style:flex="1">
|
|
55
|
+
{@render children?.()}
|
|
56
|
+
</div>
|
|
57
|
+
</section>
|
|
58
|
+
|
|
59
|
+
<style>
|
|
60
|
+
</style>
|
|
@@ -1,28 +1,28 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
interface MetaProps {
|
|
3
|
-
title: string;
|
|
4
|
-
description: string;
|
|
5
|
-
keywords: string;
|
|
6
|
-
robots: string;
|
|
7
|
-
charset: string;
|
|
8
|
-
viewport: string;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
let {
|
|
12
|
-
title = '',
|
|
13
|
-
description = '',
|
|
14
|
-
keywords = '',
|
|
15
|
-
robots = 'index, follow',
|
|
16
|
-
charset = 'UTF-8',
|
|
17
|
-
viewport = 'width=device-width, initial-scale=1.0'
|
|
18
|
-
}: Partial<MetaProps> = $props();
|
|
19
|
-
</script>
|
|
20
|
-
|
|
21
|
-
<svelte:head>
|
|
22
|
-
<title>{title}</title>
|
|
23
|
-
<meta name="description" content={description} />
|
|
24
|
-
<meta name="keywords" content={keywords} />
|
|
25
|
-
<meta name="robots" content={robots} />
|
|
26
|
-
<meta name="viewport" content={viewport} />
|
|
27
|
-
<meta {charset} />
|
|
28
|
-
</svelte:head>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
interface MetaProps {
|
|
3
|
+
title: string;
|
|
4
|
+
description: string;
|
|
5
|
+
keywords: string;
|
|
6
|
+
robots: string;
|
|
7
|
+
charset: string;
|
|
8
|
+
viewport: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
title = '',
|
|
13
|
+
description = '',
|
|
14
|
+
keywords = '',
|
|
15
|
+
robots = 'index, follow',
|
|
16
|
+
charset = 'UTF-8',
|
|
17
|
+
viewport = 'width=device-width, initial-scale=1.0'
|
|
18
|
+
}: Partial<MetaProps> = $props();
|
|
19
|
+
</script>
|
|
20
|
+
|
|
21
|
+
<svelte:head>
|
|
22
|
+
<title>{title}</title>
|
|
23
|
+
<meta name="description" content={description} />
|
|
24
|
+
<meta name="keywords" content={keywords} />
|
|
25
|
+
<meta name="robots" content={robots} />
|
|
26
|
+
<meta name="viewport" content={viewport} />
|
|
27
|
+
<meta {charset} />
|
|
28
|
+
</svelte:head>
|
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
children: Snippet;
|
|
6
|
-
class: string;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
let {
|
|
10
|
-
children,
|
|
11
|
-
class: css = '',
|
|
12
|
-
}: Partial<Props> = $props();
|
|
13
|
-
</script>
|
|
14
|
-
|
|
15
|
-
<div class={css}>
|
|
16
|
-
{@render children?.()}
|
|
17
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
children: Snippet;
|
|
6
|
+
class: string;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
let {
|
|
10
|
+
children,
|
|
11
|
+
class: css = '',
|
|
12
|
+
}: Partial<Props> = $props();
|
|
13
|
+
</script>
|
|
14
|
+
|
|
15
|
+
<div class={css}>
|
|
16
|
+
{@render children?.()}
|
|
17
|
+
</div>
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
let { domain }: { domain: string } = $props();
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<svelte:head>
|
|
6
|
-
<script
|
|
7
|
-
defer
|
|
8
|
-
data-domain={domain}
|
|
9
|
-
src="https://plausible.io/js/script.file-downloads.outbound-links.js"
|
|
10
|
-
></script>
|
|
11
|
-
<script>
|
|
12
|
-
window.plausible =
|
|
13
|
-
window.plausible ||
|
|
14
|
-
function () {
|
|
15
|
-
(window.plausible.q = window.plausible.q || []).push(arguments);
|
|
16
|
-
};
|
|
17
|
-
</script>
|
|
18
|
-
</svelte:head>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
let { domain }: { domain: string } = $props();
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<svelte:head>
|
|
6
|
+
<script
|
|
7
|
+
defer
|
|
8
|
+
data-domain={domain}
|
|
9
|
+
src="https://plausible.io/js/script.file-downloads.outbound-links.js"
|
|
10
|
+
></script>
|
|
11
|
+
<script>
|
|
12
|
+
window.plausible =
|
|
13
|
+
window.plausible ||
|
|
14
|
+
function () {
|
|
15
|
+
(window.plausible.q = window.plausible.q || []).push(arguments);
|
|
16
|
+
};
|
|
17
|
+
</script>
|
|
18
|
+
</svelte:head>
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
<script lang="ts">
|
|
2
|
-
import type { Snippet } from 'svelte';
|
|
3
|
-
|
|
4
|
-
interface Props {
|
|
5
|
-
children: Snippet;
|
|
6
|
-
width: number;
|
|
7
|
-
class: string;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
let {
|
|
11
|
-
children,
|
|
12
|
-
width = 95,
|
|
13
|
-
class: css = '',
|
|
14
|
-
}: Partial<Props> = $props();
|
|
15
|
-
|
|
16
|
-
</script>
|
|
17
|
-
|
|
18
|
-
<div class="well w-[{width}%] m-auto p-1 {css}">
|
|
19
|
-
{@render children?.()}
|
|
20
|
-
</div>
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import type { Snippet } from 'svelte';
|
|
3
|
+
|
|
4
|
+
interface Props {
|
|
5
|
+
children: Snippet;
|
|
6
|
+
width: number;
|
|
7
|
+
class: string;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
let {
|
|
11
|
+
children,
|
|
12
|
+
width = 95,
|
|
13
|
+
class: css = '',
|
|
14
|
+
}: Partial<Props> = $props();
|
|
15
|
+
|
|
16
|
+
</script>
|
|
17
|
+
|
|
18
|
+
<div class="well w-[{width}%] m-auto p-1 {css}">
|
|
19
|
+
{@render children?.()}
|
|
20
|
+
</div>
|