@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,110 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/Logo.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 logo images
10
+ import { logoPng, logoWbp } from "$lib";
11
+
12
+ /**
13
+ * Decoding mode for the image.
14
+ * @type {"sync" | "async" | "auto"}
15
+ */
16
+ export let decoding = "sync";
17
+
18
+ /**
19
+ * Loading mode for the image.
20
+ * @type {"eager" | "lazy"}
21
+ */
22
+ export let loading = "eager";
23
+
24
+ /**
25
+ * CSS class for the logo image.
26
+ * @type {string}
27
+ */
28
+ export let className = "logo";
29
+
30
+ /**
31
+ * Alt text for the logo image.
32
+ * @type {string}
33
+ */
34
+ export let alt = "Network Pro Strategies";
35
+
36
+ /**
37
+ * First part of the company slogan.
38
+ * @type {string}
39
+ */
40
+ export let sloganA = "Locking Down Networks";
41
+
42
+ /**
43
+ * Second part of the company slogan.
44
+ * @type {string}
45
+ */
46
+ export let sloganB = "Unlocking Confidence™";
47
+
48
+ /**
49
+ * Enable/disable display of the slogan.
50
+ * @type {boolean}
51
+ */
52
+ export let showSlogan = true;
53
+
54
+ /**
55
+ * Enable/disable display of the tagline.
56
+ * @type {boolean}
57
+ */
58
+ export let showTagline = true;
59
+
60
+ /**
61
+ * Width of the logo in pixels.
62
+ * @type {number}
63
+ */
64
+ export let width = 250;
65
+
66
+ /**
67
+ * Height of the logo in pixels.
68
+ * @type {number}
69
+ */
70
+ export let height = 250;
71
+
72
+ /**
73
+ * Fetch priority for the logo image.
74
+ * @type {"high" | "low" | "auto"}
75
+ */
76
+ export let fetchpriority = "high";
77
+
78
+ /**
79
+ * Tagline text to display.
80
+ * @type {string}
81
+ */
82
+ export let tagline = "Security | Networking | Privacy";
83
+ </script>
84
+
85
+ <!-- BEGIN LOGO AND SITE TITLE -->
86
+ <picture>
87
+ <source srcset={logoWbp} type="image/webp" />
88
+ <img
89
+ {decoding}
90
+ {loading}
91
+ class={className}
92
+ src={logoPng}
93
+ {alt}
94
+ {fetchpriority}
95
+ style="width: {width}px; height: {height}px" />
96
+ </picture>
97
+
98
+ {#if showSlogan}
99
+ <div class="index-title1">
100
+ {sloganA},<br />
101
+ {sloganB}
102
+ </div>
103
+ {/if}
104
+
105
+ <div class="spacer"></div>
106
+
107
+ {#if showTagline}
108
+ <h2 class="index-title2">{tagline}</h2>
109
+ {/if}
110
+ <!-- END LOGO AND SITE TITLE -->
@@ -0,0 +1,41 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/MetaTags.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
+ export let title;
10
+ export let description;
11
+
12
+ // Static shared values
13
+ const ogUrl = "https://netwk.pro";
14
+ const ogImg = "/img/banner-og-1200x630.png";
15
+ const companyName = "Network Pro Strategies";
16
+ const twitterAct = "@NetEng_Pro";
17
+ </script>
18
+
19
+ <svelte:head>
20
+ <title>{title}</title>
21
+ <meta name="description" content={description} />
22
+
23
+ <!-- OpenGraph -->
24
+ <meta property="og:title" content={title} />
25
+ <meta property="og:type" content="website" />
26
+ <meta property="og:url" content={ogUrl} />
27
+ <meta property="og:image" content={ogImg} />
28
+ <meta property="og:image:alt" content={companyName} />
29
+ <meta property="og:description" content={description} />
30
+
31
+ <!-- Twitter -->
32
+ <meta name="twitter:card" content="summary_large_image" />
33
+ <meta name="twitter:site" content={twitterAct} />
34
+ <meta name="twitter:creator" content={twitterAct} />
35
+ <meta property="twitter:domain" content={ogUrl} />
36
+ <meta property="twitter:url" content={ogUrl} />
37
+ <meta name="twitter:title" content={title} />
38
+ <meta name="twitter:description" content={description} />
39
+ <meta name="twitter:image" content={ogImg} />
40
+ <meta name="twitter:image:alt" content={companyName} />
41
+ </svelte:head>
@@ -0,0 +1,70 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/SocialMedia.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
+ /**
10
+ * Social media link object.
11
+ * @typedef {Object} SocialLink
12
+ * @property {string} href - The URL of the social media profile.
13
+ * @property {string} label - The name of the social media platform (used for accessibility).
14
+ * @property {string} iconClass - The CSS class for the font-awesome icon.
15
+ * @property {string} [rel="noopener noreferrer"] - The `rel` attribute for the link (optional, defaults to "noopener noreferrer").
16
+ */
17
+
18
+ /**
19
+ * Array of social media links.
20
+ * @type {SocialLink[]}
21
+ */
22
+ const socialLinks = [
23
+ {
24
+ href: "https://instagram.com/netwk_pro",
25
+ label: "Instagram",
26
+ iconClass: "fab fa-square-instagram fa-2x",
27
+ },
28
+ {
29
+ href: "https://facebook.com/neteng.pro",
30
+ label: "Facebook",
31
+ iconClass: "fab fa-square-facebook fa-2x",
32
+ },
33
+ {
34
+ href: "https://linkedin.com/company/netwk-pro",
35
+ label: "LinkedIn",
36
+ iconClass: "fab fa-linkedin fa-2x",
37
+ },
38
+ {
39
+ href: "https://noc.social/@NetEng_Pro",
40
+ label: "Mastodon",
41
+ rel: "me noopener noreferrer", // Special rel attribute for Mastodon
42
+ iconClass: "fab fa-mastodon fa-2x",
43
+ },
44
+ {
45
+ href: "https://github.com/netwk-pro/",
46
+ label: "GitHub",
47
+ iconClass: "fab fa-square-github fa-2x",
48
+ },
49
+ ];
50
+ </script>
51
+
52
+ <!-- BEGIN SOCIAL MEDIA -->
53
+ <div class="soc-wrap">
54
+ <table class="soc">
55
+ <tbody>
56
+ <tr>
57
+ {#each socialLinks as { href, label, rel = "noopener noreferrer", iconClass }}
58
+ <td class="soc-fa">
59
+ <p>
60
+ <a {rel} {href} target="_blank" aria-label={label}>
61
+ <span class={iconClass}></span>
62
+ </a>
63
+ </p>
64
+ </td>
65
+ {/each}
66
+ </tr>
67
+ </tbody>
68
+ </table>
69
+ </div>
70
+ <!-- END SOCIAL MEDIA -->
@@ -0,0 +1,24 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/foss/FossFeatures.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
+ /**
10
+ * Array of feature strings that describe the FOSS item
11
+ * @type {string[]}
12
+ */
13
+ export let features = [];
14
+ </script>
15
+
16
+ <!-- BEGIN FOSS FEATURES -->
17
+ {#if features && features.length > 0}
18
+ <ul>
19
+ {#each features as feature}
20
+ <li>{feature}</li>
21
+ {/each}
22
+ </ul>
23
+ {/if}
24
+ <!-- END FOSS FEATURES -->
@@ -0,0 +1,153 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/foss/FossItemContent.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 FossFeatures from "$lib/components/foss/FossFeatures.svelte";
10
+ // Import directly from $lib by way of image utility
11
+ import { obtainiumPng, obtainiumWbp } from "$lib";
12
+
13
+ /** @type {"noopener noreferrer"} */
14
+ const rel = "noopener noreferrer";
15
+
16
+ /** @type {string} */
17
+ const obtainiumLink =
18
+ "https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22%3A%22fe.linksheet.nightly%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2FLinkSheet%2Fnightly%22%2C%22author%22%3A%221fexd%22%2C%22name%22%3A%22LinkSheet%20Nightly%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Atrue%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22dontSortReleasesList%5C%22%3Afalse%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Afalse%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22LinkSheet.Nightly%5C%22%2C%5C%22invertAPKFilter%5C%22%3Atrue%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22Restore%20link%20control%20on%20Android%2012%2B%5C%22%7D%22%7D";
19
+
20
+ /** @type {"async"} */
21
+ const decoding = "async";
22
+
23
+ /** @type {"lazy"} */
24
+ const loading = "lazy";
25
+
26
+ /**
27
+ * @type {{
28
+ * id: string,
29
+ * title: string,
30
+ * images: {
31
+ * webp: string,
32
+ * png: string
33
+ * },
34
+ * imgAlt: string,
35
+ * headline: string,
36
+ * headlineDescription: string,
37
+ * detailsDescription: string,
38
+ * features: any[],
39
+ * notes: string[],
40
+ * links: Array<{
41
+ * label?: string,
42
+ * href?: string,
43
+ * imgAlt?: string,
44
+ * downloadText?: string,
45
+ * downloadHref?: string,
46
+ * hideLabels?: boolean
47
+ * }>
48
+ * }}
49
+ */
50
+ export let fossItem;
51
+
52
+ /**
53
+ * Flag indicating if this is the first FOSS item in the list.
54
+ * Only the first item should use eager loading.
55
+ * @type {boolean}
56
+ */
57
+ export let isFirst = false;
58
+ </script>
59
+
60
+ <!-- BEGIN FOSS ITEMS -->
61
+ <section id={fossItem.id}>
62
+ <div class="foss-wrap">
63
+ <table class="foss">
64
+ <tbody>
65
+ <tr>
66
+ <td class="foss-cell">
67
+ <picture>
68
+ <source srcset={fossItem.images.webp} type="image/webp" />
69
+ <img
70
+ decoding={isFirst ? "sync" : decoding}
71
+ loading={isFirst ? "eager" : loading}
72
+ fetchpriority={isFirst ? "high" : "auto"}
73
+ src={fossItem.images.png}
74
+ alt={fossItem.imgAlt}
75
+ style="width: 50px; height: 50px" />
76
+ </picture>
77
+ </td>
78
+ <td class="foss-cell">
79
+ <h2>{fossItem.title}</h2>
80
+ </td>
81
+ </tr>
82
+ </tbody>
83
+ </table>
84
+ </div>
85
+
86
+ <h3>{fossItem.headline}</h3>
87
+
88
+ {@html fossItem.headlineDescription}
89
+
90
+ <FossFeatures features={fossItem.features} />
91
+
92
+ {@html fossItem.detailsDescription}
93
+
94
+ {#each fossItem.notes as note}
95
+ <blockquote class="bquote">
96
+ {@html note}
97
+ </blockquote>
98
+ {/each}
99
+
100
+ &nbsp;
101
+
102
+ <div class="linksheet">
103
+ <!-- Special handling for LinkSheet's Obtainium link -->
104
+ {#if fossItem.id === "linksheet"}
105
+ <div class="linksheet-entry">
106
+ <a {rel} href={obtainiumLink} target="_blank">
107
+ <picture>
108
+ <source srcset={obtainiumWbp} type="image/webp" />
109
+ <img
110
+ decoding={isFirst ? "sync" : decoding}
111
+ loading={isFirst ? "eager" : loading}
112
+ fetchpriority={isFirst ? "high" : "auto"}
113
+ src={obtainiumPng}
114
+ alt="Obtainium"
115
+ style="width: 207px; height: 80px" />
116
+ </picture>
117
+ </a>
118
+ <p>
119
+ <span style="color: #ffc627"
120
+ ><i class="fas fa-file-arrow-down" style="margin-left: 8px;"></i
121
+ ></span>
122
+ <a
123
+ {rel}
124
+ href="https://raw.githubusercontent.com/netwk-pro/dev-sveltekit/refs/heads/master/assets/bin/linksheet.json"
125
+ download
126
+ type="application/json"
127
+ style="margin-left: 8px;"
128
+ target="_blank">
129
+ Obtainium App Config
130
+ </a>
131
+ </p>
132
+ </div>
133
+ {/if}
134
+
135
+ <!-- Other links -->
136
+ {#each fossItem.links as { label, href, imgAlt, downloadText, downloadHref, hideLabels }, i}
137
+ <!-- Skip the first link for LinkSheet since we already handled it separately -->
138
+ {#if !(fossItem.id === "linksheet" && i === 0)}
139
+ <div class="linksheet-entry">
140
+ {#if !hideLabels && label && href}
141
+ <strong>{label}:</strong>
142
+ <a {rel} {href} target="_blank">{href}</a>
143
+ {/if}
144
+ </div>
145
+ {/if}
146
+ {/each}
147
+ </div>
148
+
149
+ <div class="spacer"></div>
150
+
151
+ <span class="small-text"><a href="#top">Back to top</a></span>
152
+ </section>
153
+ <!-- END FOSS ITEMS -->
@@ -0,0 +1,188 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/layout/Footer.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
+ // Import icons for licenses
11
+ import { bySvg, ccSvg } from "$lib";
12
+
13
+ // Log the base path to verify its value
14
+ //console.log("Base path:", base);
15
+
16
+ // Dynamic links for licensing and trademark
17
+ const ccbyLink = `${base}/license#cc-by`;
18
+ const gnugplLink = `${base}/license#gnu-gpl`;
19
+ const trademarkLink = `${base}/license#trademark`;
20
+
21
+ /**
22
+ * Creator details object.
23
+ * @typedef {Object} Creator
24
+ * @property {string} name - The name of the creator.
25
+ * @property {string} url - The URL of the creator's website.
26
+ * @property {string} trademark - The trademark name of the creator.
27
+ * @property {string} slogan - The slogan of the creator.
28
+ */
29
+
30
+ /**
31
+ * Icon details object.
32
+ * @typedef {Object} Icon
33
+ * @property {string} src - The source URL of the icon image.
34
+ * @property {string} alt - The alt text for the icon image.
35
+ */
36
+
37
+ /**
38
+ * License details object.
39
+ * @typedef {Object} License
40
+ * @property {string} type - The type of the license (e.g., "CC BY 4.0").
41
+ * @property {string} url - The internal URL for the license.
42
+ * @property {string} [externalUrl] - The external URL for the license.
43
+ * @property {string} [description] - A brief description of the license.
44
+ * @property {Icon[]} [icons] - An array of icon objects for representing the license visually.
45
+ */
46
+
47
+ /**
48
+ * @type {Creator}
49
+ */
50
+ const creator = {
51
+ name: "Network Pro Strategies",
52
+ url: "https://netwk.pro",
53
+ trademark: "Network Pro™",
54
+ slogan: "Locking Down Networks™",
55
+ };
56
+
57
+ /**
58
+ * @type {License[]}
59
+ */
60
+ const licenses = [
61
+ {
62
+ type: "CC BY 4.0",
63
+ url: ccbyLink,
64
+ externalUrl: "https://creativecommons.org/licenses/by/4.0/",
65
+ icons: [
66
+ {
67
+ src: ccSvg,
68
+ alt: "Creative Commons BY",
69
+ },
70
+ {
71
+ src: bySvg,
72
+ alt: "Creative Commons BY",
73
+ },
74
+ ],
75
+ },
76
+ {
77
+ type: "GNU GPL",
78
+ url: gnugplLink,
79
+ externalUrl: "https://fsf.org",
80
+ description: "Free Software Foundation",
81
+ },
82
+ ];
83
+
84
+ /**
85
+ * Namespace attributes for the container.
86
+ * @type {Object}
87
+ */
88
+ const namespaceAttributes = {
89
+ "xmlns:cc": "http://creativecommons.org/ns#",
90
+ "xmlns:dct": "http://purl.org/dc/terms/",
91
+ };
92
+
93
+ /**
94
+ * Relation attributes for external links.
95
+ * @type {string}
96
+ */
97
+ const rel = "noopener noreferrer";
98
+
99
+ /**
100
+ * Relation attributes for license links.
101
+ * @type {string}
102
+ */
103
+ const relLicense = "license noopener noreferrer";
104
+
105
+ /**
106
+ * Target attribute for opening links in the same tab.
107
+ * @type {string}
108
+ */
109
+ const targetSelf = "_self";
110
+
111
+ /**
112
+ * Target attribute for opening links in a new tab.
113
+ * @type {string}
114
+ */
115
+ const targetBlank = "_blank";
116
+ </script>
117
+
118
+ <!-- BEGIN FOOTER -->
119
+ <div class="copyright" {...namespaceAttributes}>
120
+ <!-- Copyright Section -->
121
+ <p>
122
+ Copyright &copy; 2025<br />
123
+ <a
124
+ rel="cc:attributionURL dct:creator"
125
+ property="cc:attributionName"
126
+ href={creator.url}
127
+ target={targetBlank}>
128
+ <strong>{creator.name}</strong>
129
+ </a>
130
+ ({creator.trademark})
131
+ </p>
132
+
133
+ <!-- Trademark Section -->
134
+ <p>
135
+ {creator.trademark}, the shield logo, and the "{creator.slogan}" slogan are
136
+ <a href={trademarkLink} target={targetSelf}>trademarks</a>
137
+ of {creator.name}.
138
+ </p>
139
+
140
+ <!-- Licensing Section -->
141
+ <p>
142
+ Licensed under
143
+ {#each licenses as license, index}
144
+ {#if license.type === "CC BY 4.0"}
145
+ <a
146
+ href={license.url}
147
+ target={targetSelf}
148
+ rel={relLicense}
149
+ style="display: inline-block">
150
+ <strong>{license.type}</strong>
151
+ </a>
152
+ {#if license.icons}
153
+ {#each license.icons as icon}
154
+ <a
155
+ href={license.externalUrl}
156
+ target={targetBlank}
157
+ rel={relLicense}
158
+ style="display: inline-block">
159
+ <img
160
+ decoding="async"
161
+ loading="lazy"
162
+ src={icon.src}
163
+ alt={icon.alt}
164
+ style="
165
+ width: 18px !important;
166
+ height: 18px !important;
167
+ margin-left: 3px;
168
+ text-decoration: none;
169
+ vertical-align: text-bottom;
170
+ " />
171
+ </a>
172
+ {/each}
173
+ {/if}
174
+ {:else}
175
+ <a href={license.url} target={targetSelf} rel={relLicense}>
176
+ <strong>{license.type}</strong>
177
+ </a>
178
+ , as published by the
179
+ <a {rel} href={license.externalUrl} target={targetBlank}
180
+ >{license.description}</a
181
+ >, either version 3 of the License, or (at your option) any later
182
+ version.
183
+ {/if}
184
+ {index < licenses.length - 1 ? ", and the " : ""}
185
+ {/each}
186
+ </p>
187
+ </div>
188
+ <!-- END FOOTER -->
@@ -0,0 +1,86 @@
1
+ <!-- ==========================================================================
2
+ src/lib/components/layout/HeaderDefault.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
+ const homeLink = base || "/";
15
+ const aboutLink = `${base}/about`;
16
+ const fossLink = `${base}/foss-spotlight`;
17
+ const blogLink = "https://blog.netwk.pro";
18
+
19
+ /**
20
+ * Navigation link object.
21
+ * @typedef {Object} NavItem
22
+ * @property {string} label - The text displayed for the link.
23
+ * @property {string} href - The URL or anchor the link points to.
24
+ * @property {string} target - Specifies where to open the link (e.g., "_self" or "_blank").
25
+ * @property {boolean} external - Whether the link points to an external resource.
26
+ */
27
+
28
+ /**
29
+ * Array of navigation links.
30
+ * @type {NavItem[]}
31
+ */
32
+ const nav = [
33
+ { label: "home", href: homeLink, target: "_self", external: false },
34
+ { label: "about", href: aboutLink, target: "_self", external: false },
35
+ { label: "foss", href: fossLink, target: "_self", external: false },
36
+ {
37
+ label: "blog",
38
+ href: blogLink,
39
+ target: "_self",
40
+ external: false,
41
+ },
42
+ {
43
+ label: "discussions",
44
+ href: "https://github.com/netwk-pro/netwk-pro.github.io/discussions",
45
+ target: "_blank",
46
+ external: true,
47
+ },
48
+ {
49
+ label: "link hub",
50
+ href: "https://linktr.ee/neteng_pro",
51
+ target: "_blank",
52
+ external: true,
53
+ },
54
+ ];
55
+
56
+ /**
57
+ * Relation attribute for external links.
58
+ * @type {string}
59
+ */
60
+ const rel = "noopener noreferrer";
61
+ </script>
62
+
63
+ <!-- BEGIN DEFAULT HEADER -->
64
+ <nav class="center-nav">
65
+ {#each nav as { label, href, target, external }, index}
66
+ <a {href} {target} rel={external ? rel : undefined}>
67
+ {label}
68
+ </a>
69
+ {#if external}
70
+ <sup>
71
+ <span style="color: #ffc627;">
72
+ <i class="fas fa-arrow-up-right-from-square fa-2xs"></i>
73
+ </span>
74
+ </sup>
75
+ {/if}
76
+ <!-- Separator logic -->
77
+ {#if index < nav.length - 1}
78
+ {#if label === "blog"}
79
+ <br />
80
+ {:else}
81
+ <span class="separator">|</span>
82
+ {/if}
83
+ {/if}
84
+ {/each}
85
+ </nav>
86
+ <!-- END DEFAULT HEADER -->