tecitheme 0.3.3 → 0.3.4

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.
Files changed (156) hide show
  1. package/.eslintrc.cjs +24 -0
  2. package/.frontmatter/content/mediaDb.json +1 -0
  3. package/.frontmatter/templates/article.md +11 -0
  4. package/.gitpod.yml +19 -0
  5. package/.vscode/ltex.dictionary.en-US.txt +3 -0
  6. package/.vscode/settings.json +7 -0
  7. package/dist/assets/js/store.d.ts +2 -0
  8. package/dist/assets/js/store.js +4 -0
  9. package/{components → dist/components}/CountrySelector.svelte +2 -2
  10. package/{components → dist/components}/Footer.svelte +24 -60
  11. package/{components → dist/components}/Footer.svelte.d.ts +2 -5
  12. package/{components → dist/components}/NewsGrid.svelte +3 -3
  13. package/{components → dist/components}/Video.svelte +1 -1
  14. package/{get-content.d.ts → dist/get-content.d.ts} +2 -1
  15. package/{get-content.js → dist/get-content.js} +5 -2
  16. package/{layouts → dist/layouts}/blocks.svelte +15 -15
  17. package/{site_config.json → dist/site_config.json} +1 -1
  18. package/frontmatter.json +17 -0
  19. package/mdsvex.config.js +19 -0
  20. package/netlify.toml +7 -0
  21. package/package.json +22 -46
  22. package/postcss.config.cjs +13 -0
  23. package/src/app.css +49 -0
  24. package/src/app.html +22 -0
  25. package/src/global.d.ts +5 -0
  26. package/src/lib/assets/TECi_logo.svelte +177 -0
  27. package/src/lib/assets/js/store.js +4 -0
  28. package/src/lib/components/Banner.svelte +91 -0
  29. package/src/lib/components/Button.svelte +12 -0
  30. package/src/lib/components/CTA.svelte +36 -0
  31. package/src/lib/components/CTABranded.svelte +15 -0
  32. package/src/lib/components/CTASplitImage.svelte +27 -0
  33. package/src/lib/components/Card.svelte +93 -0
  34. package/src/lib/components/ContentTwoColumns.svelte +47 -0
  35. package/src/lib/components/CountrySelector.svelte +167 -0
  36. package/src/lib/components/FeatureGrid.svelte +40 -0
  37. package/src/lib/components/Figure.svelte +37 -0
  38. package/src/lib/components/Footer.svelte +270 -0
  39. package/src/lib/components/Header.svelte +1230 -0
  40. package/src/lib/components/HeadingCentered.svelte +33 -0
  41. package/src/lib/components/Hero.svelte +72 -0
  42. package/src/lib/components/Icon.svelte +138 -0
  43. package/src/lib/components/LogoCloud.svelte +25 -0
  44. package/src/lib/components/Math.svelte +24 -0
  45. package/src/lib/components/MediaFeature.svelte +66 -0
  46. package/src/lib/components/Modal.svelte +68 -0
  47. package/src/lib/components/NewsGrid.svelte +182 -0
  48. package/src/lib/components/PricingTable.svelte +92 -0
  49. package/src/lib/components/SidebarContent.svelte +122 -0
  50. package/src/lib/components/Stats.svelte +34 -0
  51. package/src/lib/components/Subscribe.svelte +24 -0
  52. package/src/lib/components/Testimonial.svelte +169 -0
  53. package/src/lib/components/ThreeColumn.svelte +19 -0
  54. package/src/lib/components/TrialForm.svelte +302 -0
  55. package/src/lib/components/Video.svelte +118 -0
  56. package/src/lib/components/Wrap.svelte +12 -0
  57. package/src/lib/get-content.js +98 -0
  58. package/src/lib/layouts/blocks.svelte +93 -0
  59. package/src/lib/req_utils.js +63 -0
  60. package/src/lib/site_config.json +11 -0
  61. package/src/lib/utils.js +92 -0
  62. package/src/lib/variables.ts +3 -0
  63. package/src/routes/+layout.server.js +20 -0
  64. package/src/routes/+layout.svelte +24 -0
  65. package/src/routes/+page.md +61 -0
  66. package/src/routes/features/+page.md +78 -0
  67. package/src/routes/news/+page.md +21 -0
  68. package/src/routes/news/[slug]/+page.svelte +33 -0
  69. package/src/routes/news/[slug]/+page.ts +16 -0
  70. package/src/routes/news/filter/[tag]/+page.svelte +36 -0
  71. package/src/routes/news/filter/[tag]/+page.ts +14 -0
  72. package/src/routes/news/post1.md +45 -0
  73. package/src/routes/news/post2.md +46 -0
  74. package/src/routes/pathfinder/+page.md +240 -0
  75. package/src/routes/pathfinder/news/+page.md +20 -0
  76. package/src/routes/posts.json/+server.js +9 -0
  77. package/src/routes/product/+page.md +240 -0
  78. package/src/routes/product/news/+page.md +20 -0
  79. package/src/routes/product/trial/+page.svelte +7 -0
  80. package/src/routes/sidebar/+page.md +357 -0
  81. package/static/favicon.ico +0 -0
  82. package/static/uploads/company_pathfinder.png +0 -0
  83. package/static/uploads/company_petrasim.png +0 -0
  84. package/static/uploads/company_pyrosim.jpg +0 -0
  85. package/static/uploads/fire.jpg +0 -0
  86. package/static/uploads/pyrosim_libraries_386x395.png +0 -0
  87. package/static/uploads/rocks.jpg +0 -0
  88. package/static/uploads/water.jpg +0 -0
  89. package/svelte.config.js +32 -0
  90. package/tailwind.config.cjs +26 -0
  91. package/tsconfig.json +32 -0
  92. package/vite.config.js +20 -0
  93. package/components/MetaSocial.svelte +0 -15
  94. package/components/MetaSocial.svelte.d.ts +0 -29
  95. package/{assets → dist/assets}/TECi_logo.svelte +0 -0
  96. package/{assets → dist/assets}/TECi_logo.svelte.d.ts +0 -0
  97. package/{components → dist/components}/Banner.svelte +0 -0
  98. package/{components → dist/components}/Banner.svelte.d.ts +0 -0
  99. package/{components → dist/components}/Button.svelte +0 -0
  100. package/{components → dist/components}/Button.svelte.d.ts +0 -0
  101. package/{components → dist/components}/CTA.svelte +0 -0
  102. package/{components → dist/components}/CTA.svelte.d.ts +0 -0
  103. package/{components → dist/components}/CTABranded.svelte +0 -0
  104. package/{components → dist/components}/CTABranded.svelte.d.ts +0 -0
  105. package/{components → dist/components}/CTASplitImage.svelte +0 -0
  106. package/{components → dist/components}/CTASplitImage.svelte.d.ts +0 -0
  107. package/{components → dist/components}/Card.svelte +0 -0
  108. package/{components → dist/components}/Card.svelte.d.ts +0 -0
  109. package/{components → dist/components}/ContentTwoColumns.svelte +0 -0
  110. package/{components → dist/components}/ContentTwoColumns.svelte.d.ts +0 -0
  111. package/{components → dist/components}/CountrySelector.svelte.d.ts +0 -0
  112. package/{components → dist/components}/FeatureGrid.svelte +0 -0
  113. package/{components → dist/components}/FeatureGrid.svelte.d.ts +0 -0
  114. package/{components → dist/components}/Figure.svelte +0 -0
  115. package/{components → dist/components}/Figure.svelte.d.ts +0 -0
  116. package/{components → dist/components}/Header.svelte +0 -0
  117. package/{components → dist/components}/Header.svelte.d.ts +0 -0
  118. package/{components → dist/components}/HeadingCentered.svelte +0 -0
  119. package/{components → dist/components}/HeadingCentered.svelte.d.ts +0 -0
  120. package/{components → dist/components}/Hero.svelte +0 -0
  121. package/{components → dist/components}/Hero.svelte.d.ts +0 -0
  122. package/{components → dist/components}/Icon.svelte +0 -0
  123. package/{components → dist/components}/Icon.svelte.d.ts +0 -0
  124. package/{components → dist/components}/LogoCloud.svelte +0 -0
  125. package/{components → dist/components}/LogoCloud.svelte.d.ts +0 -0
  126. package/{components → dist/components}/Math.svelte +0 -0
  127. package/{components → dist/components}/Math.svelte.d.ts +0 -0
  128. package/{components → dist/components}/MediaFeature.svelte +0 -0
  129. package/{components → dist/components}/MediaFeature.svelte.d.ts +0 -0
  130. package/{components → dist/components}/Modal.svelte +0 -0
  131. package/{components → dist/components}/Modal.svelte.d.ts +0 -0
  132. package/{components → dist/components}/NewsGrid.svelte.d.ts +0 -0
  133. package/{components → dist/components}/PricingTable.svelte +0 -0
  134. package/{components → dist/components}/PricingTable.svelte.d.ts +0 -0
  135. package/{components → dist/components}/SidebarContent.svelte +0 -0
  136. package/{components → dist/components}/SidebarContent.svelte.d.ts +0 -0
  137. package/{components → dist/components}/Stats.svelte +0 -0
  138. package/{components → dist/components}/Stats.svelte.d.ts +0 -0
  139. package/{components → dist/components}/Subscribe.svelte +0 -0
  140. package/{components → dist/components}/Subscribe.svelte.d.ts +0 -0
  141. package/{components → dist/components}/Testimonial.svelte +0 -0
  142. package/{components → dist/components}/Testimonial.svelte.d.ts +0 -0
  143. package/{components → dist/components}/ThreeColumn.svelte +0 -0
  144. package/{components → dist/components}/ThreeColumn.svelte.d.ts +0 -0
  145. package/{components → dist/components}/TrialForm.svelte +0 -0
  146. package/{components → dist/components}/TrialForm.svelte.d.ts +0 -0
  147. package/{components → dist/components}/Video.svelte.d.ts +0 -0
  148. package/{components → dist/components}/Wrap.svelte +0 -0
  149. package/{components → dist/components}/Wrap.svelte.d.ts +0 -0
  150. package/{layouts → dist/layouts}/blocks.svelte.d.ts +2 -2
  151. /package/{req_utils.d.ts → dist/req_utils.d.ts} +0 -0
  152. /package/{req_utils.js → dist/req_utils.js} +0 -0
  153. /package/{utils.d.ts → dist/utils.d.ts} +0 -0
  154. /package/{utils.js → dist/utils.js} +0 -0
  155. /package/{variables.d.ts → dist/variables.d.ts} +0 -0
  156. /package/{variables.js → dist/variables.js} +0 -0
