tecitheme 0.0.15 → 0.0.18
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/README.md +21 -0
- package/components/CTA.svelte +21 -23
- package/components/CTA.svelte.d.ts +2 -16
- package/components/Card.svelte +52 -0
- package/components/Card.svelte.d.ts +25 -0
- package/components/CountrySelector.svelte +6 -19
- package/components/Figure.svelte +3 -1
- package/components/Footer.svelte +1 -1
- package/components/HeadingCentered.svelte +31 -0
- package/components/HeadingCentered.svelte.d.ts +23 -0
- package/components/Icon.svelte +56 -0
- package/components/MediaFeature.svelte +4 -3
- package/components/Modal.svelte +41 -27
- package/components/Modal.svelte.d.ts +4 -12
- package/components/NewsGrid.svelte +62 -49
- package/components/NewsGrid.svelte.d.ts +0 -2
- package/components/SidebarContent.svelte +3 -1
- package/components/ThreeColumn.svelte +14 -73
- package/components/ThreeColumn.svelte.d.ts +2 -20
- package/components/TrialForm.svelte +2 -2
- package/components/Video.svelte +26 -0
- package/components/Video.svelte.d.ts +25 -0
- package/components/Wrap.svelte +12 -0
- package/components/Wrap.svelte.d.ts +31 -0
- package/layouts/blocks.svelte +35 -38
- package/layouts/blocks.svelte.d.ts +4 -4
- package/package.json +30 -27
- package/components/SectionHeaderCentered.svelte +0 -26
- package/components/SectionHeaderCentered.svelte.d.ts +0 -31
- package/components/YT.svelte +0 -14
- package/components/YT.svelte.d.ts +0 -23
package/README.md
CHANGED
|
@@ -5,3 +5,24 @@ SvelteKit Design System for Thunderhead web properties.
|
|
|
5
5
|
NPM package available at: https://www.npmjs.com/package/tecitheme
|
|
6
6
|
|
|
7
7
|
See https://tecitheme.netlify.app/ for demo, documentation and component details.
|
|
8
|
+
|
|
9
|
+
## How to update the NPM package
|
|
10
|
+
|
|
11
|
+
This theme system is released on NPM to make it easier to include in all Thunderhead web properties.
|
|
12
|
+
### Authenticate to NPM
|
|
13
|
+
|
|
14
|
+
1. `npm adduser`
|
|
15
|
+
2. Enter username and password for the npm account.
|
|
16
|
+
3. Enter email address
|
|
17
|
+
3. Enter 2FA Code
|
|
18
|
+
|
|
19
|
+
### Update the package version
|
|
20
|
+
|
|
21
|
+
1. Edit package.json with the next version.
|
|
22
|
+
2. Commit and push to origin.
|
|
23
|
+
|
|
24
|
+
### Package the project and publish
|
|
25
|
+
|
|
26
|
+
1. `npm run package`
|
|
27
|
+
2. `cd package`
|
|
28
|
+
3. `npm publish`
|
package/components/CTA.svelte
CHANGED
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
export let data
|
|
3
|
-
title: 'Ready to dive in?',
|
|
4
|
-
subtitle: 'Start your free trial today.',
|
|
5
|
-
links: [
|
|
6
|
-
{
|
|
7
|
-
linkText: 'Get Started',
|
|
8
|
-
linkURL: '/product'
|
|
9
|
-
}
|
|
10
|
-
]
|
|
11
|
-
}
|
|
2
|
+
export let data;
|
|
12
3
|
</script>
|
|
13
4
|
|
|
14
5
|
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
15
|
-
<section class="
|
|
6
|
+
<section class="mb-12">
|
|
16
7
|
<div class="mx-auto text-center px-4 sm:px-6 lg:px-8">
|
|
17
|
-
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
</
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
8
|
+
{#if data.title}
|
|
9
|
+
<h2 class="{ data.subtitle ? 'mb-4' : 'mb-8'} text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
|
|
10
|
+
<span class="block">{data.title}</span>
|
|
11
|
+
</h2>
|
|
12
|
+
{/if}
|
|
13
|
+
{#if data.subtitle}
|
|
14
|
+
<h2 class="mb-8 text-xl font-bold tracking-tight text-teci-blue-dark">
|
|
15
|
+
<span class="block">{data.subtitle}</span>
|
|
16
|
+
</h2>
|
|
17
|
+
{/if}
|
|
18
|
+
{#if data.links}
|
|
19
|
+
<div class="flex flex-col space-x-0 space-y-8 justify-center items-center md:space-x-8 md:space-y-0 md:flex-row md:justify-around">
|
|
20
|
+
{#each data.links as link}
|
|
21
|
+
<div class="inline-flex shadow-sm w-full max-w-xs">
|
|
22
|
+
<a href={link.linkURL} class="btn w-full inline-flex items-center px-5 py-3 text-base">{link.linkText}</a>
|
|
23
|
+
</div>
|
|
24
|
+
{/each}
|
|
25
|
+
</div>
|
|
26
|
+
{/if}
|
|
29
27
|
</div>
|
|
30
28
|
</section>
|
|
@@ -2,14 +2,7 @@
|
|
|
2
2
|
/** @typedef {typeof __propDef.events} CtaEvents */
|
|
3
3
|
/** @typedef {typeof __propDef.slots} CtaSlots */
|
|
4
4
|
export default class Cta extends SvelteComponentTyped<{
|
|
5
|
-
data
|
|
6
|
-
title: string;
|
|
7
|
-
subtitle: string;
|
|
8
|
-
links: {
|
|
9
|
-
linkText: string;
|
|
10
|
-
linkURL: string;
|
|
11
|
-
}[];
|
|
12
|
-
};
|
|
5
|
+
data: any;
|
|
13
6
|
}, {
|
|
14
7
|
[evt: string]: CustomEvent<any>;
|
|
15
8
|
}, {}> {
|
|
@@ -20,14 +13,7 @@ export type CtaSlots = typeof __propDef.slots;
|
|
|
20
13
|
import { SvelteComponentTyped } from "svelte";
|
|
21
14
|
declare const __propDef: {
|
|
22
15
|
props: {
|
|
23
|
-
data
|
|
24
|
-
title: string;
|
|
25
|
-
subtitle: string;
|
|
26
|
-
links: {
|
|
27
|
-
linkText: string;
|
|
28
|
-
linkURL: string;
|
|
29
|
-
}[];
|
|
30
|
-
};
|
|
16
|
+
data: any;
|
|
31
17
|
};
|
|
32
18
|
events: {
|
|
33
19
|
[evt: string]: CustomEvent<any>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
//Allows icons from https://fonts.google.com/icons?selected=Material+Icons by name in the format 'icon-XXXX'.
|
|
3
|
+
import Icon from './Icon.svelte';
|
|
4
|
+
import Wrap from './Wrap.svelte';
|
|
5
|
+
export let data;
|
|
6
|
+
export let halfHeight;
|
|
7
|
+
</script>
|
|
8
|
+
|
|
9
|
+
<Wrap tag='a' when={!data.links} href={data.cardURL}>
|
|
10
|
+
<div class="group space-y-4 p-2 border border-gray-100 hover:border-gray-200 hover:shadow-md">
|
|
11
|
+
{#if data.image}
|
|
12
|
+
<div style="background-image: url({data.image});" class="w-full {halfHeight ? 'aspect-video' : 'aspect-square'} bg-cover bg-no-repeat border border-gray-200 flex items-center justify-center">
|
|
13
|
+
<div class="{halfHeight ? 'space-y-4' : 'space-y-8'} p-4 flex flex-col w-full h-full justify-center items-center">
|
|
14
|
+
{#if data.links}
|
|
15
|
+
{#each data.links as link}
|
|
16
|
+
<a href={link.linkURL} class="whitespace-nowrap text-sm btn w-3/4 text-center">{link.linkText}</a>
|
|
17
|
+
{/each}
|
|
18
|
+
{:else}
|
|
19
|
+
<span>​</span>
|
|
20
|
+
{/if}
|
|
21
|
+
</div>
|
|
22
|
+
</div>
|
|
23
|
+
{/if}
|
|
24
|
+
<div>
|
|
25
|
+
<a href={data.cardURL}>
|
|
26
|
+
<div class="flex flex-row items-start space-x-4 mb-2">
|
|
27
|
+
{#if data.icon}
|
|
28
|
+
<div class="grid place-items-center">
|
|
29
|
+
<Icon classes={data.classes} icon={data.icon} />
|
|
30
|
+
</div>
|
|
31
|
+
{/if}
|
|
32
|
+
<div class="leading-none font-medium flex flex-col">
|
|
33
|
+
{#if data.heading}
|
|
34
|
+
<h3 class="text-2xl leading-none">{data.heading}</h3>
|
|
35
|
+
{/if}
|
|
36
|
+
{#if data.subheading}
|
|
37
|
+
<p class="text-teci-blue-dark leading-6">{data.subheading}</p>
|
|
38
|
+
{/if}
|
|
39
|
+
</div>
|
|
40
|
+
</div>
|
|
41
|
+
{#if data.text}
|
|
42
|
+
<div class="text-lg w-full">
|
|
43
|
+
<p class="text-gray-500">{data.text}</p>
|
|
44
|
+
<div class="w-full flex flex-col items-end">
|
|
45
|
+
<span class="inline-block max-w-sm text-center text-sm font-medium text-white mt-1 btn">{data.cardLinkText}</span>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
{/if}
|
|
49
|
+
</a>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</Wrap>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} CardProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} CardEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} CardSlots */
|
|
4
|
+
export default class Card extends SvelteComponentTyped<{
|
|
5
|
+
data: any;
|
|
6
|
+
halfHeight: any;
|
|
7
|
+
}, {
|
|
8
|
+
[evt: string]: CustomEvent<any>;
|
|
9
|
+
}, {}> {
|
|
10
|
+
}
|
|
11
|
+
export type CardProps = typeof __propDef.props;
|
|
12
|
+
export type CardEvents = typeof __propDef.events;
|
|
13
|
+
export type CardSlots = typeof __propDef.slots;
|
|
14
|
+
import { SvelteComponentTyped } from "svelte";
|
|
15
|
+
declare const __propDef: {
|
|
16
|
+
props: {
|
|
17
|
+
data: any;
|
|
18
|
+
halfHeight: any;
|
|
19
|
+
};
|
|
20
|
+
events: {
|
|
21
|
+
[evt: string]: CustomEvent<any>;
|
|
22
|
+
};
|
|
23
|
+
slots: {};
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -6,7 +6,11 @@
|
|
|
6
6
|
export let selection = 'sel';
|
|
7
7
|
export let allowContinue = false;
|
|
8
8
|
|
|
9
|
-
let
|
|
9
|
+
let modalData = {
|
|
10
|
+
title: '',
|
|
11
|
+
text: '',
|
|
12
|
+
modalContent: "<h2 class='text-lg leading-6 font-medium text-gray-900'>Reseller Required</h2><div class='mt-2 px-7 py-3'><p class='text-sm text-gray-500'>Thunderhead cannot sell to you directly, you must use the authorized reseller for your region.</p></div><div class='items-center px-4 py-3'><a href='https://www.thunderheadeng.com/pyrosim/pyrosim-licensing/#r{resellerIndex+1}' id='ok-btn' class='px-4 py-2 bg-teci-blue-light text-white text-base font-medium w-full shadow-sm hover:bg-teci-blue-dark focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500'>Reseller Contact Information</a></div>"
|
|
13
|
+
};
|
|
10
14
|
let resellerIndex = -1;
|
|
11
15
|
let resellerArray = [
|
|
12
16
|
["BE", "NL", "LU"],
|
|
@@ -136,21 +140,4 @@
|
|
|
136
140
|
<option value="VN">Viet Nam</option>
|
|
137
141
|
</select>
|
|
138
142
|
|
|
139
|
-
<Modal bind:
|
|
140
|
-
<div class="mt-3 text-center">
|
|
141
|
-
<h2 class="text-lg leading-6 font-medium text-gray-900">Reseller Required</h2>
|
|
142
|
-
<div class="mt-2 px-7 py-3">
|
|
143
|
-
<p class="text-sm text-gray-500">
|
|
144
|
-
Thunderhead cannot sell to you directly, you must use the authorized reseller for your region.
|
|
145
|
-
</p>
|
|
146
|
-
</div>
|
|
147
|
-
<div class="items-center px-4 py-3">
|
|
148
|
-
<a href="https://www.thunderheadeng.com/pyrosim/pyrosim-licensing/#r{resellerIndex+1}"
|
|
149
|
-
id="ok-btn"
|
|
150
|
-
class="px-4 py-2 bg-teci-blue-light text-white text-base font-medium w-full shadow-sm hover:bg-teci-blue-dark focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500"
|
|
151
|
-
>
|
|
152
|
-
Reseller Contact Information
|
|
153
|
-
</a>
|
|
154
|
-
</div>
|
|
155
|
-
</div>
|
|
156
|
-
</Modal>
|
|
143
|
+
<Modal bind:data={modalData} />
|
package/components/Figure.svelte
CHANGED
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
<section class="flex justify-center not-prose mb-8">
|
|
8
8
|
<figure class="bg-white w-auto mx-auto shadow-lg border border-slate-100 p-2">
|
|
9
|
-
<
|
|
9
|
+
<a href={image}>
|
|
10
|
+
<img class="w-full" src={image} alt={title} title={title}>
|
|
11
|
+
</a>
|
|
10
12
|
{#if caption}
|
|
11
13
|
<figcaption class="text-center p-2">{@html caption}</figcaption>
|
|
12
14
|
{/if}
|
package/components/Footer.svelte
CHANGED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
//Based on: https://tailwindui.com/components/marketing/sections/header#component-2c3b25e7b9e4490edd7b6950692c0a11
|
|
3
|
+
import Icon from "./Icon.svelte";
|
|
4
|
+
export let data;
|
|
5
|
+
</script>
|
|
6
|
+
|
|
7
|
+
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
8
|
+
<div class="w-full text-center">
|
|
9
|
+
{#if data.toptext}
|
|
10
|
+
<p class="text-base font-semibold text-teci-blue-dark uppercase">
|
|
11
|
+
{data.toptext}
|
|
12
|
+
</p>
|
|
13
|
+
{/if}
|
|
14
|
+
{#if (data.title || data.logo)}
|
|
15
|
+
{#if data.logo}
|
|
16
|
+
<div class="grid place-items-center">
|
|
17
|
+
<h1 class="sr-only">{data.title}</h1>
|
|
18
|
+
<Icon classes={data.classes} icon={data.logo} />
|
|
19
|
+
</div>
|
|
20
|
+
{:else}
|
|
21
|
+
<h1 class="mt-1 text-4xl font-bold text-gray-900 sm:text-5xl sm:tracking-tight lg:text-6xl">
|
|
22
|
+
{data.title}
|
|
23
|
+
</h1>
|
|
24
|
+
{/if}
|
|
25
|
+
{/if}
|
|
26
|
+
{#if data.subtitle}
|
|
27
|
+
<p class="max-w-4xl mt-5 mx-auto text-xl text-gray-500">
|
|
28
|
+
{data.subtitle}
|
|
29
|
+
</p>
|
|
30
|
+
{/if}
|
|
31
|
+
</div>
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} HeadingCenteredProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} HeadingCenteredEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} HeadingCenteredSlots */
|
|
4
|
+
export default class HeadingCentered extends SvelteComponentTyped<{
|
|
5
|
+
data: any;
|
|
6
|
+
}, {
|
|
7
|
+
[evt: string]: CustomEvent<any>;
|
|
8
|
+
}, {}> {
|
|
9
|
+
}
|
|
10
|
+
export type HeadingCenteredProps = typeof __propDef.props;
|
|
11
|
+
export type HeadingCenteredEvents = typeof __propDef.events;
|
|
12
|
+
export type HeadingCenteredSlots = typeof __propDef.slots;
|
|
13
|
+
import { SvelteComponentTyped } from "svelte";
|
|
14
|
+
declare const __propDef: {
|
|
15
|
+
props: {
|
|
16
|
+
data: any;
|
|
17
|
+
};
|
|
18
|
+
events: {
|
|
19
|
+
[evt: string]: CustomEvent<any>;
|
|
20
|
+
};
|
|
21
|
+
slots: {};
|
|
22
|
+
};
|
|
23
|
+
export {};
|
package/components/Icon.svelte
CHANGED
|
@@ -22,6 +22,15 @@
|
|
|
22
22
|
title="PyroSim Results Icon"
|
|
23
23
|
/>
|
|
24
24
|
</span>
|
|
25
|
+
{:else if icon == 'pyrosim-logo'}
|
|
26
|
+
<span class="not-prose">
|
|
27
|
+
<img
|
|
28
|
+
class={classes}
|
|
29
|
+
src="https://files.thunderheadeng.com/www/images/pyrosim_logo.svg"
|
|
30
|
+
alt="PyroSim Logo"
|
|
31
|
+
title="PyroSim Logo"
|
|
32
|
+
/>
|
|
33
|
+
</span>
|
|
25
34
|
{:else if icon == 'pathfinder'}
|
|
26
35
|
<span class="not-prose">
|
|
27
36
|
<img
|
|
@@ -40,6 +49,15 @@
|
|
|
40
49
|
title="Pathfinder Results Icon"
|
|
41
50
|
/>
|
|
42
51
|
</span>
|
|
52
|
+
{:else if icon == 'pathfinder-logo'}
|
|
53
|
+
<span class="not-prose">
|
|
54
|
+
<img
|
|
55
|
+
class={classes}
|
|
56
|
+
src="https://files.thunderheadeng.com/www/images/pathfinder_logo.svg"
|
|
57
|
+
alt="Pathfinder Logo"
|
|
58
|
+
title="Pathfinder Logo"
|
|
59
|
+
/>
|
|
60
|
+
</span>
|
|
43
61
|
{:else if icon == 'petrasim'}
|
|
44
62
|
<span class="not-prose">
|
|
45
63
|
<img
|
|
@@ -49,6 +67,44 @@
|
|
|
49
67
|
title="PetraSim Icon"
|
|
50
68
|
/>
|
|
51
69
|
</span>
|
|
70
|
+
{:else if icon == 'petrasim-logo'}
|
|
71
|
+
<span class="not-prose">
|
|
72
|
+
<img
|
|
73
|
+
class={classes}
|
|
74
|
+
src="https://files.thunderheadeng.com/www/images/petrasim_logo.svg"
|
|
75
|
+
alt="PetraSim Logo"
|
|
76
|
+
title="PetraSim Logo"
|
|
77
|
+
/>
|
|
78
|
+
</span>
|
|
79
|
+
{:else if icon == 'teci-logo'}
|
|
80
|
+
<span class="not-prose">
|
|
81
|
+
<img
|
|
82
|
+
class={classes}
|
|
83
|
+
src="https://files.thunderheadeng.com/www/images/teci_logo.svg"
|
|
84
|
+
alt="Thunderhead Logo"
|
|
85
|
+
title="Thunderhead Logo"
|
|
86
|
+
/>
|
|
87
|
+
</span>
|
|
88
|
+
{:else if icon == 'teci-icon'}
|
|
89
|
+
<span class="not-prose">
|
|
90
|
+
<svg class={classes} xmlns="http://www.w3.org/2000/svg" viewBox="0 0 250 250">
|
|
91
|
+
<path
|
|
92
|
+
style="fill:#0c3879;fill-rule:evenodd;stroke:none"
|
|
93
|
+
d="M88.113 220.536h97.672v97.672H88.113z"
|
|
94
|
+
transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
|
|
95
|
+
/>
|
|
96
|
+
<path
|
|
97
|
+
style="fill:#fff;fill-rule:evenodd;stroke:none"
|
|
98
|
+
d="M145.864 260.176h22.042c2.792 0 4.883.835 6.559 2.651 1.532 1.673 2.232 3.764 2.232 6.278 0 2.37-.7 4.464-2.232 6.277-1.676 1.675-3.767 2.651-6.559 2.651h-22.042v-17.857m0 23.159h22.042c2.792 0 4.883.838 6.559 2.65 1.532 1.674 2.232 3.768 2.232 6.278 0 2.373-.7 4.464-2.232 6.278-1.676 1.675-3.767 2.65-6.559 2.65h-22.042v-17.856"
|
|
99
|
+
transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
|
|
100
|
+
/>
|
|
101
|
+
<path
|
|
102
|
+
style="fill:#fff;fill-rule:evenodd;stroke:none"
|
|
103
|
+
d="M132.471 301.192c-5.861 0-8.79-3.07-8.79-8.929l-.138-37.389-20.648-.14c-7.116-1.254-10.185-9.626-5.165-15.206 1.535-1.535 3.63-2.373 6.14-2.651h26.926l1.675.14h35.435c2.792 0 4.883.836 6.559 2.649 1.532 1.675 2.232 3.767 2.232 6.28 0 2.37-.7 4.464-2.232 6.277-1.676 1.673-3.767 2.651-6.559 2.651H141.26V301.192h-8.788"
|
|
104
|
+
transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
|
|
105
|
+
/>
|
|
106
|
+
</svg>
|
|
107
|
+
</span>
|
|
52
108
|
{:else if icon?.startsWith("icon-")}
|
|
53
109
|
<span class="material-icons-outlined {classes}">{icon?.slice(5)}</span>
|
|
54
110
|
{:else}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
|
|
2
|
+
import Video from './Video.svelte'
|
|
3
|
+
|
|
3
4
|
export let data;
|
|
4
5
|
</script>
|
|
5
6
|
|
|
6
7
|
<section class="w-full mx-auto flex flex-col md:flex-row items-center justify-center">
|
|
7
|
-
{#if data.
|
|
8
|
+
{#if data.v}
|
|
8
9
|
<div class="w-full max-w-xl {data.position === 'right' ? 'mb-4 md:mb-0' : 'mb-0'}">
|
|
9
|
-
<
|
|
10
|
+
<Video bind:data />
|
|
10
11
|
</div>
|
|
11
12
|
{:else if data.image}
|
|
12
13
|
<div class="block w-full max-w-xl mb-4 md:mb-0">
|
package/components/Modal.svelte
CHANGED
|
@@ -1,31 +1,45 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
export let data;
|
|
3
|
+
let shown = false;
|
|
4
|
+
|
|
5
|
+
function show() {
|
|
6
|
+
shown = true;
|
|
7
|
+
}
|
|
8
|
+
function hide() {
|
|
9
|
+
shown = false;
|
|
10
|
+
}
|
|
11
|
+
</script>
|
|
10
12
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
13
|
+
<svelte:window
|
|
14
|
+
on:keydown={e => {
|
|
15
|
+
if (e.keyCode == 27) {
|
|
16
|
+
hide();
|
|
17
|
+
}
|
|
18
|
+
}} />
|
|
19
|
+
|
|
20
|
+
<div class="prose max-w-none">
|
|
21
|
+
{#if data.title}
|
|
22
|
+
<h2>{data.title}</h2>
|
|
23
|
+
{/if}
|
|
24
|
+
{#if data.text}
|
|
25
|
+
<p>{data.text}</p>
|
|
26
|
+
{/if}
|
|
27
|
+
<button on:click={show} class="btn">{data.buttonText}</button>
|
|
28
|
+
</div>
|
|
29
|
+
|
|
30
|
+
{#if shown}
|
|
31
|
+
<div class="z-50 fixed inset-0 bg-gray-900 bg-opacity-50 overflow-y-auto h-full w-full !mt-0">
|
|
32
|
+
<div class="relative top-20 mx-auto p-5 border w-96 shadow-lg bg-white">
|
|
33
|
+
<button type="button" on:click={hide} class="absolute top-0 right-0 bg-white p-1 mr-2 mt-2 inline-flex items-center justify-center text-teci-blue-light hover:text-white hover:bg-teci-blue-dark focus:outline-none focus:ring-2 focus:ring-inset focus:ring-teci-blue-dark">
|
|
34
|
+
<span class="sr-only">Close menu</span>
|
|
35
|
+
<!-- Heroicon name: outline/x -->
|
|
36
|
+
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true">
|
|
37
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12" />
|
|
38
|
+
</svg>
|
|
39
|
+
</button>
|
|
40
|
+
<div class="mt-3 text-center">
|
|
41
|
+
{@html data.modalContent}
|
|
29
42
|
</div>
|
|
30
43
|
</div>
|
|
31
|
-
|
|
44
|
+
</div>
|
|
45
|
+
{/if}
|
|
@@ -2,15 +2,10 @@
|
|
|
2
2
|
/** @typedef {typeof __propDef.events} ModalEvents */
|
|
3
3
|
/** @typedef {typeof __propDef.slots} ModalSlots */
|
|
4
4
|
export default class Modal extends SvelteComponentTyped<{
|
|
5
|
-
|
|
6
|
-
hide?: () => void;
|
|
5
|
+
data: any;
|
|
7
6
|
}, {
|
|
8
7
|
[evt: string]: CustomEvent<any>;
|
|
9
|
-
}, {
|
|
10
|
-
default: {};
|
|
11
|
-
}> {
|
|
12
|
-
get show(): () => void;
|
|
13
|
-
get hide(): () => void;
|
|
8
|
+
}, {}> {
|
|
14
9
|
}
|
|
15
10
|
export type ModalProps = typeof __propDef.props;
|
|
16
11
|
export type ModalEvents = typeof __propDef.events;
|
|
@@ -18,14 +13,11 @@ export type ModalSlots = typeof __propDef.slots;
|
|
|
18
13
|
import { SvelteComponentTyped } from "svelte";
|
|
19
14
|
declare const __propDef: {
|
|
20
15
|
props: {
|
|
21
|
-
|
|
22
|
-
hide?: () => void;
|
|
16
|
+
data: any;
|
|
23
17
|
};
|
|
24
18
|
events: {
|
|
25
19
|
[evt: string]: CustomEvent<any>;
|
|
26
20
|
};
|
|
27
|
-
slots: {
|
|
28
|
-
default: {};
|
|
29
|
-
};
|
|
21
|
+
slots: {};
|
|
30
22
|
};
|
|
31
23
|
export {};
|
|
@@ -1,60 +1,73 @@
|
|
|
1
1
|
<script>
|
|
2
2
|
import { DateTime } from "luxon";
|
|
3
|
+
import { getContext } from 'svelte';
|
|
4
|
+
import { paginate, LightPaginationNav } from 'svelte-paginate'
|
|
5
|
+
|
|
3
6
|
export let data;
|
|
4
|
-
|
|
7
|
+
|
|
8
|
+
const posts = getContext('newsPosts');
|
|
9
|
+
let filteredPosts = [];
|
|
10
|
+
let items = [];
|
|
11
|
+
let currentPage = 1;
|
|
12
|
+
let pageSize = data.pageSize;
|
|
13
|
+
|
|
14
|
+
function termExists(arr, terms) {
|
|
15
|
+
return terms.some(value => {
|
|
16
|
+
return arr.includes(value)
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function filterPosts(arr, terms) {
|
|
21
|
+
for (let i = 0; i < arr.length;) {
|
|
22
|
+
if (termExists(arr[i].meta.categories, terms)) {
|
|
23
|
+
i++;
|
|
24
|
+
continue
|
|
25
|
+
};
|
|
26
|
+
arr.splice(i,1)
|
|
27
|
+
};
|
|
28
|
+
return arr;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
if (data.filter) {
|
|
32
|
+
items = filterPosts(posts, data.filter);
|
|
33
|
+
} else {
|
|
34
|
+
items = posts;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
$: paginatedItems = paginate({ items, pageSize, currentPage })
|
|
5
38
|
</script>
|
|
6
39
|
|
|
7
|
-
<div class="relative mx-auto w-full
|
|
8
|
-
<div>
|
|
9
|
-
<
|
|
10
|
-
{data.title}
|
|
11
|
-
</h2>
|
|
12
|
-
<div class="mt-3 sm:mt-4 lg:grid lg:grid-cols-2 lg:items-center lg:gap-5">
|
|
40
|
+
<div class="relative mx-auto w-full">
|
|
41
|
+
<div class="flex flex-col sm:flex-row justify-between sm:items-end space-y-4 sm:space-y-0 pb-4 border-b-2 border-gray-200">
|
|
42
|
+
<div>
|
|
43
|
+
<h1 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">{data.title}</h1>
|
|
13
44
|
<p class="text-xl text-gray-500">{data.subtitle}</p>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
id="email-address"
|
|
19
|
-
name="email-address"
|
|
20
|
-
type="email"
|
|
21
|
-
autocomplete="email"
|
|
22
|
-
required
|
|
23
|
-
class="w-full appearance-none border-b-2 border-b-gray-800 bg-white px-4 py-2 text-base text-gray-900 placeholder-gray-500 focus:border-teci-blue-light focus:outline-none focus:ring-teci-blue-light lg:max-w-xs"
|
|
24
|
-
placeholder="Enter your email"
|
|
25
|
-
/>
|
|
26
|
-
</div>
|
|
27
|
-
<div
|
|
28
|
-
class="mt-2 flex w-full flex-shrink-0 shadow-sm sm:mt-0 sm:ml-3 sm:inline-flex sm:w-auto"
|
|
29
|
-
>
|
|
30
|
-
<button type="button" class="btn">Subscribe</button>
|
|
31
|
-
</div>
|
|
32
|
-
</form>
|
|
45
|
+
</div>
|
|
46
|
+
<div class="w-32">
|
|
47
|
+
<data id="mj-w-res-data" data-token="f594659941689957f270ca278a80dc7d" class="mj-w-data" data-apikey="3aOX" data-w-id="Fbu" data-lang="en_US" data-base="https://app.mailjet.com" data-width="640" data-height="480" data-statics="statics"></data>
|
|
48
|
+
<button class="w-full flex items-center justify-center px-4 py-2 border border-transparent text-base leading-6 font-medium text-white hover:bg-teci-blue-dark bg-teci-blue-light focus:outline-none focus:border-teci-blue-dark transition duration-150 ease-in-out" data-token="f594659941689957f270ca278a80dc7d" onclick="mjOpenPopin(event, this)">Subscribe</button>
|
|
33
49
|
</div>
|
|
34
50
|
</div>
|
|
35
|
-
<div class="mt-6 grid gap-16 pt-10
|
|
36
|
-
{#each
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
</p>
|
|
41
|
-
<
|
|
42
|
-
|
|
43
|
-
{post.meta.title}
|
|
44
|
-
</p>
|
|
45
|
-
<p class="mt-3 text-base text-gray-500">
|
|
46
|
-
{post.meta.summary}
|
|
47
|
-
</p>
|
|
48
|
-
</a>
|
|
49
|
-
<div class="mt-3">
|
|
50
|
-
<a
|
|
51
|
-
href={post.path}
|
|
52
|
-
class="text-base font-semibold text-teci-blue-light hover:text-teci-blue-dark"
|
|
53
|
-
>
|
|
54
|
-
Read full story
|
|
55
|
-
</a>
|
|
56
|
-
</div>
|
|
51
|
+
<div class="mt-6 grid gap-16 pt-10 md:grid-cols-2 lg:grid-cols-3 lg:gap-x-5 lg:gap-y-12">
|
|
52
|
+
{#each paginatedItems as post}
|
|
53
|
+
<a class="block h-full" href={post.path}>
|
|
54
|
+
<div class="flex flex-col items-stretch h-full">
|
|
55
|
+
<time class="block mb-1 text-sm text-gray-500" datetime={post.meta.date}>{DateTime.fromISO(post.meta.date).toLocaleString()}</time>
|
|
56
|
+
<p class="mb-2 text-xl font-semibold text-gray-900">{post.meta.title}</p>
|
|
57
|
+
<p class="flex-1 mb-2 text-base text-gray-500">{post.meta.summary.length > 190 ? post.meta.summary.substring(0,190) + " ..." : post.meta.summary}</p>
|
|
58
|
+
<p class="text-sm font-semibold text-teci-blue-light hover:text-teci-blue-dark">Read full article<span aria-hidden="true"> →</span></p>
|
|
57
59
|
</div>
|
|
60
|
+
</a>
|
|
58
61
|
{/each}
|
|
59
62
|
</div>
|
|
60
|
-
|
|
63
|
+
<div class="pt-8 w-auto max-w-sm mx-auto">
|
|
64
|
+
<LightPaginationNav
|
|
65
|
+
totalItems="{items.length}"
|
|
66
|
+
pageSize="{pageSize ? pageSize : 6}"
|
|
67
|
+
currentPage="{currentPage}"
|
|
68
|
+
limit="{1}"
|
|
69
|
+
showStepOptions="{true}"
|
|
70
|
+
on:setPage="{(e) => currentPage = e.detail.page}"
|
|
71
|
+
/>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
/** @typedef {typeof __propDef.slots} NewsGridSlots */
|
|
4
4
|
export default class NewsGrid extends SvelteComponentTyped<{
|
|
5
5
|
data: any;
|
|
6
|
-
posts: any;
|
|
7
6
|
}, {
|
|
8
7
|
[evt: string]: CustomEvent<any>;
|
|
9
8
|
}, {}> {
|
|
@@ -15,7 +14,6 @@ import { SvelteComponentTyped } from "svelte";
|
|
|
15
14
|
declare const __propDef: {
|
|
16
15
|
props: {
|
|
17
16
|
data: any;
|
|
18
|
-
posts: any;
|
|
19
17
|
};
|
|
20
18
|
events: {
|
|
21
19
|
[evt: string]: CustomEvent<any>;
|
|
@@ -27,7 +27,9 @@
|
|
|
27
27
|
|
|
28
28
|
<div id="content" class="prose w-full { data.fullWidth ? 'max-w-none' : 'max-w-prose'}">
|
|
29
29
|
<h1>{title}</h1>
|
|
30
|
+
{#if formattedDate}
|
|
30
31
|
<p>Published: {formattedDate}{#if (formattedLastModDate != formattedDate && formattedLastModDate)}, Updated: {formattedLastModDate}{/if}</p>
|
|
32
|
+
{/if}
|
|
31
33
|
<slot />
|
|
32
34
|
</div>
|
|
33
35
|
<aside class="relative w-0 {(data.toc || data.rightRail) ? 'md:w-60' : 'hidden'}">
|
|
@@ -35,7 +37,7 @@
|
|
|
35
37
|
<div class="sticky top-8 shrink-0 flex flex-col">
|
|
36
38
|
<button on:click={() => {tocOpen = !tocOpen;}}
|
|
37
39
|
class="md:hidden absolute -left-10 w-10 h-10 flex items-center justify-center border border-teci-blue-light text-teci-blue-light bg-white
|
|
38
|
-
{tocOpen ? 'border-opacity-100 bg-opacity-100 text-opacity-100' : 'border-opacity-
|
|
40
|
+
{tocOpen ? 'border-opacity-100 bg-opacity-100 text-opacity-100' : 'border-opacity-60 bg-opacity-20 text-opacity-60 hover:border-opacity-100 hover:bg-opacity-100 hover:text-opacity-100'}"
|
|
39
41
|
title="Table of Contents Toggle" alt="Table of Contents Toggle"
|
|
40
42
|
>
|
|
41
43
|
<span class="material-icons-outlined">menu_open</span>
|
|
@@ -1,78 +1,19 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
import Icon from './Icon.svelte';
|
|
8
|
-
|
|
9
|
-
export let title = 'A better way to do things.';
|
|
10
|
-
|
|
11
|
-
export let data = [
|
|
12
|
-
{
|
|
13
|
-
icon: 'pyrosim',
|
|
14
|
-
classes: 'h-12 w-12',
|
|
15
|
-
image: 'https://www.thunderheadeng.com/wp-content/uploads/2013/09/company_pyrosim.jpg',
|
|
16
|
-
heading: 'Product 1',
|
|
17
|
-
subheading: 'Nutshell',
|
|
18
|
-
text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed quis quam ultrices, vestibulum lacus nec, interdum est. Ut.',
|
|
19
|
-
linkURL: '/product'
|
|
20
|
-
},
|
|
21
|
-
{
|
|
22
|
-
icon: '',
|
|
23
|
-
classes: '',
|
|
24
|
-
image: 'https://www.thunderheadeng.com/wp-content/uploads/2013/08/company_pathfinder.png',
|
|
25
|
-
heading: 'Product 2',
|
|
26
|
-
subheading: 'No Icon',
|
|
27
|
-
text: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed quis quam ultrices, vestibulum lacus nec, interdum est. Ut.',
|
|
28
|
-
linkURL: '/product'
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
icon: 'icon-auto_stories',
|
|
32
|
-
image: 'https://www.thunderheadeng.com/wp-content/uploads/2013/08/company_petrasim.png',
|
|
33
|
-
classes: 'bg-teci-blue-dark text-white text-4xl grid place-items-center h-12 w-12',
|
|
34
|
-
heading: 'Google Icon, No Subtitle or Text',
|
|
35
|
-
subheading: '',
|
|
36
|
-
text: '',
|
|
37
|
-
linkURL: '/product'
|
|
38
|
-
}
|
|
39
|
-
];
|
|
2
|
+
//Based on:
|
|
3
|
+
//https://tailwindui.com/components/marketing/sections/feature-sections#component-c683653471044e6ffc32739e199dfbf2
|
|
4
|
+
//https://tailwindui.com/components/marketing/sections/team-sections#component-0efa5ebc92e2aa72bc2332fcf5578869
|
|
5
|
+
import Card from './Card.svelte';
|
|
6
|
+
export let data;
|
|
40
7
|
</script>
|
|
41
8
|
|
|
42
9
|
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
43
|
-
<div class="w-full
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
<img class="w-full aspect-square object-cover shadow-md border border-gray-200" src={col.image} alt="" />
|
|
53
|
-
</div>
|
|
54
|
-
{/if}
|
|
55
|
-
<div class="flex flex-row items-start space-x-4">
|
|
56
|
-
{#if col.icon}
|
|
57
|
-
<div class="grid place-items-center">
|
|
58
|
-
<Icon classes={col.classes} icon={col.icon} />
|
|
59
|
-
</div>
|
|
60
|
-
{/if}
|
|
61
|
-
<div class="leading-none font-medium flex flex-col">
|
|
62
|
-
<h3 class="text-2xl leading-none">{col.heading}</h3>
|
|
63
|
-
{#if col.subheading}
|
|
64
|
-
<p class="text-teci-blue-dark leading-6">{col.subheading}</p>
|
|
65
|
-
{/if}
|
|
66
|
-
</div>
|
|
67
|
-
</div>
|
|
68
|
-
{#if col.text}
|
|
69
|
-
<div class="text-lg">
|
|
70
|
-
<p class="text-gray-500">{col.text}</p>
|
|
71
|
-
</div>
|
|
72
|
-
{/if}
|
|
73
|
-
</div>
|
|
74
|
-
</a>
|
|
75
|
-
</div>
|
|
76
|
-
{/each}
|
|
77
|
-
</dl>
|
|
10
|
+
<div class="mx-auto w-full">
|
|
11
|
+
{#if data.title}
|
|
12
|
+
<h2 class="sr-only">{data.title}</h2>
|
|
13
|
+
{/if}
|
|
14
|
+
<dl class="space-y-10 sm:grid sm:grid-cols-2 sm:gap-8 sm:space-y-0 md:grid-cols-3">
|
|
15
|
+
{#each data.cards as card}
|
|
16
|
+
<Card bind:data={card} bind:halfHeight={data.halfHeight} />
|
|
17
|
+
{/each}
|
|
18
|
+
</dl>
|
|
78
19
|
</div>
|
|
@@ -2,16 +2,7 @@
|
|
|
2
2
|
/** @typedef {typeof __propDef.events} ThreeColumnEvents */
|
|
3
3
|
/** @typedef {typeof __propDef.slots} ThreeColumnSlots */
|
|
4
4
|
export default class ThreeColumn extends SvelteComponentTyped<{
|
|
5
|
-
data
|
|
6
|
-
icon: string;
|
|
7
|
-
classes: string;
|
|
8
|
-
image: string;
|
|
9
|
-
heading: string;
|
|
10
|
-
subheading: string;
|
|
11
|
-
text: string;
|
|
12
|
-
linkURL: string;
|
|
13
|
-
}[];
|
|
14
|
-
title?: string;
|
|
5
|
+
data: any;
|
|
15
6
|
}, {
|
|
16
7
|
[evt: string]: CustomEvent<any>;
|
|
17
8
|
}, {}> {
|
|
@@ -22,16 +13,7 @@ export type ThreeColumnSlots = typeof __propDef.slots;
|
|
|
22
13
|
import { SvelteComponentTyped } from "svelte";
|
|
23
14
|
declare const __propDef: {
|
|
24
15
|
props: {
|
|
25
|
-
data
|
|
26
|
-
icon: string;
|
|
27
|
-
classes: string;
|
|
28
|
-
image: string;
|
|
29
|
-
heading: string;
|
|
30
|
-
subheading: string;
|
|
31
|
-
text: string;
|
|
32
|
-
linkURL: string;
|
|
33
|
-
}[];
|
|
34
|
-
title?: string;
|
|
16
|
+
data: any;
|
|
35
17
|
};
|
|
36
18
|
events: {
|
|
37
19
|
[evt: string]: CustomEvent<any>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<script
|
|
1
|
+
<script>import CountrySelector from './CountrySelector.svelte';
|
|
2
2
|
import Icon from './Icon.svelte';
|
|
3
3
|
import { onMount } from 'svelte';
|
|
4
4
|
import { scrollTo, validateEmail } from '../utils.js';
|
|
@@ -242,7 +242,7 @@ const submitForm = async () => {
|
|
|
242
242
|
</div>
|
|
243
243
|
</div>
|
|
244
244
|
|
|
245
|
-
<style
|
|
245
|
+
<style>
|
|
246
246
|
.confident {
|
|
247
247
|
@apply hidden;
|
|
248
248
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
export let data = {};
|
|
3
|
+
export let v = '';
|
|
4
|
+
let id;
|
|
5
|
+
|
|
6
|
+
if (v) {
|
|
7
|
+
id = v;
|
|
8
|
+
}
|
|
9
|
+
else if (data) {
|
|
10
|
+
id = data.v;
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
id = '';
|
|
14
|
+
}
|
|
15
|
+
</script>
|
|
16
|
+
|
|
17
|
+
<section class="w-full aspect-video border bg-black border-gray-200 shadow-md">
|
|
18
|
+
<iframe
|
|
19
|
+
src="https://www.youtube.com/embed/{id}"
|
|
20
|
+
title="YouTube Video ID {id}"
|
|
21
|
+
class="w-full aspect-video"
|
|
22
|
+
frameborder="0"
|
|
23
|
+
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
|
|
24
|
+
allowfullscreen>
|
|
25
|
+
</iframe>
|
|
26
|
+
</section>
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} VideoProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} VideoEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} VideoSlots */
|
|
4
|
+
export default class Video extends SvelteComponentTyped<{
|
|
5
|
+
data?: {};
|
|
6
|
+
v?: string;
|
|
7
|
+
}, {
|
|
8
|
+
[evt: string]: CustomEvent<any>;
|
|
9
|
+
}, {}> {
|
|
10
|
+
}
|
|
11
|
+
export type VideoProps = typeof __propDef.props;
|
|
12
|
+
export type VideoEvents = typeof __propDef.events;
|
|
13
|
+
export type VideoSlots = typeof __propDef.slots;
|
|
14
|
+
import { SvelteComponentTyped } from "svelte";
|
|
15
|
+
declare const __propDef: {
|
|
16
|
+
props: {
|
|
17
|
+
data?: {};
|
|
18
|
+
v?: string;
|
|
19
|
+
};
|
|
20
|
+
events: {
|
|
21
|
+
[evt: string]: CustomEvent<any>;
|
|
22
|
+
};
|
|
23
|
+
slots: {};
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** @typedef {typeof __propDef.props} WrapProps */
|
|
2
|
+
/** @typedef {typeof __propDef.events} WrapEvents */
|
|
3
|
+
/** @typedef {typeof __propDef.slots} WrapSlots */
|
|
4
|
+
export default class Wrap extends SvelteComponentTyped<{
|
|
5
|
+
[x: string]: any;
|
|
6
|
+
tag?: string;
|
|
7
|
+
when?: boolean;
|
|
8
|
+
}, {
|
|
9
|
+
[evt: string]: CustomEvent<any>;
|
|
10
|
+
}, {
|
|
11
|
+
default: {};
|
|
12
|
+
}> {
|
|
13
|
+
}
|
|
14
|
+
export type WrapProps = typeof __propDef.props;
|
|
15
|
+
export type WrapEvents = typeof __propDef.events;
|
|
16
|
+
export type WrapSlots = typeof __propDef.slots;
|
|
17
|
+
import { SvelteComponentTyped } from "svelte";
|
|
18
|
+
declare const __propDef: {
|
|
19
|
+
props: {
|
|
20
|
+
[x: string]: any;
|
|
21
|
+
tag?: string;
|
|
22
|
+
when?: boolean;
|
|
23
|
+
};
|
|
24
|
+
events: {
|
|
25
|
+
[evt: string]: CustomEvent<any>;
|
|
26
|
+
};
|
|
27
|
+
slots: {
|
|
28
|
+
default: {};
|
|
29
|
+
};
|
|
30
|
+
};
|
|
31
|
+
export {};
|
package/layouts/blocks.svelte
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
<script>
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
2
|
+
import CTA from '../components/CTA.svelte';
|
|
3
|
+
import HeadingCentered from '../components/HeadingCentered.svelte';
|
|
4
|
+
import MediaFeature from '../components/MediaFeature.svelte';
|
|
5
|
+
import Modal from '../components/Modal.svelte';
|
|
6
|
+
import NewsGrid from '../components/NewsGrid.svelte';
|
|
7
|
+
import SidebarContent from '../components/SidebarContent.svelte';
|
|
8
|
+
import ThreeColumn from '../components/ThreeColumn.svelte';
|
|
9
|
+
import TrialForm from '../components/TrialForm.svelte';
|
|
10
|
+
import Video from '../components/Video.svelte';
|
|
11
|
+
|
|
12
|
+
let blocks = [
|
|
13
|
+
{ref: "cta-center", component: CTA},
|
|
14
|
+
{ref: "heading-centered", component: HeadingCentered},
|
|
15
|
+
{ref: "media-feature", component: MediaFeature},
|
|
16
|
+
{ref: "modal", component: Modal},
|
|
17
|
+
{ref: "news-grid", component: NewsGrid},
|
|
18
|
+
{ref: "sidebar-content", component: SidebarContent},
|
|
19
|
+
{ref: "three-column", component: ThreeColumn},
|
|
20
|
+
{ref: "trial-form", component: TrialForm},
|
|
21
|
+
{ref: "video", component: Video},
|
|
22
|
+
]
|
|
10
23
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
24
|
+
export let title;
|
|
25
|
+
export let date;
|
|
26
|
+
export let lastmod;
|
|
27
|
+
export let summary;
|
|
28
|
+
export let layout;
|
|
29
|
+
export let page_sections;
|
|
17
30
|
</script>
|
|
18
31
|
|
|
19
32
|
<svelte:head>
|
|
@@ -21,28 +34,12 @@
|
|
|
21
34
|
<meta name="description" content={summary}>
|
|
22
35
|
</svelte:head>
|
|
23
36
|
|
|
24
|
-
<article class="flex flex-col space-y-12">
|
|
25
|
-
{#each page_sections as section}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
{:else if section.fieldGroup == "video"}
|
|
33
|
-
<YT bind:v={section.v} />
|
|
34
|
-
{:else if section.fieldGroup == "cta-center"}
|
|
35
|
-
<CTA bind:data={section} />
|
|
36
|
-
{:else if section.fieldGroup == "sidebar-content"}
|
|
37
|
-
<SidebarContent bind:data={section} {title} {date} {lastmod} {summary}>
|
|
38
|
-
<slot/>
|
|
39
|
-
</SidebarContent>
|
|
40
|
-
{:else if section.fieldGroup == "media-feature"}
|
|
41
|
-
<MediaFeature bind:data={section} />
|
|
42
|
-
{:else if section.fieldGroup == "trial"}
|
|
43
|
-
<TrialForm />
|
|
44
|
-
{:else if section.fieldGroup == "content"}
|
|
45
|
-
<div class="content prose"><slot/></div>
|
|
46
|
-
{/if}
|
|
47
|
-
{/each}
|
|
37
|
+
<article class="flex flex-col space-y-12 {layout}">
|
|
38
|
+
{#each page_sections as section}
|
|
39
|
+
{#if (section) && (section.fieldGroup === "sidebar-content")}
|
|
40
|
+
<svelte:component this={blocks.find(obj=>obj.ref===section.fieldGroup).component} data={section} {title} {date} {lastmod}><slot/></svelte:component>
|
|
41
|
+
{:else if (section) && (section.fieldGroup != "sidebar-content")}
|
|
42
|
+
<svelte:component this={blocks.find(obj=>obj.ref===section.fieldGroup).component} data={section} />
|
|
43
|
+
{/if}
|
|
44
|
+
{/each}
|
|
48
45
|
</article>
|
|
@@ -5,9 +5,9 @@ export default class Blocks extends SvelteComponentTyped<{
|
|
|
5
5
|
title: any;
|
|
6
6
|
date: any;
|
|
7
7
|
lastmod: any;
|
|
8
|
-
page_sections: any;
|
|
9
|
-
posts: any;
|
|
10
8
|
summary: any;
|
|
9
|
+
layout: any;
|
|
10
|
+
page_sections: any;
|
|
11
11
|
}, {
|
|
12
12
|
[evt: string]: CustomEvent<any>;
|
|
13
13
|
}, {
|
|
@@ -23,9 +23,9 @@ declare const __propDef: {
|
|
|
23
23
|
title: any;
|
|
24
24
|
date: any;
|
|
25
25
|
lastmod: any;
|
|
26
|
-
page_sections: any;
|
|
27
|
-
posts: any;
|
|
28
26
|
summary: any;
|
|
27
|
+
layout: any;
|
|
28
|
+
page_sections: any;
|
|
29
29
|
};
|
|
30
30
|
events: {
|
|
31
31
|
[evt: string]: CustomEvent<any>;
|
package/package.json
CHANGED
|
@@ -1,49 +1,50 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tecitheme",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.18",
|
|
4
4
|
"svelte": true,
|
|
5
5
|
"devDependencies": {
|
|
6
6
|
"@jsdevtools/rehype-toc": "^3.0.2",
|
|
7
7
|
"@sveltejs/adapter-auto": "next",
|
|
8
8
|
"@sveltejs/adapter-netlify": "next",
|
|
9
9
|
"@sveltejs/kit": "next",
|
|
10
|
-
"@tailwindcss/forms": "^0.5.
|
|
10
|
+
"@tailwindcss/forms": "^0.5.1",
|
|
11
11
|
"@tailwindcss/typography": "^0.5.2",
|
|
12
|
-
"@types/cookie": "^0.
|
|
13
|
-
"@typescript-eslint/eslint-plugin": "^
|
|
14
|
-
"@typescript-eslint/parser": "^
|
|
15
|
-
"autoprefixer": "^10.4.
|
|
12
|
+
"@types/cookie": "^0.5.1",
|
|
13
|
+
"@typescript-eslint/eslint-plugin": "^5.19.0",
|
|
14
|
+
"@typescript-eslint/parser": "^5.22.0",
|
|
15
|
+
"autoprefixer": "^10.4.7",
|
|
16
16
|
"dotenv": "^16.0.0",
|
|
17
17
|
"encoding": "^0.1.13",
|
|
18
|
-
"eslint": "^
|
|
19
|
-
"eslint-config-prettier": "^8.
|
|
20
|
-
"eslint-plugin-svelte3": "^3.4.
|
|
21
|
-
"luxon": "^2.3.
|
|
18
|
+
"eslint": "^8.14.0",
|
|
19
|
+
"eslint-config-prettier": "^8.5.0",
|
|
20
|
+
"eslint-plugin-svelte3": "^3.4.1",
|
|
21
|
+
"luxon": "^2.3.2",
|
|
22
22
|
"mdsvex": "^0.10.5",
|
|
23
|
-
"postcss": "^8.4.
|
|
24
|
-
"prettier": "^2.
|
|
25
|
-
"prettier-plugin-tailwindcss": "^0.1.
|
|
23
|
+
"postcss": "^8.4.13",
|
|
24
|
+
"prettier": "^2.6.2",
|
|
25
|
+
"prettier-plugin-tailwindcss": "^0.1.10",
|
|
26
26
|
"rehype-parse": "^8.0.4",
|
|
27
27
|
"rehype-slug": "^5.0.1",
|
|
28
28
|
"rehype-stringify": "^9.0.3",
|
|
29
29
|
"stream": "^0.0.2",
|
|
30
|
-
"svelte": "^3.
|
|
31
|
-
"svelte-check": "^2.
|
|
30
|
+
"svelte": "^3.48.0",
|
|
31
|
+
"svelte-check": "^2.7.0",
|
|
32
32
|
"svelte-cubed": "^0.2.1",
|
|
33
|
-
"svelte-
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"vite
|
|
33
|
+
"svelte-paginate": "^0.0.1",
|
|
34
|
+
"svelte-preprocess": "^4.10.6",
|
|
35
|
+
"svelte2tsx": "^0.5.9",
|
|
36
|
+
"tailwindcss": "^3.0.24",
|
|
37
|
+
"three": "^0.140.0",
|
|
38
|
+
"tslib": "^2.4.0",
|
|
39
|
+
"typescript": "^4.6.4",
|
|
40
|
+
"vite": "^2.9.8",
|
|
41
|
+
"vite-plugin-autoimport": "^1.6.6"
|
|
41
42
|
},
|
|
42
43
|
"type": "module",
|
|
43
44
|
"dependencies": {
|
|
44
45
|
"@lukeed/uuid": "^2.0.0",
|
|
45
|
-
"cookie": "^0.
|
|
46
|
-
"katex": "^0.15.
|
|
46
|
+
"cookie": "^0.5.0",
|
|
47
|
+
"katex": "^0.15.3"
|
|
47
48
|
},
|
|
48
49
|
"exports": {
|
|
49
50
|
"./package.json": "./package.json",
|
|
@@ -51,20 +52,22 @@
|
|
|
51
52
|
"./components/Banner.svelte": "./components/Banner.svelte",
|
|
52
53
|
"./components/Button.svelte": "./components/Button.svelte",
|
|
53
54
|
"./components/CTA.svelte": "./components/CTA.svelte",
|
|
55
|
+
"./components/Card.svelte": "./components/Card.svelte",
|
|
54
56
|
"./components/CountrySelector.svelte": "./components/CountrySelector.svelte",
|
|
55
57
|
"./components/Figure.svelte": "./components/Figure.svelte",
|
|
56
58
|
"./components/Footer.svelte": "./components/Footer.svelte",
|
|
57
59
|
"./components/Header.svelte": "./components/Header.svelte",
|
|
60
|
+
"./components/HeadingCentered.svelte": "./components/HeadingCentered.svelte",
|
|
58
61
|
"./components/Icon.svelte": "./components/Icon.svelte",
|
|
59
62
|
"./components/Math.svelte": "./components/Math.svelte",
|
|
60
63
|
"./components/MediaFeature.svelte": "./components/MediaFeature.svelte",
|
|
61
64
|
"./components/Modal.svelte": "./components/Modal.svelte",
|
|
62
65
|
"./components/NewsGrid.svelte": "./components/NewsGrid.svelte",
|
|
63
|
-
"./components/SectionHeaderCentered.svelte": "./components/SectionHeaderCentered.svelte",
|
|
64
66
|
"./components/SidebarContent.svelte": "./components/SidebarContent.svelte",
|
|
65
67
|
"./components/ThreeColumn.svelte": "./components/ThreeColumn.svelte",
|
|
66
68
|
"./components/TrialForm.svelte": "./components/TrialForm.svelte",
|
|
67
|
-
"./components/
|
|
69
|
+
"./components/Video.svelte": "./components/Video.svelte",
|
|
70
|
+
"./components/Wrap.svelte": "./components/Wrap.svelte",
|
|
68
71
|
"./layouts/blocks.svelte": "./layouts/blocks.svelte",
|
|
69
72
|
"./req_utils": "./req_utils.js",
|
|
70
73
|
"./utils": "./utils.js",
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
//Based on: https://tailwindui.com/components/marketing/sections/header#component-2c3b25e7b9e4490edd7b6950692c0a11
|
|
3
|
-
|
|
4
|
-
export let data = {
|
|
5
|
-
toptext: 'Small Top Text ',
|
|
6
|
-
title: 'Big Title Text',
|
|
7
|
-
subtitle: 'Subtitle Text - Fairly long to see where the text wraps for this element, because who knows where things will end up.'
|
|
8
|
-
};
|
|
9
|
-
</script>
|
|
10
|
-
|
|
11
|
-
<!-- This example requires Tailwind CSS v2.0+ -->
|
|
12
|
-
<div class="w-full text-center">
|
|
13
|
-
{#if data.toptext}
|
|
14
|
-
<h2 class="text-base font-semibold text-teci-blue-dark tracking-wide uppercase">
|
|
15
|
-
{data.toptext}
|
|
16
|
-
</h2>
|
|
17
|
-
{/if}
|
|
18
|
-
<p class="mt-1 text-4xl font-bold text-gray-900 sm:text-5xl sm:tracking-tight lg:text-6xl">
|
|
19
|
-
{data.title}
|
|
20
|
-
</p>
|
|
21
|
-
{#if data.subtitle}
|
|
22
|
-
<p class="max-w-4xl mt-5 mx-auto text-xl text-gray-500">
|
|
23
|
-
{data.subtitle}
|
|
24
|
-
</p>
|
|
25
|
-
{/if}
|
|
26
|
-
</div>
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/** @typedef {typeof __propDef.props} SectionHeaderCenteredProps */
|
|
2
|
-
/** @typedef {typeof __propDef.events} SectionHeaderCenteredEvents */
|
|
3
|
-
/** @typedef {typeof __propDef.slots} SectionHeaderCenteredSlots */
|
|
4
|
-
export default class SectionHeaderCentered extends SvelteComponentTyped<{
|
|
5
|
-
data?: {
|
|
6
|
-
toptext: string;
|
|
7
|
-
title: string;
|
|
8
|
-
subtitle: string;
|
|
9
|
-
};
|
|
10
|
-
}, {
|
|
11
|
-
[evt: string]: CustomEvent<any>;
|
|
12
|
-
}, {}> {
|
|
13
|
-
}
|
|
14
|
-
export type SectionHeaderCenteredProps = typeof __propDef.props;
|
|
15
|
-
export type SectionHeaderCenteredEvents = typeof __propDef.events;
|
|
16
|
-
export type SectionHeaderCenteredSlots = typeof __propDef.slots;
|
|
17
|
-
import { SvelteComponentTyped } from "svelte";
|
|
18
|
-
declare const __propDef: {
|
|
19
|
-
props: {
|
|
20
|
-
data?: {
|
|
21
|
-
toptext: string;
|
|
22
|
-
title: string;
|
|
23
|
-
subtitle: string;
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
events: {
|
|
27
|
-
[evt: string]: CustomEvent<any>;
|
|
28
|
-
};
|
|
29
|
-
slots: {};
|
|
30
|
-
};
|
|
31
|
-
export {};
|
package/components/YT.svelte
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<script>
|
|
2
|
-
export let v
|
|
3
|
-
</script>
|
|
4
|
-
|
|
5
|
-
<section class="w-full aspect-video border bg-black border-gray-200 shadow-md">
|
|
6
|
-
<iframe
|
|
7
|
-
src="https://www.youtube-nocookie.com/embed/{v}?rel=0&modestbranding=1"
|
|
8
|
-
title="YouTube Video ID {v}"
|
|
9
|
-
class="w-full aspect-video"
|
|
10
|
-
frameborder="0"
|
|
11
|
-
allow="accelerometer; clipboard-write; encrypted-media; gyroscope"
|
|
12
|
-
allowfullscreen
|
|
13
|
-
/>
|
|
14
|
-
</section>
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
/** @typedef {typeof __propDef.props} YtProps */
|
|
2
|
-
/** @typedef {typeof __propDef.events} YtEvents */
|
|
3
|
-
/** @typedef {typeof __propDef.slots} YtSlots */
|
|
4
|
-
export default class Yt extends SvelteComponentTyped<{
|
|
5
|
-
v: any;
|
|
6
|
-
}, {
|
|
7
|
-
[evt: string]: CustomEvent<any>;
|
|
8
|
-
}, {}> {
|
|
9
|
-
}
|
|
10
|
-
export type YtProps = typeof __propDef.props;
|
|
11
|
-
export type YtEvents = typeof __propDef.events;
|
|
12
|
-
export type YtSlots = typeof __propDef.slots;
|
|
13
|
-
import { SvelteComponentTyped } from "svelte";
|
|
14
|
-
declare const __propDef: {
|
|
15
|
-
props: {
|
|
16
|
-
v: any;
|
|
17
|
-
};
|
|
18
|
-
events: {
|
|
19
|
-
[evt: string]: CustomEvent<any>;
|
|
20
|
-
};
|
|
21
|
-
slots: {};
|
|
22
|
-
};
|
|
23
|
-
export {};
|