tecitheme 0.0.19 → 0.0.22

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.
@@ -5,27 +5,27 @@
5
5
  </script>
6
6
 
7
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}
8
+ <section class="w-full text-center">
9
+ {#if data.toptext}
10
+ <p class="text-base font-semibold text-teci-blue-dark uppercase">
11
+ {data.toptext}
29
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>
30
24
  {/if}
31
- </div>
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
+ </section>
@@ -4,16 +4,18 @@ import Video from './Video.svelte'
4
4
  export let data;
5
5
  </script>
6
6
 
7
- <section class="w-full mx-auto flex flex-col md:flex-row items-center justify-center">
7
+ <section class="w-full mx-auto flex flex-col md:flex-row items-start justify-center">
8
8
  {#if data.v}
9
- <div class="w-full max-w-xl {data.position === 'right' ? 'mb-4 md:mb-0' : 'mb-0'}">
9
+ <div class="block w-full max-w-xl {data.position === 'right' ? 'mb-4 md:mb-0' : 'mb-0'}">
10
10
  <Video bind:data />
11
11
  </div>
12
12
  {:else if data.image}
13
- <div class="block w-full max-w-xl mb-4 md:mb-0">
13
+ <div class="block w-full max-w-xl {data.position === 'right' ? 'mb-4 md:mb-0' : 'mb-0'}">
14
14
  <figure>
15
15
  <a href={data.image}>
16
- <img class="aspect-video object-cover" src={data.image} alt={data.name}/>
16
+ <img class="w-full aspect-video object-cover border bg-black border-gray-200 shadow-md {data.imageClass ? data.imageClass : ''}"
17
+ src={data.image} alt={data.name}
18
+ />
17
19
  </a>
18
20
  </figure>
19
21
  </div>
@@ -0,0 +1,28 @@
1
+ <script>
2
+ export let title
3
+ export let description
4
+ export let image
5
+ export let url
6
+
7
+ function imageURL(str)
8
+ {
9
+ var tarea = str;
10
+ if (tarea.indexOf("http://") == 0 || tarea.indexOf("https://") == 0) {
11
+ return true
12
+ }
13
+ return false
14
+ }
15
+ </script>
16
+
17
+ <meta property="og:type" content="website">
18
+ <meta property="og:url" content="{url.href}">
19
+ <meta name="og:title" content={title} >
20
+ <meta name="og:description" content={description} >
21
+ {#if imageURL(image)}
22
+ <meta name="og:image" content="{image}" >
23
+ {:else}
24
+ <meta name="og:image" content="https://{url.hostname}{image}" >
25
+ {/if}
26
+ <meta name="twitter:card" content="summary_large_image">
27
+ <meta name="twitter:site" content="@thunderheadeng">
28
+ <meta name="twitter:creator" content="@thunderheadeng">
@@ -0,0 +1,29 @@
1
+ /** @typedef {typeof __propDef.props} MetaSocialProps */
2
+ /** @typedef {typeof __propDef.events} MetaSocialEvents */
3
+ /** @typedef {typeof __propDef.slots} MetaSocialSlots */
4
+ export default class MetaSocial extends SvelteComponentTyped<{
5
+ title: any;
6
+ description: any;
7
+ image: any;
8
+ url: any;
9
+ }, {
10
+ [evt: string]: CustomEvent<any>;
11
+ }, {}> {
12
+ }
13
+ export type MetaSocialProps = typeof __propDef.props;
14
+ export type MetaSocialEvents = typeof __propDef.events;
15
+ export type MetaSocialSlots = typeof __propDef.slots;
16
+ import { SvelteComponentTyped } from "svelte";
17
+ declare const __propDef: {
18
+ props: {
19
+ title: any;
20
+ description: any;
21
+ image: any;
22
+ url: any;
23
+ };
24
+ events: {
25
+ [evt: string]: CustomEvent<any>;
26
+ };
27
+ slots: {};
28
+ };
29
+ export {};
@@ -1,7 +1,8 @@
1
1
  <script>
2
- import { DateTime } from "luxon";
2
+ import { DateTime } from 'luxon';
3
3
  import { getContext } from 'svelte';
4
- import { paginate, LightPaginationNav } from 'svelte-paginate'
4
+ import { paginate, PaginationNav } from 'svelte-paginate';
5
+ import Icon from './Icon.svelte'
5
6
 
6
7
  export let data;
7
8
 
@@ -13,21 +14,25 @@
13
14
  let pageSize = data.pageSize;
14
15
 
15
16
  function termExists(arr, terms) {
16
- return terms.some(value => {
17
- return arr.includes(value)
18
- });
17
+ if (arr) {
18
+ return terms.some((term) => {
19
+ return arr.includes(term);
20
+ });
21
+ } else {
22
+ return false
23
+ }
19
24
  }
20
25
 
21
26
  function filterPosts(arr, terms) {
22
- for (let i = 0; i < arr.length;) {
27
+ for (let i = 0; i < arr.length; ) {
23
28
  if (termExists(arr[i].meta.categories, terms)) {
24
29
  i++;
25
- continue
26
- };
27
- arr.splice(i,1)
28
- };
30
+ continue;
31
+ }
32
+ arr.splice(i, 1);
33
+ }
29
34
  return arr;
30
- };
35
+ }
31
36
 
32
37
  if (data.filter) {
33
38
  items = filterPosts(posts, data.filter);
@@ -35,58 +40,110 @@
35
40
  items = posts;
36
41
  }
37
42
 
38
- $: paginatedItems = paginate({ items, pageSize, currentPage })
43
+ $: paginatedItems = paginate({ items, pageSize, currentPage });
39
44
  </script>
40
45
 
41
- <div class="relative mx-auto w-full">
42
- <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">
46
+ <div class="relative w-full mx-auto">
47
+ <div
48
+ class="flex flex-col justify-between space-y-4 border-b-2 border-gray-200 pb-4 sm:flex-row sm:items-end sm:space-y-0"
49
+ >
43
50
  <div>
44
- <h1 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">{data.title}</h1>
51
+ <h1 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
52
+ {data.title}
53
+ </h1>
45
54
  <p class="text-xl text-gray-500">{data.subtitle}</p>
46
55
  </div>
47
56
  <div class="w-32">
48
- <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>
49
- <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>
57
+ <data
58
+ id="mj-w-res-data"
59
+ data-token="f594659941689957f270ca278a80dc7d"
60
+ class="mj-w-data"
61
+ data-apikey="3aOX"
62
+ data-w-id="Fbu"
63
+ data-lang="en_US"
64
+ data-base="https://app.mailjet.com"
65
+ data-width="640"
66
+ data-height="480"
67
+ data-statics="statics"></data>
68
+ <button
69
+ class="flex w-full items-center justify-center border border-transparent bg-teci-blue-light px-4 py-2 text-base font-medium leading-6 text-white transition duration-150 ease-in-out hover:bg-teci-blue-dark focus:border-teci-blue-dark focus:outline-none"
70
+ data-token="f594659941689957f270ca278a80dc7d"
71
+ onclick="mjOpenPopin(event, this)">Subscribe</button
72
+ >
50
73
  </div>
51
74
  </div>
52
- <div class="pt-8 w-auto max-w-sm mx-auto">
53
- <LightPaginationNav
75
+ {#if (items.length > 0)}
76
+ <div class="paginator mx-auto flex justify-center pt-4">
77
+ <PaginationNav
54
78
  totalItems="{items.length}"
55
79
  pageSize="{pageSize ? pageSize : 6}"
56
80
  currentPage="{currentPage}"
57
81
  limit="{1}"
58
82
  showStepOptions="{true}"
59
- on:setPage="{(e) => currentPage = e.detail.page}"
83
+ on:setPage="{(e) => (currentPage = e.detail.page)}"
60
84
  />
61
85
  </div>
62
- <div class="grid gap-16 pt-8 md:grid-cols-2 lg:grid-cols-3 lg:gap-x-5 lg:gap-y-12">
86
+ <div
87
+ class="grid gap-16 pt-8 md:grid-cols-2 lg:grid-cols-3 lg:gap-x-5 lg:gap-y-12"
88
+ >
63
89
  {#each paginatedItems as post}
64
- <a class="block h-full" href={post.path}>
65
- <div class="flex flex-col items-stretch h-full">
66
- <time class="block mb-1 text-sm text-gray-500" datetime={post.meta.date}>{DateTime.fromISO(post.meta.date).toLocaleString()}</time>
67
- <p class="mb-2 text-xl font-semibold text-gray-900">{post.meta.title}</p>
68
- {#if post.meta.summary}
69
- <p class="flex-1 mb-2 text-base text-gray-500">
70
- {post.meta.summary.length > 190 ? post.meta.summary.substring(0,190) + " ..." : post.meta.summary}
71
- </p>
72
- {:else}
73
- <p class="flex-1 mb-2 text-base text-red-500">
74
- Missing Summary Text
75
- </p>
76
- {/if}
77
- <p class="text-sm font-semibold text-teci-blue-light hover:text-teci-blue-dark">Read full article<span aria-hidden="true">&nbsp;→</span></p>
78
- </div>
79
- </a>
90
+ <div class="h-full">
91
+ <a class="block" href="/{post.path}">
92
+ <div class="h-full flex flex-col items-stretch ">
93
+ <time
94
+ class="mb-1 block text-sm text-gray-500"
95
+ datetime="{post.meta.date}"
96
+ >{DateTime.fromISO(post.meta.date).toLocaleString()}</time
97
+ >
98
+ <p class="mb-2 text-xl font-semibold text-gray-900">
99
+ {post.meta.title}
100
+ </p>
101
+ {#if post.meta.summary}
102
+ <p class="mb-2 flex-1 text-base text-gray-500">
103
+ {post.meta.summary.length > 190
104
+ ? post.meta.summary.substring(0, 190) + ' ...'
105
+ : post.meta.summary}
106
+ </p>
107
+ {:else}
108
+ <p class="mb-2 flex-1 text-base text-red-500">
109
+ Missing Summary Text
110
+ </p>
111
+ {/if}
112
+ {#if post.meta.categories}
113
+ <div class="w-full mb-2 text-sm flex flex-row">
114
+ {#each (post.meta.categories.sort()) as term}
115
+ <a class="inline-block mr-2" href="/news/{term}" rel="external">
116
+ <span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs bg-teci-blue-dark text-white">{term}</span>
117
+ </a>
118
+ {/each}
119
+ </div>
120
+ {/if}
121
+ <p
122
+ class="text-sm font-semibold text-teci-blue-light hover:text-teci-blue-dark"
123
+ >
124
+ Read full article<span aria-hidden="true">&nbsp;→</span>
125
+ </p>
126
+ </div>
127
+ </a>
128
+ </div>
80
129
  {/each}
81
130
  </div>
82
- <div class="pt-8 w-auto max-w-sm mx-auto">
83
- <LightPaginationNav
131
+ <div class="paginator mx-auto flex justify-center pt-8">
132
+ <PaginationNav
84
133
  totalItems="{items.length}"
85
134
  pageSize="{pageSize ? pageSize : 6}"
86
135
  currentPage="{currentPage}"
87
136
  limit="{1}"
88
137
  showStepOptions="{true}"
89
- on:setPage="{(e) => currentPage = e.detail.page}"
138
+ on:setPage="{(e) => (currentPage = e.detail.page)}"
90
139
  />
91
140
  </div>
141
+ {:else}
142
+ <div class="prose">
143
+ <p class="pt-8">
144
+ Sorry, there isn't any news for you to see here.<br>
145
+ Please visit the <a rel="external" href="/news">All News</a> page for an updated list.
146
+ </p>
147
+ </div>
148
+ {/if}
92
149
  </div>
@@ -26,11 +26,13 @@
26
26
  <section bind:clientWidth={w} class="relative flex flex-row { data.fullWidth ? 'mx-0' : 'mx-auto'} {(data.toc || data.rightRail) ? 'md:space-x-8' : 'space-x-0'}">
27
27
 
28
28
  <div id="content" class="prose w-full { data.fullWidth ? 'max-w-none' : 'max-w-prose'}">
29
+ {#if !data.hideTitle}
29
30
  <h1>{title}</h1>
30
- {#if formattedDate}
31
- <p>Published: {formattedDate}{#if (formattedLastModDate != formattedDate && formattedLastModDate)}, Updated: {formattedLastModDate}{/if}</p>
32
31
  {/if}
33
32
  <slot />
33
+ {#if (formattedDate && data.showDate)}
34
+ <p class="text-sm">Published: {formattedDate}{#if (formattedLastModDate != formattedDate && formattedLastModDate)}, Updated: {formattedLastModDate}{/if}</p>
35
+ {/if}
34
36
  </div>
35
37
  <aside class="relative w-0 {(data.toc || data.rightRail) ? 'md:w-60' : 'hidden'}">
36
38
  {#if data.toc}
@@ -7,7 +7,7 @@
7
7
  </script>
8
8
 
9
9
  <!-- This example requires Tailwind CSS v2.0+ -->
10
- <div class="mx-auto w-full">
10
+ <section class="mx-auto w-full">
11
11
  {#if data.title}
12
12
  <h2 class="sr-only">{data.title}</h2>
13
13
  {/if}
@@ -16,4 +16,4 @@
16
16
  <Card bind:data={card} bind:halfHeight={data.halfHeight} />
17
17
  {/each}
18
18
  </div>
19
- </div>
19
+ </section>
@@ -1,4 +1,6 @@
1
1
  <script>
2
+ import {page} from "$app/stores"
3
+
2
4
  import CTA from '../components/CTA.svelte';
3
5
  import HeadingCentered from '../components/HeadingCentered.svelte';
4
6
  import MediaFeature from '../components/MediaFeature.svelte';
@@ -8,6 +10,7 @@
8
10
  import ThreeColumn from '../components/ThreeColumn.svelte';
9
11
  import TrialForm from '../components/TrialForm.svelte';
10
12
  import Video from '../components/Video.svelte';
13
+ import MetaSocial from '../components/MetaSocial.svelte';
11
14
 
12
15
  let blocks = [
13
16
  {ref: "cta-center", component: CTA},
@@ -25,13 +28,23 @@
25
28
  export let date;
26
29
  export let lastmod;
27
30
  export let summary;
31
+ export let images = [];
28
32
  export let layout;
29
33
  export let page_sections;
34
+
35
+ let featuredImage;
36
+
37
+ if (images.length > 0) {
38
+ featuredImage = images[0]
39
+ } else {
40
+ featuredImage = "https://www.thunderheadeng.com/wp-content/uploads/2022/01/femtc-brno.jpg"
41
+ }
30
42
  </script>
31
43
 
32
44
  <svelte:head>
33
45
  <title>{title} | Thunderhead Engineering</title>
34
46
  <meta name="description" content={summary}>
47
+ <MetaSocial title={title} description={summary} image={featuredImage} url={$page.url} />
35
48
  </svelte:head>
36
49
 
37
50
  <article class="flex flex-col space-y-12 {layout}">
@@ -2,12 +2,13 @@
2
2
  /** @typedef {typeof __propDef.events} BlocksEvents */
3
3
  /** @typedef {typeof __propDef.slots} BlocksSlots */
4
4
  export default class Blocks extends SvelteComponentTyped<{
5
+ summary: any;
5
6
  title: any;
6
7
  date: any;
7
8
  lastmod: any;
8
- summary: any;
9
9
  layout: any;
10
10
  page_sections: any;
11
+ images?: any[];
11
12
  }, {
12
13
  [evt: string]: CustomEvent<any>;
13
14
  }, {
@@ -20,12 +21,13 @@ export type BlocksSlots = typeof __propDef.slots;
20
21
  import { SvelteComponentTyped } from "svelte";
21
22
  declare const __propDef: {
22
23
  props: {
24
+ summary: any;
23
25
  title: any;
24
26
  date: any;
25
27
  lastmod: any;
26
- summary: any;
27
28
  layout: any;
28
29
  page_sections: any;
30
+ images?: any[];
29
31
  };
30
32
  events: {
31
33
  [evt: string]: CustomEvent<any>;
package/package.json CHANGED
@@ -1,50 +1,47 @@
1
1
  {
2
2
  "name": "tecitheme",
3
- "version": "0.0.19",
3
+ "version": "0.0.22",
4
4
  "svelte": true,
5
5
  "devDependencies": {
6
6
  "@jsdevtools/rehype-toc": "^3.0.2",
7
- "@sveltejs/adapter-auto": "next",
8
7
  "@sveltejs/adapter-netlify": "next",
9
8
  "@sveltejs/kit": "next",
10
9
  "@tailwindcss/forms": "^0.5.1",
11
10
  "@tailwindcss/typography": "^0.5.2",
12
11
  "@types/cookie": "^0.5.1",
13
- "@typescript-eslint/eslint-plugin": "^5.19.0",
14
- "@typescript-eslint/parser": "^5.22.0",
12
+ "@typescript-eslint/eslint-plugin": "^5.27.0",
13
+ "@typescript-eslint/parser": "^5.27.0",
15
14
  "autoprefixer": "^10.4.7",
16
- "dotenv": "^16.0.0",
15
+ "dotenv": "^16.0.1",
17
16
  "encoding": "^0.1.13",
18
- "eslint": "^8.14.0",
17
+ "eslint": "^8.16.0",
19
18
  "eslint-config-prettier": "^8.5.0",
20
- "eslint-plugin-svelte3": "^3.4.1",
21
- "luxon": "^2.3.2",
22
- "mdsvex": "^0.10.5",
23
- "postcss": "^8.4.13",
19
+ "eslint-plugin-svelte3": "^4.0.0",
20
+ "luxon": "^2.4.0",
21
+ "mdsvex": "^0.10.6",
22
+ "postcss": "^8.4.14",
24
23
  "prettier": "^2.6.2",
25
- "prettier-plugin-tailwindcss": "^0.1.10",
24
+ "prettier-plugin-tailwindcss": "^0.1.11",
26
25
  "rehype-parse": "^8.0.4",
27
26
  "rehype-slug": "^5.0.1",
28
27
  "rehype-stringify": "^9.0.3",
29
28
  "stream": "^0.0.2",
30
29
  "svelte": "^3.48.0",
31
- "svelte-check": "^2.7.0",
32
- "svelte-cubed": "^0.2.1",
30
+ "svelte-check": "^2.7.1",
33
31
  "svelte-paginate": "^0.0.1",
34
32
  "svelte-preprocess": "^4.10.6",
35
- "svelte2tsx": "^0.5.9",
33
+ "svelte2tsx": "^0.5.10",
36
34
  "tailwindcss": "^3.0.24",
37
- "three": "^0.140.0",
38
35
  "tslib": "^2.4.0",
39
- "typescript": "^4.6.4",
40
- "vite": "^2.9.8",
36
+ "typescript": "^4.7.2",
37
+ "vite": "^2.9.9",
41
38
  "vite-plugin-autoimport": "^1.6.6"
42
39
  },
43
40
  "type": "module",
44
41
  "dependencies": {
45
42
  "@lukeed/uuid": "^2.0.0",
46
43
  "cookie": "^0.5.0",
47
- "katex": "^0.15.3"
44
+ "katex": "^0.15.6"
48
45
  },
49
46
  "exports": {
50
47
  "./package.json": "./package.json",
@@ -61,6 +58,7 @@
61
58
  "./components/Icon.svelte": "./components/Icon.svelte",
62
59
  "./components/Math.svelte": "./components/Math.svelte",
63
60
  "./components/MediaFeature.svelte": "./components/MediaFeature.svelte",
61
+ "./components/MetaSocial.svelte": "./components/MetaSocial.svelte",
64
62
  "./components/Modal.svelte": "./components/Modal.svelte",
65
63
  "./components/NewsGrid.svelte": "./components/NewsGrid.svelte",
66
64
  "./components/SidebarContent.svelte": "./components/SidebarContent.svelte",