@@ -0,0 +1,33 @@
1
+ <script>
2
+ //Based on: https://tailwindui.com/components/marketing/sections/header#component-2c3b25e7b9e4490edd7b6950692c0a11
3
+ import Icon from "$lib/components/Icon.svelte";
4
+ export let data;
5
+ </script>
6
+
7
+ <!-- This example requires Tailwind CSS v2.0+ -->
8
+ <section class="w-full text-center">
9
+ {#if data.toptext}
10
+ <p class="text-base font-semibold uppercase text-teci-blue-dark">
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
22
+ class="mt-1 text-4xl font-bold text-gray-900 sm:text-5xl sm:tracking-tight lg:text-6xl"
23
+ >
24
+ {data.title}
25
+ </h1>
26
+ {/if}
27
+ {/if}
28
+ {#if data.subtitle}
29
+ <p class="mx-auto mt-5 max-w-4xl text-xl text-gray-500">
30
+ {data.subtitle}
31
+ </p>
32
+ {/if}
33
+ </section>
@@ -0,0 +1,72 @@
1
+ <script>
2
+ export let data
3
+ </script>
4
+
5
+ <section class="relative bg-white">
6
+ <div class="mx-auto max-w-7xl md:grid md:grid-cols-12 md:gap-x-8 md:px-0">
7
+ <div class="pt-0 pb-0 md:col-span-8 lg:col-span-7 xl:col-span-6">
8
+ <div class="mx-auto">
9
+ {#if data.logo}
10
+ <span class="sr-only">{data.title}</span>
11
+ <Icon icon={data.logo} classes="h-12 sm:h-20" />
12
+ {:else}
13
+ <h1 class="z-10 text-4xl font-bold tracking-tight sm:text-center sm:text-6xl">
14
+ {data.heading}
15
+ </h1>
16
+ {/if}
17
+ {#if data.banner_text}
18
+ <div class="mt-6 sm:mt-8 lg:mt-4">
19
+ <a href={data.banner_link_url} class="inline-flex space-x-6">
20
+ <span class="rounded-full bg-gray-300/10 px-3 py-1 text-sm font-semibold leading-6 {(data.color == "pyrosim" ? "text-pyrosim" : (data.color == "pathfinder" ? "text-pathfinder" : "text-teci-blue-dark"))} ring-1 ring-inset {(data.color == "pyrosim" ? "ring-pyrosim/20" : (data.color == "pathfinder" ? "ring-pathfinder/20" : "ring-teci-blue-dark/20"))}">{data.banner_text}</span>
21
+ <span class="inline-flex items-center space-x-1 text-sm font-medium leading-6 text-gray-400">
22
+ <span>{data.banner_link_text}</span>
23
+ <!-- Heroicon name: mini/chevron-right -->
24
+ <svg class="h-5 w-5 {(data.color == "pyrosim" ? "text-pyrosim" : (data.color == "pathfinder" ? "text-pathfinder" : "text-teci-blue-dark"))}" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
25
+ <path fill-rule="evenodd" d="M7.21 14.77a.75.75 0 01.02-1.06L11.168 10 7.23 6.29a.75.75 0 111.04-1.08l4.5 4.25a.75.75 0 010 1.08l-4.5 4.25a.75.75 0 01-1.06-.02z" clip-rule="evenodd" />
26
+ </svg>
27
+ </span>
28
+ </a>
29
+ </div>
30
+ {/if}
31
+ <h2 class="mt-10 text-4xl font-bold tracking-tight text-gray-900 sm:text-6xl">{data.tagline}</h2>
32
+ <p class="mt-6 text-lg leading-8 text-gray-600">{data.text}</p>
33
+ {#if data.ctas}
34
+ <div class="mt-10 flex gap-x-8 sm:justify-left">
35
+ {#each data.ctas as cta}
36
+ <a href={cta.url} class="inline-block px-4 py-1.5 text-base font-semibold leading-7 shadow-sm ring-1 ring-gray-900/10 hover:ring-gray-900/20 hover:bg-teci-blue-dark
37
+ {(cta.color == "pyrosim" ? "bg-pyrosim text-white" : (cta.color == "pathfinder" ? "bg-pathfinder text-white" : (cta.color == "white" ? "bg-white text-gray-600 hover:text-white" : "bg-teci-blue-dark text-white")))}
38
+ ">
39
+ {cta.text}
40
+ <span class="hidden sm:inline {(cta.color == "white" ? "text-gray-600" : "text-white")}" aria-hidden="true">&rarr;</span>
41
+ </a>
42
+ {/each}
43
+ </div>
44
+ {/if}
45
+ <div class="mt-16">
46
+ <section class="{(data.color == "pyrosim" ? "bg-pyrosim" : (data.color == "pathfinder" ? "bg-pathfinder" : "bg-teci-blue-dark"))}">
47
+ <div class="text-center mx-auto max-w-4xl py-10 px-6 sm:py-10 lg:px-8">
48
+ <h2 class="text-3xl font-bold tracking-tight text-white sm:text-2xl">
49
+ <span class="block">{@html data.heading}</span>
50
+ </h2>
51
+ <p class="mt-4 text-lg leading-6 text-gray-200">{@html data.body}</p>
52
+ <a href={data.cta_url} class="mt-8 inline-flex w-full items-center justify-center border border-transparent bg-white px-5 py-3 text-base font-medium text-gray-900 hover:bg-indigo-50 sm:w-auto">
53
+ {@html data.cta}
54
+ </a>
55
+ </div>
56
+ </section>
57
+ </div>
58
+ </div>
59
+ </div>
60
+ <div class="relative hidden md:block md:col-span-4 lg:col-span-5 xl:col-span-6">
61
+ {#if data.video}
62
+ <video src="https://teci-files.imgix.net/www/videos/{data.video}" autoplay="true" loop muted
63
+ class="absolute object-cover h-full w-full">
64
+ </video>
65
+ {:else if data.image}
66
+ <img src="https://teci-files.imgix.net/www/images/{data.image}?fmt=auto" alt={data.heading}
67
+ class="absolute object-cover h-full w-full"
68
+ >
69
+ {/if}
70
+ </div>
71
+ </div>
72
+ </section>
@@ -0,0 +1,138 @@
1
+ <script>
2
+ // Allows icons from https://fonts.google.com/icons?selected=Material+Icons by name in the format 'icon-XXXX'.
3
+ export let icon;
4
+ export let classes;
5
+ </script>
6
+
7
+ {#if icon == "pyrosim"}
8
+ <span class="not-prose">
9
+ <img
10
+ class={classes}
11
+ src="https://files.thunderheadeng.com/www/images/pyrosim_icon.svg"
12
+ alt="PyroSim"
13
+ title="PyroSim Icon"
14
+ />
15
+ </span>
16
+ {:else if icon == "pyrosim-results"}
17
+ <span class="not-prose">
18
+ <img
19
+ class={classes}
20
+ src="https://files.thunderheadeng.com/www/images/pyrosim-results_icon.svg"
21
+ alt="PyroSim Results"
22
+ title="PyroSim Results Icon"
23
+ />
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>
34
+ {:else if icon == "pathfinder"}
35
+ <span class="not-prose">
36
+ <img
37
+ class={classes}
38
+ src="https://files.thunderheadeng.com/www/images/pathfinder_icon.svg"
39
+ alt="Pathfinder"
40
+ title="Pathfinder Icon"
41
+ />
42
+ </span>
43
+ {:else if icon == "pathfinder-results"}
44
+ <span class="not-prose">
45
+ <img
46
+ class={classes}
47
+ src="https://files.thunderheadeng.com/www/images/pathfinder-results_icon.svg"
48
+ alt="Pathfinder Results"
49
+ title="Pathfinder Results Icon"
50
+ />
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>
61
+ {:else if icon == "petrasim"}
62
+ <span class="not-prose">
63
+ <img
64
+ class={classes}
65
+ src="https://files.thunderheadeng.com/www/images/petrasim_icon.svg"
66
+ alt="PetraSim"
67
+ title="PetraSim Icon"
68
+ />
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
91
+ class={classes}
92
+ xmlns="http://www.w3.org/2000/svg"
93
+ viewBox="0 0 250 250"
94
+ >
95
+ <path
96
+ style="fill:#0c3879;fill-rule:evenodd;stroke:none"
97
+ d="M88.113 220.536h97.672v97.672H88.113z"
98
+ transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
99
+ />
100
+ <path
101
+ style="fill:#fff;fill-rule:evenodd;stroke:none"
102
+ 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"
103
+ transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
104
+ />
105
+ <path
106
+ style="fill:#fff;fill-rule:evenodd;stroke:none"
107
+ 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"
108
+ transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
109
+ />
110
+ </svg>
111
+ </span>
112
+ {:else if icon?.startsWith("icon-")}
113
+ <span class="material-icons-outlined {classes}">{icon?.slice(5)}</span>
114
+ {:else}
115
+ <span class="not-prose">
116
+ <svg
117
+ class={classes}
118
+ xmlns="http://www.w3.org/2000/svg"
119
+ viewBox="0 0 250 250"
120
+ >
121
+ <path
122
+ style="fill:#0c3879;fill-rule:evenodd;stroke:none"
123
+ d="M88.113 220.536h97.672v97.672H88.113z"
124
+ transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
125
+ />
126
+ <path
127
+ style="fill:#fff;fill-rule:evenodd;stroke:none"
128
+ 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"
129
+ transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
130
+ />
131
+ <path
132
+ style="fill:#fff;fill-rule:evenodd;stroke:none"
133
+ 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"
134
+ transform="matrix(2.5596 0 0 2.5596 -225.533 -564.483)"
135
+ />
136
+ </svg>
137
+ </span>
138
+ {/if}
@@ -0,0 +1,25 @@
1
+ <div class="bg-white">
2
+ <div class="mx-auto max-w-7xl py-12 px-6 lg:py-16 lg:px-8">
3
+ <p class="text-center text-lg font-semibold text-gray-600">Trusted by fire protection experts all over the world</p>
4
+ <div class="mt-6 grid grid-cols-2 gap-0.5 md:grid-cols-3 lg:mt-8">
5
+ <div class="col-span-1 flex justify-center bg-gray-50 py-8 px-8">
6
+ <img class="max-h-12" src="https://tailwindui.com/img/logos/transistor-logo-gray-400.svg" alt="Workcation">
7
+ </div>
8
+ <div class="col-span-1 flex justify-center bg-gray-50 py-8 px-8">
9
+ <img class="max-h-12" src="https://tailwindui.com/img/logos/mirage-logo-gray-400.svg" alt="Mirage">
10
+ </div>
11
+ <div class="col-span-1 flex justify-center bg-gray-50 py-8 px-8">
12
+ <img class="max-h-12" src="https://tailwindui.com/img/logos/tuple-logo-gray-400.svg" alt="Tuple">
13
+ </div>
14
+ <div class="col-span-1 flex justify-center bg-gray-50 py-8 px-8">
15
+ <img class="max-h-12" src="https://tailwindui.com/img/logos/laravel-logo-gray-400.svg" alt="Laravel">
16
+ </div>
17
+ <div class="col-span-1 flex justify-center bg-gray-50 py-8 px-8">
18
+ <img class="max-h-12" src="https://tailwindui.com/img/logos/statickit-logo-gray-400.svg" alt="StaticKit">
19
+ </div>
20
+ <div class="col-span-1 flex justify-center bg-gray-50 py-8 px-8">
21
+ <img class="max-h-12" src="https://tailwindui.com/img/logos/statamic-logo-gray-400.svg" alt="Statamic">
22
+ </div>
23
+ </div>
24
+ </div>
25
+ </div>
@@ -0,0 +1,24 @@
1
+ <script>
2
+ // Based on: https://svelte.dev/repl/49ff6c089825418888cf804d9dde77bc?version=3.46.4
3
+ import katex from "katex";
4
+ export let math;
5
+ export let displayMode = false;
6
+
7
+ const options = {
8
+ displayMode: displayMode,
9
+ throwOnError: false,
10
+ };
11
+
12
+ $: katexString = katex.renderToString(math, options);
13
+ </script>
14
+
15
+ <svelte:head>
16
+ <link
17
+ rel="stylesheet"
18
+ href="https://cdn.jsdelivr.net/npm/katex@0.12.0/dist/katex.min.css"
19
+ integrity="sha384-AfEj0r4/OFrOo5t7NnNe46zW/tFgW6x/bCJG8FqQCEo3+Aro6EYUG4+cU+KJWu/X"
20
+ crossorigin="anonymous"
21
+ />
22
+ </svelte:head>
23
+
24
+ {@html katexString}
@@ -0,0 +1,66 @@
1
+ <script>
2
+ export let data;
3
+
4
+ let figureImage;
5
+ let figureLink;
6
+
7
+ if (data.image) {
8
+ if (data.image.startsWith("http")) {
9
+ figureImage = data.image;
10
+ figureLink = data.link ? data.link : data.image;
11
+ } else if (data.image.includes("gif")) {
12
+ figureImage = "https://teci-files.imgix.net/www/images/" + data.image;
13
+ figureLink = data.link
14
+ ? data.link
15
+ : "https://teci-files.imgix.net/www/images/" + data.image;
16
+ } else {
17
+ figureImage =
18
+ "https://teci-files.imgix.net/www/images/" +
19
+ data.image +
20
+ "?w=576&ar=16:9&fit=crop&auto=compress&auto=format";
21
+ figureLink = data.link
22
+ ? data.link
23
+ : "https://teci-files.imgix.net/www/images/" + data.image;
24
+ }
25
+ }
26
+ </script>
27
+
28
+ <section
29
+ class="mx-auto flex w-full flex-col items-center justify-center md:flex-row md:items-start"
30
+ >
31
+ {#if data.v}
32
+ <div class="mb-4 block w-full max-w-xl md:mb-0">
33
+ <Video bind:data />
34
+ </div>
35
+ {:else if data.image}
36
+ <div class="mb-4 block w-full max-w-xl md:mb-0">
37
+ <figure>
38
+ <a href={figureLink}>
39
+ <img
40
+ class="aspect-video w-full border border-gray-200 bg-black object-cover shadow-md {data.imageClass
41
+ ? data.imageClass
42
+ : ''}"
43
+ src={figureImage}
44
+ alt={data.name}
45
+ />
46
+ </a>
47
+ </figure>
48
+ </div>
49
+ {/if}
50
+ <div
51
+ class="flex w-full max-w-xl flex-col justify-center {data.position ===
52
+ 'right'
53
+ ? 'md:order-last md:ml-8'
54
+ : 'md:order-first md:mr-8'}"
55
+ >
56
+ <div class="w-full max-w-3xl">
57
+ <h2 class="pb-4 text-lg font-bold">{data.name}</h2>
58
+ <span class="prose">{@html data.text}</span>
59
+ </div>
60
+ {#if data.ctaText}
61
+ <div class="mt-4 text-right md:text-left">
62
+ <a class="btn inline-block" href={data.ctaURL}>{data.ctaText}</a>
63
+ </div>
64
+ {/if}
65
+ </div>
66
+ </section>
@@ -0,0 +1,68 @@
1
+ <script>
2
+ export let data;
3
+ let shown = false;
4
+
5
+ export function show() {
6
+ shown = true;
7
+ }
8
+ export function hide() {
9
+ shown = false;
10
+ }
11
+ </script>
12
+
13
+ <svelte:window
14
+ on:keydown={(e) => {
15
+ if (e.keyCode == 27) {
16
+ hide();
17
+ }
18
+ }}
19
+ />
20
+
21
+ {#if (data.title || data.text || data.buttonText)}
22
+ <div class="prose max-w-none">
23
+ {#if data.title}
24
+ <h2>{data.title}</h2>
25
+ {/if}
26
+ {#if data.text}
27
+ <p>{data.text}</p>
28
+ {/if}
29
+ {#if data.buttonText}
30
+ <button on:click={show} class="btn">{data.buttonText}</button>
31
+ {/if}
32
+ </div>
33
+ {/if}
34
+
35
+ {#if shown}
36
+ <div
37
+ class="fixed inset-0 z-50 !mt-0 h-full w-full overflow-y-auto bg-gray-900 bg-opacity-50"
38
+ >
39
+ <div class="relative top-20 mx-auto w-96 border bg-white p-5 shadow-lg">
40
+ <button
41
+ type="button"
42
+ on:click={hide}
43
+ class="absolute top-0 right-0 mr-2 mt-2 inline-flex items-center justify-center bg-white p-1 text-teci-blue-light hover:bg-teci-blue-dark hover:text-white focus:outline-none focus:ring-2 focus:ring-inset focus:ring-teci-blue-dark"
44
+ >
45
+ <span class="sr-only">Close menu</span>
46
+ <!-- Heroicon name: outline/x -->
47
+ <svg
48
+ class="h-6 w-6"
49
+ xmlns="http://www.w3.org/2000/svg"
50
+ fill="none"
51
+ viewBox="0 0 24 24"
52
+ stroke="currentColor"
53
+ aria-hidden="true"
54
+ >
55
+ <path
56
+ stroke-linecap="round"
57
+ stroke-linejoin="round"
58
+ stroke-width="2"
59
+ d="M6 18L18 6M6 6l12 12"
60
+ />
61
+ </svg>
62
+ </button>
63
+ <div class="mt-3 text-center">
64
+ {@html data.modalContent}
65
+ </div>
66
+ </div>
67
+ </div>
68
+ {/if}
@@ -0,0 +1,182 @@
1
+ <script>
2
+ import { page } from '$app/stores';
3
+ import { paginate, PaginationNav } from "svelte-paginate";
4
+ import Icon from "$lib/components/Icon.svelte";
5
+
6
+ export let data;
7
+
8
+ let posts = $page.data.newsPosts;
9
+ let filteredPosts = [];
10
+ let items = [];
11
+ let currentPage = 1;
12
+ let pageSize = data.pageSize;
13
+ let postLimit = data.limit;
14
+ let showPagination = true;
15
+
16
+ if (postLimit > 0) {
17
+ posts = posts.slice(0, postLimit);
18
+ postLimit <= pageSize ? (showPagination = false) : (showPagination = true);
19
+ }
20
+
21
+ function termExists(arr, terms) {
22
+ if (arr) {
23
+ return terms.some((term) => {
24
+ return arr.includes(term);
25
+ });
26
+ } else {
27
+ return false;
28
+ }
29
+ }
30
+
31
+ function filterPosts(arr, terms) {
32
+ for (let i = 0; i < arr.length; ) {
33
+ if (termExists(arr[i].categories, terms)) {
34
+ i++;
35
+ continue;
36
+ }
37
+ arr.splice(i, 1);
38
+ }
39
+ return arr;
40
+ }
41
+
42
+ if (data.filter) {
43
+ items = filterPosts(posts, data.filter);
44
+ } else {
45
+ items = posts;
46
+ }
47
+
48
+ $: paginatedItems = paginate({ items, pageSize, currentPage });
49
+ </script>
50
+
51
+ <div class="relative mx-auto w-full">
52
+ <div
53
+ 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"
54
+ >
55
+ <div>
56
+ <h1 class="text-3xl font-bold tracking-tight text-gray-900 sm:text-4xl">
57
+ {data.title}
58
+ </h1>
59
+ <p class="text-xl text-gray-500">{data.subtitle}</p>
60
+ </div>
61
+ <div class="w-32">
62
+ <data
63
+ id="mj-w-res-data"
64
+ data-token="f594659941689957f270ca278a80dc7d"
65
+ class="mj-w-data"
66
+ data-apikey="3aOX"
67
+ data-w-id="Fbu"
68
+ data-lang="en_US"
69
+ data-base="https://app.mailjet.com"
70
+ data-width="640"
71
+ data-height="480"
72
+ data-statics="statics"
73
+ />
74
+ <button
75
+ 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"
76
+ data-token="f594659941689957f270ca278a80dc7d"
77
+ onclick="mjOpenPopin(event, this)">Subscribe</button
78
+ >
79
+ </div>
80
+ </div>
81
+ {#if items.length > 0}
82
+ {#if showPagination}
83
+ <div class="paginator mx-auto flex justify-center pt-4">
84
+ <PaginationNav
85
+ totalItems={items.length}
86
+ pageSize={pageSize ? pageSize : 6}
87
+ {currentPage}
88
+ limit={1}
89
+ showStepOptions={true}
90
+ on:setPage={(e) => (currentPage = e.detail.page)}
91
+ />
92
+ </div>
93
+ {/if}
94
+ <div
95
+ class="grid gap-8 pt-8 md:grid-cols-2 md:gap-16 lg:grid-cols-3 lg:gap-x-5 lg:gap-y-12"
96
+ >
97
+ {#each paginatedItems as post}
98
+ <div class="h-full">
99
+ <div class="flex h-full flex-col items-stretch ">
100
+ <time class="mb-1 block text-sm text-gray-500" datetime={post.date}
101
+ >{new Date(post.date).toLocaleDateString("en-us", {
102
+ weekday: "short",
103
+ year: "numeric",
104
+ month: "short",
105
+ day: "numeric",
106
+ timeZone: "UTC",
107
+ timeZoneName: "short",
108
+ })}</time
109
+ >
110
+ <h2 class="mb-2 text-xl font-semibold text-gray-900">
111
+ <a href={post.slug}>
112
+ {post.title}
113
+ </a>
114
+ </h2>
115
+ {#if post.summary}
116
+ <p class="mb-2 flex-1 text-base text-gray-500">
117
+ <a href={post.slug}>
118
+ {post.summary.length > 190
119
+ ? post.summary.substring(0, 190) + " ..."
120
+ : post.summary}
121
+ </a>
122
+ </p>
123
+ {:else}
124
+ <p class="mb-2 flex-1 text-base text-red-500">
125
+ Missing Summary Text
126
+ </p>
127
+ {/if}
128
+ {#if post.categories}
129
+ <div class="flex w-full flex-wrap text-sm">
130
+ {#each post.categories.sort() as term}
131
+ <a
132
+ class="mr-2 mb-2 inline-block"
133
+ href="/news/filter/{term}"
134
+ target="_self"
135
+ >
136
+ <span
137
+ class="inline-flex items-center rounded-full bg-teci-blue-dark px-2.5 py-0.5 text-xs text-white hover:bg-teci-blue-light"
138
+ >{term}</span
139
+ >
140
+ </a>
141
+ {/each}
142
+ </div>
143
+ {/if}
144
+ <p
145
+ class="text-sm font-semibold text-teci-blue-light hover:text-teci-blue-dark"
146
+ >
147
+ <a href={post.slug}>
148
+ Read full article<span aria-hidden="true">&nbsp;→</span>
149
+ </a>
150
+ </p>
151
+ </div>
152
+ </div>
153
+ {/each}
154
+ </div>
155
+ {#if showPagination}
156
+ <div class="paginator mx-auto flex justify-center pt-8">
157
+ <PaginationNav
158
+ totalItems={items.length}
159
+ pageSize={pageSize ? pageSize : 6}
160
+ {currentPage}
161
+ limit={1}
162
+ showStepOptions={true}
163
+ on:setPage={(e) => (currentPage = e.detail.page)}
164
+ />
165
+ </div>
166
+ {/if}
167
+ {#if !showPagination}
168
+ <div class="mt-8 w-full">
169
+ <a class="btn float-right" href="/news" rel="external">All News Posts</a
170
+ >
171
+ </div>
172
+ {/if}
173
+ {:else}
174
+ <div class="prose">
175
+ <p class="pt-8">
176
+ Sorry, there isn't any news for you to see here.<br />
177
+ Please visit the <a rel="external" href="/news">All News</a> page for an
178
+ updated list.
179
+ </p>
180
+ </div>
181
+ {/if}
182
+ </div>