@networkpro/web 0.13.2 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (293) hide show
  1. package/CODE_OF_CONDUCT.md +172 -0
  2. package/LICENSE.md +4 -4
  3. package/README.md +13 -12
  4. package/_headers +2 -0
  5. package/assets/bin/contact.vcf +13 -0
  6. package/assets/bin/contact@s.neteng.pro.aexpk +17 -0
  7. package/assets/bin/contact@s.neteng.pro.asc +17 -0
  8. package/assets/bin/github@sl.neteng.cc.aexpk +29 -0
  9. package/assets/bin/github@sl.neteng.cc.asc +29 -0
  10. package/assets/bin/linksheet.json +8 -0
  11. package/assets/bin/support@neteng.pro.aexpk +47 -0
  12. package/assets/bin/support@neteng.pro.asc +47 -0
  13. package/assets/consulting-terms.pdf +0 -0
  14. package/eslint.config.mjs +112 -0
  15. package/jsconfig.json +28 -0
  16. package/netlify.toml +3 -0
  17. package/package.json +63 -60
  18. package/playwright.config.js +79 -0
  19. package/postcss.config.mjs +14 -0
  20. package/scripts/bundleCss.js +40 -0
  21. package/src/app.d.ts +15 -0
  22. package/src/app.html +83 -0
  23. package/src/demo.spec.js +14 -0
  24. package/src/lib/components/Badges.svelte +74 -0
  25. package/src/lib/components/ContainerSection.svelte +19 -0
  26. package/src/lib/components/FullWidthSection.svelte +13 -0
  27. package/src/lib/components/LegalNav.svelte +75 -0
  28. package/src/lib/components/Logo.svelte +110 -0
  29. package/src/lib/components/MetaTags.svelte +41 -0
  30. package/src/lib/components/SocialMedia.svelte +70 -0
  31. package/src/lib/components/foss/FossFeatures.svelte +24 -0
  32. package/src/lib/components/foss/FossItemContent.svelte +153 -0
  33. package/src/lib/components/layout/Footer.svelte +188 -0
  34. package/src/lib/components/layout/HeaderDefault.svelte +86 -0
  35. package/src/lib/components/layout/HeaderHome.svelte +84 -0
  36. package/src/lib/data/fossData.js +233 -0
  37. package/src/lib/images.js +77 -0
  38. package/src/lib/img/badges/cc-by-badge.png +0 -0
  39. package/src/lib/img/badges/gpl-badge.svg +1 -0
  40. package/src/lib/img/by.svg +1 -0
  41. package/src/lib/img/cc.svg +1 -0
  42. package/src/lib/img/logo-web.png +0 -0
  43. package/src/lib/img/logo-web.webp +0 -0
  44. package/src/lib/img/obtainium.webp +0 -0
  45. package/src/lib/img/posts/acode.png +0 -0
  46. package/src/lib/img/posts/acode.webp +0 -0
  47. package/src/lib/img/posts/linksheet.png +0 -0
  48. package/src/lib/img/posts/linksheet.webp +0 -0
  49. package/src/lib/img/posts/pmx.png +0 -0
  50. package/src/lib/img/posts/pmx.webp +0 -0
  51. package/src/lib/img/posts/tosdr.png +0 -0
  52. package/src/lib/img/posts/tosdr.webp +0 -0
  53. package/src/lib/img/posts/urlcheck.png +0 -0
  54. package/src/lib/img/posts/urlcheck.webp +0 -0
  55. package/src/lib/index.js +43 -0
  56. package/src/lib/meta.js +73 -0
  57. package/src/lib/pages/AboutContent.svelte +294 -0
  58. package/src/lib/pages/FossContent.svelte +109 -0
  59. package/src/lib/pages/HomeContent.svelte +120 -0
  60. package/src/lib/pages/LicenseContent.svelte +486 -0
  61. package/src/lib/pages/PrivacyContent.svelte +249 -0
  62. package/src/lib/pages/TermsConditionsContent.svelte +240 -0
  63. package/src/lib/pages/TermsUseContent.svelte +236 -0
  64. package/src/lib/registerServiceWorker.js +65 -0
  65. package/src/lib/styles/css/brands.css +76 -0
  66. package/src/lib/styles/css/brands.min.css +6 -0
  67. package/src/lib/styles/css/default.css +454 -0
  68. package/src/lib/styles/css/fontawesome.min.css +9 -0
  69. package/src/lib/styles/css/global.css +10 -0
  70. package/src/lib/styles/css/normalize.css +349 -0
  71. package/src/lib/styles/css/offline.css +120 -0
  72. package/src/lib/styles/css/solid.min.css +6 -0
  73. package/src/lib/styles/css/style.css +310 -0
  74. package/src/lib/styles/fa-global.css +10 -0
  75. package/src/lib/styles/global.min.css +9 -0
  76. package/src/lib/styles/index.js +11 -0
  77. package/src/lib/styles/webfonts/fa-brands-400.ttf +0 -0
  78. package/src/lib/styles/webfonts/fa-brands-400.woff2 +0 -0
  79. package/src/lib/styles/webfonts/fa-solid-900.ttf +0 -0
  80. package/src/lib/styles/webfonts/fa-solid-900.woff2 +0 -0
  81. package/src/routes/+error.svelte +43 -0
  82. package/src/routes/+layout.js +38 -0
  83. package/src/routes/+layout.svelte +113 -0
  84. package/src/routes/+page.server.js +27 -0
  85. package/src/routes/+page.svelte +82 -0
  86. package/src/routes/about/+page.server.js +17 -0
  87. package/src/routes/about/+page.svelte +66 -0
  88. package/src/routes/contact/+page.server.js +24 -0
  89. package/src/routes/example.svx +9 -0
  90. package/src/routes/foss-spotlight/+page.server.js +17 -0
  91. package/src/routes/foss-spotlight/+page.svelte +68 -0
  92. package/src/routes/license/+page.server.js +17 -0
  93. package/src/routes/license/+page.svelte +68 -0
  94. package/src/routes/page.svelte.test.js +29 -0
  95. package/src/routes/privacy-policy/+page.server.js +17 -0
  96. package/src/routes/privacy-policy/+page.svelte +68 -0
  97. package/src/routes/privacy-rights/+page.server.js +24 -0
  98. package/src/routes/terms-conditions/+page.server.js +17 -0
  99. package/src/routes/terms-conditions/+page.svelte +68 -0
  100. package/src/routes/terms-of-use/+page.server.js +17 -0
  101. package/src/routes/terms-of-use/+page.svelte +68 -0
  102. package/src/service-worker.d.ts +4 -0
  103. package/src/service-worker.js +90 -0
  104. package/static/icon-512x512-maskable.png +0 -0
  105. package/static/icon-contact.png +0 -0
  106. package/static/icon-services.png +0 -0
  107. package/static/img/qr/pgp-github.png +0 -0
  108. package/static/img/svelte.png +0 -0
  109. package/static/manifest.json +64 -0
  110. package/static/offline.html +79 -0
  111. package/static/offline.min.css +7 -0
  112. package/{robots.txt → static/robots.txt} +0 -2
  113. package/static/sitemap.xml +102 -0
  114. package/stylelint.config.js +118 -0
  115. package/svelte.config.js +56 -0
  116. package/tests/app.spec.js +67 -0
  117. package/tests/mobile.spec.js +58 -0
  118. package/tests-examples/demo-todo-app.spec.js +504 -0
  119. package/tsconfig.custom.json +39 -0
  120. package/vite.config.js +19 -0
  121. package/vitest-setup-client.js +33 -0
  122. package/vitest.config.client.js +34 -0
  123. package/vitest.config.server.js +30 -0
  124. package/404.html +0 -84
  125. package/about.html +0 -334
  126. package/about.html.br +0 -0
  127. package/about.html.gz +0 -0
  128. package/css/default.css +0 -1
  129. package/css/normalize.css +0 -1
  130. package/css/style.css +0 -1
  131. package/docs/404.html +0 -1187
  132. package/docs/assets/external/avatars.githubusercontent.com/u/170266279.png +0 -0
  133. package/docs/assets/external/img.shields.io/badge/GitHub_Package_Registry-white.ed8def48.svg +0 -1
  134. package/docs/assets/external/img.shields.io/badge/npmjs-white.681714c1.svg +0 -1
  135. package/docs/assets/external/mirrors.creativecommons.org/presskit/icons/by.svg +0 -20
  136. package/docs/assets/external/mirrors.creativecommons.org/presskit/icons/cc.svg +0 -27
  137. package/docs/assets/external/unpkg.com/mermaid@11/dist/mermaid.min.js +0 -2607
  138. package/docs/assets/images/favicon.png +0 -0
  139. package/docs/assets/javascripts/bundle.c8b220af.min.js +0 -16
  140. package/docs/assets/javascripts/bundle.c8b220af.min.js.map +0 -7
  141. package/docs/assets/javascripts/lunr/min/lunr.ar.min.js +0 -1
  142. package/docs/assets/javascripts/lunr/min/lunr.da.min.js +0 -18
  143. package/docs/assets/javascripts/lunr/min/lunr.de.min.js +0 -18
  144. package/docs/assets/javascripts/lunr/min/lunr.du.min.js +0 -18
  145. package/docs/assets/javascripts/lunr/min/lunr.el.min.js +0 -1
  146. package/docs/assets/javascripts/lunr/min/lunr.es.min.js +0 -18
  147. package/docs/assets/javascripts/lunr/min/lunr.fi.min.js +0 -18
  148. package/docs/assets/javascripts/lunr/min/lunr.fr.min.js +0 -18
  149. package/docs/assets/javascripts/lunr/min/lunr.he.min.js +0 -1
  150. package/docs/assets/javascripts/lunr/min/lunr.hi.min.js +0 -1
  151. package/docs/assets/javascripts/lunr/min/lunr.hu.min.js +0 -18
  152. package/docs/assets/javascripts/lunr/min/lunr.hy.min.js +0 -1
  153. package/docs/assets/javascripts/lunr/min/lunr.it.min.js +0 -18
  154. package/docs/assets/javascripts/lunr/min/lunr.ja.min.js +0 -1
  155. package/docs/assets/javascripts/lunr/min/lunr.jp.min.js +0 -1
  156. package/docs/assets/javascripts/lunr/min/lunr.kn.min.js +0 -1
  157. package/docs/assets/javascripts/lunr/min/lunr.ko.min.js +0 -1
  158. package/docs/assets/javascripts/lunr/min/lunr.multi.min.js +0 -1
  159. package/docs/assets/javascripts/lunr/min/lunr.nl.min.js +0 -18
  160. package/docs/assets/javascripts/lunr/min/lunr.no.min.js +0 -18
  161. package/docs/assets/javascripts/lunr/min/lunr.pt.min.js +0 -18
  162. package/docs/assets/javascripts/lunr/min/lunr.ro.min.js +0 -18
  163. package/docs/assets/javascripts/lunr/min/lunr.ru.min.js +0 -18
  164. package/docs/assets/javascripts/lunr/min/lunr.sa.min.js +0 -1
  165. package/docs/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -1
  166. package/docs/assets/javascripts/lunr/min/lunr.sv.min.js +0 -18
  167. package/docs/assets/javascripts/lunr/min/lunr.ta.min.js +0 -1
  168. package/docs/assets/javascripts/lunr/min/lunr.te.min.js +0 -1
  169. package/docs/assets/javascripts/lunr/min/lunr.th.min.js +0 -1
  170. package/docs/assets/javascripts/lunr/min/lunr.tr.min.js +0 -18
  171. package/docs/assets/javascripts/lunr/min/lunr.vi.min.js +0 -1
  172. package/docs/assets/javascripts/lunr/min/lunr.zh.min.js +0 -1
  173. package/docs/assets/javascripts/lunr/tinyseg.js +0 -206
  174. package/docs/assets/javascripts/lunr/wordcut.js +0 -6708
  175. package/docs/assets/javascripts/workers/search.f8cc74c7.min.js +0 -42
  176. package/docs/assets/javascripts/workers/search.f8cc74c7.min.js.map +0 -7
  177. package/docs/assets/stylesheets/main.2afb09e1.min.css +0 -1
  178. package/docs/assets/stylesheets/main.2afb09e1.min.css.map +0 -1
  179. package/docs/assets/stylesheets/palette.06af60db.min.css +0 -1
  180. package/docs/assets/stylesheets/palette.06af60db.min.css.map +0 -1
  181. package/docs/blog/2015/01/04/secure-secure-shell/index.html +0 -1771
  182. package/docs/blog/2025/04/30/our-blog-is-live/index.html +0 -1436
  183. package/docs/blog/archive/2015/index.html +0 -1303
  184. package/docs/blog/archive/2025/index.html +0 -1291
  185. package/docs/blog/category/security/index.html +0 -1303
  186. package/docs/blog/index.html +0 -1350
  187. package/docs/conduct/index.html +0 -1509
  188. package/docs/feed_json_created.json +0 -1
  189. package/docs/feed_json_updated.json +0 -1
  190. package/docs/feed_rss_created.xml +0 -1
  191. package/docs/feed_rss_updated.xml +0 -1
  192. package/docs/fontawesome/LICENSE.txt +0 -165
  193. package/docs/fontawesome/brands/facebook.svg +0 -1
  194. package/docs/fontawesome/brands/instagram.svg +0 -1
  195. package/docs/fontawesome/brands/linkedin.svg +0 -1
  196. package/docs/fontawesome/brands/mastodon.svg +0 -1
  197. package/docs/fontawesome/solid/at.svg +0 -1
  198. package/docs/index.html +0 -1395
  199. package/docs/legal/index.html +0 -1740
  200. package/docs/privacy/index.html +0 -1615
  201. package/docs/search/search_index.json +0 -1
  202. package/docs/sitemap.xml +0 -55
  203. package/docs/sitemap.xml.gz +0 -0
  204. package/docs/tags/index.html +0 -2084
  205. package/docs/terms-conditions/index.html +0 -1655
  206. package/docs/terms-use/index.html +0 -1584
  207. package/favicon-192.png +0 -0
  208. package/favicon-512.png +0 -0
  209. package/favicon.svg.br +0 -0
  210. package/favicon.svg.gz +0 -0
  211. package/html/spotlight.html +0 -516
  212. package/html/spotlight.html.br +0 -0
  213. package/html/spotlight.html.gz +0 -0
  214. package/img/banner-1440.png +0 -0
  215. package/img/favicon-template.png +0 -0
  216. package/img/fb-cover.png +0 -0
  217. package/img/fb-cover2.png +0 -0
  218. package/img/fsf-member.png +0 -0
  219. package/img/gh-logo.png +0 -0
  220. package/img/gpl3-small.png +0 -0
  221. package/img/gpl3.png +0 -0
  222. package/img/linkedin-banner-new.png +0 -0
  223. package/img/linkedin-banner.png +0 -0
  224. package/img/linkedin-banner2.png +0 -0
  225. package/img/logo-1024x1024.png +0 -0
  226. package/img/logo-alt.png +0 -0
  227. package/img/logo-elevated.png +0 -0
  228. package/img/logo-light-elevated.png +0 -0
  229. package/img/logo-light-slogan.png +0 -0
  230. package/img/logo-light.png +0 -0
  231. package/img/logo-slogan.png +0 -0
  232. package/img/logo-transparent-black-small.png +0 -0
  233. package/img/logo-transparent-black.png +0 -0
  234. package/img/logo-transparent-elevated.png +0 -0
  235. package/img/logo-transparent-slogan.png +0 -0
  236. package/img/mastodon-banner.png +0 -0
  237. package/img/netpro-logo-transparent.png +0 -0
  238. package/img/posts/acode.png +0 -0
  239. package/img/posts/linksheet.png +0 -0
  240. package/img/posts/pmx.png +0 -0
  241. package/img/posts/tosdr.png +0 -0
  242. package/img/posts/urlcheck.png +0 -0
  243. package/img/sd311.png +0 -0
  244. package/img/shield.png +0 -0
  245. package/img/shield.svg +0 -1
  246. package/img/shield.svg.br +0 -0
  247. package/img/shield.svg.gz +0 -0
  248. package/img/shield2.png +0 -0
  249. package/img/shield3-2000x2000.png +0 -0
  250. package/img/shield3-black-1024x1024.png +0 -0
  251. package/img/shield3-black.png +0 -0
  252. package/img/shield3-white.png +0 -0
  253. package/img/trademark.jpg +0 -0
  254. package/index.html +0 -268
  255. package/index.html.br +0 -0
  256. package/index.html.gz +0 -0
  257. package/js/app.d544156ea2ba85a7d486.mjs +0 -1
  258. package/js/runtime.52b1ac291305b90de3df.mjs +0 -1
  259. package/js/vendor/.gitkeep +0 -0
  260. package/legal.html +0 -535
  261. package/legal.html.br +0 -0
  262. package/legal.html.gz +0 -0
  263. package/privacy.html +0 -404
  264. package/privacy.html.br +0 -0
  265. package/privacy.html.gz +0 -0
  266. package/site.webmanifest +0 -25
  267. package/sitemap.xml +0 -177
  268. package/terms-and-conditions.html +0 -409
  269. package/terms-and-conditions.html.br +0 -0
  270. package/terms-and-conditions.html.gz +0 -0
  271. package/terms-of-use.html +0 -380
  272. package/terms-of-use.html.br +0 -0
  273. package/terms-of-use.html.gz +0 -0
  274. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets → assets}/nsa-happy-dance.png +0 -0
  275. /package/{favicon.svg → src/lib/img/favicon.svg} +0 -0
  276. /package/{favicon-180.png → src/lib/img/icon-180x180.png} +0 -0
  277. /package/{img/badge_obtainium.png → src/lib/img/obtainium.png} +0 -0
  278. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/pgp-contact.png +0 -0
  279. /package/{img → src/lib/img}/qr/pgp-github.png +0 -0
  280. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/pgp-support.png +0 -0
  281. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/vcard.png +0 -0
  282. /package/{CNAME → static/CNAME} +0 -0
  283. /package/{favicon.ico → static/favicon.ico} +0 -0
  284. /package/{docs/img/favicon.png → static/icon-192x192.png} +0 -0
  285. /package/{docs/img/logo.png → static/icon-512x512.png} +0 -0
  286. /package/{favicon-splash.png → static/icon-splash.png} +0 -0
  287. /package/{img → static/img}/banner-1280x640.png +0 -0
  288. /package/{img → static/img}/banner-og-1200x630.png +0 -0
  289. /package/{img → static/img}/logo-transparent.png +0 -0
  290. /package/{img → static/img}/logo.png +0 -0
  291. /package/{img → static/img}/qr/pgp-contact.png +0 -0
  292. /package/{img → static/img}/qr/pgp-support.png +0 -0
  293. /package/{img → static/img}/qr/vcard.png +0 -0
@@ -0,0 +1,294 @@
1
+ <!-- ==========================================================================
2
+ src/lib/pages/AboutContent.svelte
3
+
4
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
5
+ This file is part of Network Pro.
6
+ ========================================================================== -->
7
+
8
+ <script>
9
+ import { pgpContact, pgpSupport, vcfSrc } from "$lib";
10
+
11
+ /**
12
+ * Security attribute for external links
13
+ * @type {string}
14
+ */
15
+ const rel = "noopener noreferrer";
16
+
17
+ /**
18
+ * HTML attribute for async image decoding
19
+ * @type {"async" | "sync" | "auto"}
20
+ */
21
+ const decoding = "async";
22
+
23
+ /**
24
+ * HTML attribute for lazy loading images
25
+ * @type {"lazy" | "eager"}
26
+ */
27
+ const loading = "lazy";
28
+
29
+ /**
30
+ * CSS class for styled horizontal rule
31
+ * @type {string}
32
+ */
33
+ const hrStyle = "hr-styled";
34
+
35
+ /**
36
+ * Target attribute for opening links in new tab
37
+ * @type {string}
38
+ */
39
+ const tgtBlank = "_blank";
40
+
41
+ /**
42
+ * Navigation links for the page
43
+ * @type {Array<{
44
+ * label: string,
45
+ * href: string,
46
+ * target: string,
47
+ * text?: string
48
+ * }>}
49
+ */
50
+ const navLinks = [
51
+ {
52
+ label: "SPDX License Identifier",
53
+ href: "https://spdx.dev/learn/handling-license-info",
54
+ target: "_blank",
55
+ text: "CC-BY-4.0 OR GPL-3.0-or-later",
56
+ },
57
+ {
58
+ label: "Markdown",
59
+ href: "https://netwk.pro/docs",
60
+ target: "_self",
61
+ },
62
+ ];
63
+
64
+ /**
65
+ * PGP key information for contact emails
66
+ * @type {Array<{
67
+ * label: string,
68
+ * qrSrc: string,
69
+ * keySearch: string,
70
+ * fingerprint: string[]
71
+ * }>}
72
+ */
73
+ const pgpKeys = [
74
+ {
75
+ label: "support@neteng.pro",
76
+ qrSrc: pgpSupport,
77
+ keySearch: "https://keys.openpgp.org/search?q=support%40neteng.pro",
78
+ fingerprint: ["6590b992e2e3eff12738", "7bce2af093e9dec61ba0"],
79
+ },
80
+ {
81
+ label: "contact@s.neteng.pro",
82
+ qrSrc: pgpContact,
83
+ keySearch: "https://keys.openpgp.org/search?q=contact%40s.neteng.pro",
84
+ fingerprint: ["df118baa6c2d9dcdebdc", "2ddcf99373499495f957"],
85
+ },
86
+ ];
87
+
88
+ /**
89
+ * vCard information for contact details
90
+ * @type {{
91
+ * qrSrc: string,
92
+ * vcf: string
93
+ * }}
94
+ */
95
+ const vCard = {
96
+ qrSrc: vcfSrc,
97
+ vcf: "https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact.vcf",
98
+ };
99
+ </script>
100
+
101
+ <!-- BEGIN TITLE -->
102
+ <section id="top">
103
+ <span class="small-text">
104
+ <a {rel} href={navLinks[0].href} target={navLinks[0].target}>
105
+ {navLinks[0].label}
106
+ </a>
107
+ :&nbsp;<code>{navLinks[0].text}</code>
108
+ </span>
109
+ </section>
110
+
111
+ <section id="page-title">
112
+ <h1>About Network Pro&trade;</h1>
113
+ <p>
114
+ <strong>Network Pro Strategies (Network Pro&trade;)</strong>
115
+ <br />
116
+ <em>Remote-First Cybersecurity & Privacy Consulting</em>
117
+ </p>
118
+ </section>
119
+
120
+ <div class="spacer"></div>
121
+
122
+ <section id="subhead">
123
+ <h2>Security That Respects You</h2>
124
+ </section>
125
+ <!-- END TITLE -->
126
+
127
+ <hr />
128
+
129
+ <!-- BEGIN ABOUT US -->
130
+ <p>
131
+ <sup>
132
+ <strong>Formats:</strong>&nbsp;
133
+ <span class="visited">HTML</span> |
134
+ <a href={navLinks[1].href} target={tgtBlank}>{navLinks[1].label}</a>
135
+ </sup>
136
+ </p>
137
+
138
+ <p>
139
+ At <strong>Network Pro Strategies (Network Pro&trade;)</strong>, we deliver
140
+ network security, cybersecurity, and digital privacy consulting with clarity,
141
+ credibility, and care. We believe that real security doesn't have to come at
142
+ the cost of user autonomy, and that privacy-minded solutions can be both
143
+ practical and powerful.
144
+ </p>
145
+
146
+ <p>
147
+ Our approach is built on a simple principle:
148
+ <strong>the best security is the one that fits.</strong> That means we don't
149
+ push ideologies—we apply what works. We advocate for and implement
150
+ <strong>free and open source solutions</strong>
151
+ where they offer competitive functionality, control, and visibility. When proprietary
152
+ platforms are better suited, we deploy them responsibly and securely—ensuring every
153
+ recommendation is grounded in
154
+ <strong>technical merit</strong>, <strong>scalability</strong>, and
155
+ <strong>client goals</strong>.
156
+ </p>
157
+
158
+ <h3>What We Do</h3>
159
+ <p>
160
+ As a remote-first consultancy, we support clients across industries and
161
+ geographies with a focus on:
162
+ </p>
163
+
164
+ <ul>
165
+ <li><strong>Network Hardening & Perimeter Defense</strong></li>
166
+ <li><strong>Firewall Architecture & Policy Optimization</strong></li>
167
+ <li><strong>Cloud Security & Zero Trust Implementation</strong></li>
168
+ <li><strong>Secure Infrastructure Design & Implementation</strong></li>
169
+ <li><strong>Risk Reduction & Security Posture Assessment</strong></li>
170
+ </ul>
171
+
172
+ <p>
173
+ Our consulting engagements range from tactical one-off solutions to strategic,
174
+ long-term partnerships. Whether it's helping a business segment its internal
175
+ network, lock down its cloud footprint, or plan scalable defenses—we deliver
176
+ clear value, with zero fluff.
177
+ </p>
178
+
179
+ <p>
180
+ We also believe education is a core pillar of real-world security. That's why
181
+ we invest in raising awareness—across both technical and general audiences—on
182
+ best practices in digital privacy, secure design, and threat mitigation.
183
+ </p>
184
+
185
+ <p>
186
+ <strong
187
+ >Network Pro&trade; exists to bring strong, thoughtful security to
188
+ organizations that value integrity—without sacrificing agility or trust.</strong>
189
+ We don't just secure infrastructure. We secure confidence.
190
+ </p>
191
+
192
+ <div class="spacer"></div>
193
+
194
+ <p>
195
+ <a {rel} href="https://contact.neteng.pro" target="_blank">Let's connect</a>
196
+ to discuss how we can help secure and strengthen your business today.
197
+ </p>
198
+
199
+ <div class="spacer"></div>
200
+
201
+ <hr class={hrStyle} />
202
+
203
+ <div class="spacer"></div>
204
+
205
+ <p>
206
+ You can find our PGP keys and a vCard containing our contact information
207
+ below.
208
+ </p>
209
+
210
+ <!-- BEGIN PGP KEYS -->
211
+ <div class="pgp-wrap">
212
+ <table class="pgp">
213
+ <tbody>
214
+ <!-- Row 0 (First row) remains unchanged -->
215
+ <tr>
216
+ <td class="pgp-col1">
217
+ <img
218
+ {decoding}
219
+ {loading}
220
+ src={pgpKeys[0].qrSrc}
221
+ class="pgp-image"
222
+ alt={`PGP Key - ${pgpKeys[0].label}`} />
223
+ </td>
224
+ <td class="pgp-col2">
225
+ <a
226
+ {rel}
227
+ href={pgpKeys[0].keySearch}
228
+ download
229
+ type="application/pgp-keys"
230
+ target={tgtBlank}>
231
+ <strong>{pgpKeys[0].label}</strong>
232
+ </a>
233
+ <p>Fingerprint:</p>
234
+ <p class="fingerprint">
235
+ {pgpKeys[0].fingerprint.join("\n")}
236
+ </p>
237
+ </td>
238
+ </tr>
239
+
240
+ <!-- Row 1 (Second row) has its columns swapped -->
241
+ <tr>
242
+ <td class="pgp-col1">
243
+ <a
244
+ {rel}
245
+ href={pgpKeys[1].keySearch}
246
+ download
247
+ type="application/pgp-keys"
248
+ target={tgtBlank}>
249
+ <strong>{pgpKeys[1].label}</strong>
250
+ </a>
251
+ <p>Fingerprint:</p>
252
+ <p class="fingerprint">
253
+ {pgpKeys[1].fingerprint.join("\n")}
254
+ </p>
255
+ </td>
256
+ <td class="pgp-col2">
257
+ <img
258
+ {decoding}
259
+ {loading}
260
+ src={pgpKeys[1].qrSrc}
261
+ class="pgp-image"
262
+ alt={`PGP Key - ${pgpKeys[1].label}`} />
263
+ </td>
264
+ </tr>
265
+
266
+ <!-- Row 2 (Third row) remains unchanged -->
267
+ <tr>
268
+ <td class="pgp-col1">
269
+ <img
270
+ {decoding}
271
+ {loading}
272
+ src={vCard.qrSrc}
273
+ class="pgp-image"
274
+ alt="vCard" />
275
+ </td>
276
+ <td class="pgp-col2">
277
+ <strong>vCard</strong>
278
+ <p>
279
+ <a
280
+ {rel}
281
+ href={vCard.vcf}
282
+ download
283
+ type="text/vcard"
284
+ target={tgtBlank}>
285
+ <strong>vcf</strong>
286
+ </a>
287
+ </p>
288
+ </td>
289
+ </tr>
290
+ </tbody>
291
+ </table>
292
+ </div>
293
+ <!-- END PGP KEYS -->
294
+ <!-- END ABOUT US -->
@@ -0,0 +1,109 @@
1
+ <!-- ==========================================================================
2
+ src/lib/pages/FossContent.svelte
3
+
4
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
5
+ This file is part of Network Pro.
6
+ ========================================================================== -->
7
+
8
+ <script>
9
+ import { fossData } from "$lib/data/fossData.js";
10
+ import FossItemContent from "$lib/components/foss/FossItemContent.svelte";
11
+
12
+ /**
13
+ * Process the FOSS data
14
+ * @type {any[]}
15
+ */
16
+ const processedFossData = fossData.map((item) => {
17
+ // Create a new object to avoid modifying the original
18
+ const processedItem = { ...item };
19
+
20
+ // Process the links to ensure all have required properties
21
+ if (item.links) {
22
+ processedItem.links = item.links.map((link) => {
23
+ // Use a type assertion to tell TypeScript this is any object
24
+ /** @type {any} */
25
+ const typedLink = link;
26
+
27
+ // Now create a new object with all default values
28
+ return {
29
+ label: typedLink.label || "Download",
30
+ href: typedLink.href || "#",
31
+ imgSrc: typedLink.imgSrc || "",
32
+ imgAlt: typedLink.imgAlt || "",
33
+ downloadText: typedLink.downloadText || "",
34
+ downloadHref: typedLink.downloadHref || "",
35
+ };
36
+ });
37
+ }
38
+
39
+ return processedItem;
40
+ });
41
+
42
+ /**
43
+ * Page information containing title and last updated date
44
+ * @type {{title: string, lastUpdated: string}}
45
+ */
46
+ const pageInfo = {
47
+ title: "FOSS Spotlight",
48
+ lastUpdated: "May 14, 2025",
49
+ };
50
+
51
+ /** @type {any} */
52
+ const constants = {
53
+ classSmall: "small-text",
54
+ rel: "noopener noreferrer",
55
+ backTop: "Back to top",
56
+ hrefTop: "#top",
57
+ targetSelf: "_self",
58
+ targetBlank: "_blank",
59
+ };
60
+ </script>
61
+
62
+ <section id="top">
63
+ <span class={constants.classSmall}>
64
+ <a
65
+ rel={constants.rel}
66
+ href="https://spdx.dev/learn/handling-license-info"
67
+ target={constants.targetBlank}>
68
+ SPDX License Identifier
69
+ </a>
70
+ : &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
71
+ </span>
72
+ </section>
73
+
74
+ <section id="page-title">
75
+ <h1>{pageInfo.title}</h1>
76
+ <p>
77
+ <strong
78
+ >Highlights of Exceptional Free and Open Source Software (FOSS)</strong
79
+ ><br />
80
+ <strong>Last Updated:</strong>
81
+ {pageInfo.lastUpdated}
82
+ </p>
83
+ </section>
84
+
85
+ &nbsp;
86
+
87
+ <nav id="toc">
88
+ <h2>Table of Contents</h2>
89
+ <ul>
90
+ {#each processedFossData as { id, title }}
91
+ <li><a href={"#" + id}>{title}</a></li>
92
+ {/each}
93
+ </ul>
94
+ </nav>
95
+
96
+ <div class="spacer"></div>
97
+
98
+ <hr />
99
+
100
+ {#each processedFossData as fossItem, index (fossItem.id)}
101
+ <FossItemContent {fossItem} isFirst={index === 0} />
102
+ {#if index !== processedFossData.length - 1}
103
+ <div class="spacer"></div>
104
+
105
+ <hr class="hr-styled" />
106
+
107
+ <div class="spacer"></div>
108
+ {/if}
109
+ {/each}
@@ -0,0 +1,120 @@
1
+ <!-- ==========================================================================
2
+ src/lib/pages/HomeContent.svelte
3
+
4
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
5
+ This file is part of Network Pro.
6
+ ========================================================================== -->
7
+
8
+ <script>
9
+ import { base } from "$app/paths";
10
+
11
+ // Log the base path to verify its value
12
+ //console.log("Base path:", base);
13
+
14
+ /**
15
+ * URL to the FOSS Spotlight page, using the base path
16
+ * @type {string}
17
+ */
18
+ const spotlightLink = `${base}/foss-spotlight`;
19
+
20
+ /**
21
+ * URL to the external blog
22
+ * @type {string}
23
+ */
24
+ const blogLink = "https://blog.netwk.pro";
25
+
26
+ /**
27
+ * CSS class for the index headings.
28
+ * @type {string}
29
+ */
30
+ const classIndex = "index3";
31
+
32
+ /**
33
+ * CSS class for centered text.
34
+ * @type {string}
35
+ */
36
+ const classCenter = "center-text";
37
+
38
+ /**
39
+ * CSS class for large centered text.
40
+ * @type {string}
41
+ */
42
+ const classLarge = "large-text-center";
43
+
44
+ /**
45
+ * Relation attribute for external links.
46
+ * @type {string}
47
+ */
48
+ const rel = "noopener noreferrer";
49
+
50
+ /**
51
+ * Target attribute to open links in a new tab.
52
+ * @type {string}
53
+ */
54
+ const targetBlank = "_blank";
55
+
56
+ /**
57
+ * Target attribute to open links in the same tab.
58
+ * @type {string}
59
+ */
60
+ const targetSelf = "_self";
61
+ </script>
62
+
63
+ <!-- BEGIN HOME CONTENT -->
64
+ <h3 class={classIndex}>🔒 Practical Cybersecurity. Trusted Expertise.</h3>
65
+
66
+ <p class={classCenter}>
67
+ At <strong>Network Pro&trade;</strong>, we specialize in network security,
68
+ cybersecurity, and digital privacy consulting that meets today's real-world
69
+ demands. Our remote-first approach combines technical depth with practical
70
+ solutions—leveraging a strategic mix of open source and proprietary
71
+ technologies based on performance, scalability, and trustworthiness.
72
+ </p>
73
+
74
+ <p class={classCenter}>
75
+ From secure network design to cloud infrastructure and perimeter defense, we
76
+ help organizations build stronger, smarter security postures—without
77
+ compromising flexibility or transparency.
78
+ </p>
79
+
80
+ <p class={classCenter}>
81
+ 📡
82
+ <em>
83
+ <strong>Stay informed:</strong> Follow our
84
+ <a href={blogLink} target={targetSelf}>blog</a>
85
+ and social channels for actionable insights, implementation guides, and the latest
86
+ cybersecurity developments.
87
+ </em>
88
+ </p>
89
+
90
+ &nbsp;
91
+
92
+ <h3 class={classIndex}>Featured</h3>
93
+
94
+ <p class={classLarge}>
95
+ <strong>
96
+ <a href={blogLink} target={targetSelf}>Network Pro Blog</a>
97
+ </strong>
98
+ </p>
99
+
100
+ <p class={classLarge}>
101
+ <strong>
102
+ <a href={spotlightLink} target={targetSelf}>FOSS Spotlight</a>
103
+ </strong>
104
+ </p>
105
+
106
+ &nbsp;
107
+
108
+ <p class={classCenter}>
109
+ <em>
110
+ Join us on
111
+ <a {rel} href="https://discord.neteng.pro" target={targetBlank}>Discord</a>
112
+ or in
113
+ <a
114
+ {rel}
115
+ href="https://github.com/netwk-pro/netwk-pro.github.io/discussions"
116
+ target={targetBlank}>GitHub Discussions</a
117
+ >!
118
+ </em>
119
+ </p>
120
+ <!-- END HOME CONTENT -->