@networkpro/web 0.13.1 → 1.0.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 (282) hide show
  1. package/CODE_OF_CONDUCT.md +172 -0
  2. package/LICENSE.md +4 -4
  3. package/README.md +11 -10
  4. package/assets/bin/contact.vcf +13 -0
  5. package/assets/bin/contact@s.neteng.pro.aexpk +17 -0
  6. package/assets/bin/contact@s.neteng.pro.asc +17 -0
  7. package/assets/bin/github@sl.neteng.cc.aexpk +29 -0
  8. package/assets/bin/github@sl.neteng.cc.asc +29 -0
  9. package/assets/bin/linksheet.json +8 -0
  10. package/assets/bin/support@neteng.pro.aexpk +47 -0
  11. package/assets/bin/support@neteng.pro.asc +47 -0
  12. package/assets/consulting-terms.pdf +0 -0
  13. package/eslint.config.mjs +112 -0
  14. package/jsconfig.json +28 -0
  15. package/netlify.toml +13 -0
  16. package/package.json +64 -61
  17. package/playwright.config.js +79 -0
  18. package/postcss.config.mjs +14 -0
  19. package/scripts/bundleCss.js +40 -0
  20. package/src/app.d.ts +15 -0
  21. package/src/app.html +81 -0
  22. package/src/demo.spec.js +14 -0
  23. package/src/lib/components/Badges.svelte +74 -0
  24. package/src/lib/components/ContainerSection.svelte +19 -0
  25. package/src/lib/components/FullWidthSection.svelte +13 -0
  26. package/src/lib/components/LegalNav.svelte +75 -0
  27. package/src/lib/components/Logo.svelte +110 -0
  28. package/src/lib/components/SocialMedia.svelte +70 -0
  29. package/src/lib/components/foss/FossFeatures.svelte +24 -0
  30. package/src/lib/components/foss/FossItemContent.svelte +153 -0
  31. package/src/lib/components/layout/Footer.svelte +188 -0
  32. package/src/lib/components/layout/HeaderDefault.svelte +86 -0
  33. package/src/lib/components/layout/HeaderHome.svelte +84 -0
  34. package/src/lib/data/fossData.js +233 -0
  35. package/src/lib/images.js +77 -0
  36. package/src/lib/img/badges/cc-by-badge.png +0 -0
  37. package/src/lib/img/badges/gpl-badge.svg +1 -0
  38. package/src/lib/img/by.svg +1 -0
  39. package/src/lib/img/cc.svg +1 -0
  40. package/src/lib/img/logo-web.png +0 -0
  41. package/src/lib/img/logo-web.webp +0 -0
  42. package/src/lib/img/obtainium.webp +0 -0
  43. package/src/lib/img/posts/acode.png +0 -0
  44. package/src/lib/img/posts/acode.webp +0 -0
  45. package/src/lib/img/posts/linksheet.png +0 -0
  46. package/src/lib/img/posts/linksheet.webp +0 -0
  47. package/src/lib/img/posts/pmx.png +0 -0
  48. package/src/lib/img/posts/pmx.webp +0 -0
  49. package/src/lib/img/posts/tosdr.png +0 -0
  50. package/src/lib/img/posts/tosdr.webp +0 -0
  51. package/src/lib/img/posts/urlcheck.png +0 -0
  52. package/src/lib/img/posts/urlcheck.webp +0 -0
  53. package/src/lib/index.js +43 -0
  54. package/src/lib/pages/AboutContent.svelte +294 -0
  55. package/src/lib/pages/FossContent.svelte +109 -0
  56. package/src/lib/pages/HomeContent.svelte +120 -0
  57. package/src/lib/pages/LicenseContent.svelte +486 -0
  58. package/src/lib/pages/PrivacyContent.svelte +249 -0
  59. package/src/lib/pages/TermsConditionsContent.svelte +240 -0
  60. package/src/lib/pages/TermsUseContent.svelte +236 -0
  61. package/src/lib/registerServiceWorker.js +65 -0
  62. package/src/lib/styles/css/brands.css +76 -0
  63. package/src/lib/styles/css/brands.min.css +6 -0
  64. package/src/lib/styles/css/default.css +454 -0
  65. package/src/lib/styles/css/fontawesome.min.css +9 -0
  66. package/src/lib/styles/css/global.css +10 -0
  67. package/src/lib/styles/css/normalize.css +349 -0
  68. package/src/lib/styles/css/offline.css +120 -0
  69. package/src/lib/styles/css/solid.min.css +6 -0
  70. package/src/lib/styles/css/style.css +310 -0
  71. package/src/lib/styles/fa-global.css +10 -0
  72. package/src/lib/styles/global.min.css +9 -0
  73. package/src/lib/styles/index.js +11 -0
  74. package/src/lib/styles/webfonts/fa-brands-400.ttf +0 -0
  75. package/src/lib/styles/webfonts/fa-brands-400.woff2 +0 -0
  76. package/src/lib/styles/webfonts/fa-solid-900.ttf +0 -0
  77. package/src/lib/styles/webfonts/fa-solid-900.woff2 +0 -0
  78. package/src/routes/+error.svelte +43 -0
  79. package/src/routes/+layout.js +94 -0
  80. package/src/routes/+layout.svelte +110 -0
  81. package/src/routes/+page.svelte +77 -0
  82. package/src/routes/about/+page.svelte +61 -0
  83. package/src/routes/contact/+page.server.js +24 -0
  84. package/src/routes/example.svx +9 -0
  85. package/src/routes/foss-spotlight/+page.svelte +63 -0
  86. package/src/routes/license/+page.svelte +63 -0
  87. package/src/routes/page.svelte.test.js +18 -0
  88. package/src/routes/privacy-policy/+page.svelte +63 -0
  89. package/src/routes/privacy-rights/+page.server.js +24 -0
  90. package/src/routes/terms-conditions/+page.svelte +63 -0
  91. package/src/routes/terms-of-use/+page.svelte +63 -0
  92. package/src/service-worker.d.ts +4 -0
  93. package/src/service-worker.js +90 -0
  94. package/static/icon-512x512-maskable.png +0 -0
  95. package/static/icon-contact.png +0 -0
  96. package/static/icon-services.png +0 -0
  97. package/static/img/svelte.png +0 -0
  98. package/static/manifest.json +64 -0
  99. package/static/offline.html +79 -0
  100. package/static/offline.min.css +7 -0
  101. package/{robots.txt → static/robots.txt} +0 -2
  102. package/static/sitemap.xml +102 -0
  103. package/stylelint.config.js +118 -0
  104. package/svelte.config.js +56 -0
  105. package/tests/app.spec.js +67 -0
  106. package/tests/mobile.spec.js +58 -0
  107. package/tests-examples/demo-todo-app.spec.js +504 -0
  108. package/tsconfig.custom.json +39 -0
  109. package/vite.config.js +19 -0
  110. package/vitest-setup-client.js +33 -0
  111. package/vitest.config.client.js +34 -0
  112. package/vitest.config.server.js +30 -0
  113. package/404.html +0 -84
  114. package/about.html +0 -334
  115. package/about.html.br +0 -0
  116. package/about.html.gz +0 -0
  117. package/bundle-report.html +0 -39
  118. package/css/default.css +0 -1
  119. package/css/normalize.css +0 -1
  120. package/css/style.css +0 -1
  121. package/docs/404.html +0 -1187
  122. package/docs/assets/external/avatars.githubusercontent.com/u/170266279.png +0 -0
  123. package/docs/assets/external/img.shields.io/badge/GitHub_Package_Registry-white.ed8def48.svg +0 -1
  124. package/docs/assets/external/img.shields.io/badge/npmjs-white.681714c1.svg +0 -1
  125. package/docs/assets/external/mirrors.creativecommons.org/presskit/icons/by.svg +0 -20
  126. package/docs/assets/external/mirrors.creativecommons.org/presskit/icons/cc.svg +0 -27
  127. package/docs/assets/external/unpkg.com/mermaid@11/dist/mermaid.min.js +0 -2607
  128. package/docs/assets/images/favicon.png +0 -0
  129. package/docs/assets/javascripts/bundle.c8b220af.min.js +0 -16
  130. package/docs/assets/javascripts/bundle.c8b220af.min.js.map +0 -7
  131. package/docs/assets/javascripts/lunr/min/lunr.ar.min.js +0 -1
  132. package/docs/assets/javascripts/lunr/min/lunr.da.min.js +0 -18
  133. package/docs/assets/javascripts/lunr/min/lunr.de.min.js +0 -18
  134. package/docs/assets/javascripts/lunr/min/lunr.du.min.js +0 -18
  135. package/docs/assets/javascripts/lunr/min/lunr.el.min.js +0 -1
  136. package/docs/assets/javascripts/lunr/min/lunr.es.min.js +0 -18
  137. package/docs/assets/javascripts/lunr/min/lunr.fi.min.js +0 -18
  138. package/docs/assets/javascripts/lunr/min/lunr.fr.min.js +0 -18
  139. package/docs/assets/javascripts/lunr/min/lunr.he.min.js +0 -1
  140. package/docs/assets/javascripts/lunr/min/lunr.hi.min.js +0 -1
  141. package/docs/assets/javascripts/lunr/min/lunr.hu.min.js +0 -18
  142. package/docs/assets/javascripts/lunr/min/lunr.hy.min.js +0 -1
  143. package/docs/assets/javascripts/lunr/min/lunr.it.min.js +0 -18
  144. package/docs/assets/javascripts/lunr/min/lunr.ja.min.js +0 -1
  145. package/docs/assets/javascripts/lunr/min/lunr.jp.min.js +0 -1
  146. package/docs/assets/javascripts/lunr/min/lunr.kn.min.js +0 -1
  147. package/docs/assets/javascripts/lunr/min/lunr.ko.min.js +0 -1
  148. package/docs/assets/javascripts/lunr/min/lunr.multi.min.js +0 -1
  149. package/docs/assets/javascripts/lunr/min/lunr.nl.min.js +0 -18
  150. package/docs/assets/javascripts/lunr/min/lunr.no.min.js +0 -18
  151. package/docs/assets/javascripts/lunr/min/lunr.pt.min.js +0 -18
  152. package/docs/assets/javascripts/lunr/min/lunr.ro.min.js +0 -18
  153. package/docs/assets/javascripts/lunr/min/lunr.ru.min.js +0 -18
  154. package/docs/assets/javascripts/lunr/min/lunr.sa.min.js +0 -1
  155. package/docs/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -1
  156. package/docs/assets/javascripts/lunr/min/lunr.sv.min.js +0 -18
  157. package/docs/assets/javascripts/lunr/min/lunr.ta.min.js +0 -1
  158. package/docs/assets/javascripts/lunr/min/lunr.te.min.js +0 -1
  159. package/docs/assets/javascripts/lunr/min/lunr.th.min.js +0 -1
  160. package/docs/assets/javascripts/lunr/min/lunr.tr.min.js +0 -18
  161. package/docs/assets/javascripts/lunr/min/lunr.vi.min.js +0 -1
  162. package/docs/assets/javascripts/lunr/min/lunr.zh.min.js +0 -1
  163. package/docs/assets/javascripts/lunr/tinyseg.js +0 -206
  164. package/docs/assets/javascripts/lunr/wordcut.js +0 -6708
  165. package/docs/assets/javascripts/workers/search.f8cc74c7.min.js +0 -42
  166. package/docs/assets/javascripts/workers/search.f8cc74c7.min.js.map +0 -7
  167. package/docs/assets/stylesheets/main.2afb09e1.min.css +0 -1
  168. package/docs/assets/stylesheets/main.2afb09e1.min.css.map +0 -1
  169. package/docs/assets/stylesheets/palette.06af60db.min.css +0 -1
  170. package/docs/assets/stylesheets/palette.06af60db.min.css.map +0 -1
  171. package/docs/blog/2015/01/04/secure-secure-shell/index.html +0 -1771
  172. package/docs/blog/2025/04/30/our-blog-is-live/index.html +0 -1436
  173. package/docs/blog/archive/2015/index.html +0 -1303
  174. package/docs/blog/archive/2025/index.html +0 -1291
  175. package/docs/blog/category/security/index.html +0 -1303
  176. package/docs/blog/index.html +0 -1350
  177. package/docs/conduct/index.html +0 -1509
  178. package/docs/feed_json_created.json +0 -1
  179. package/docs/feed_json_updated.json +0 -1
  180. package/docs/feed_rss_created.xml +0 -1
  181. package/docs/feed_rss_updated.xml +0 -1
  182. package/docs/fontawesome/LICENSE.txt +0 -165
  183. package/docs/fontawesome/brands/facebook.svg +0 -1
  184. package/docs/fontawesome/brands/instagram.svg +0 -1
  185. package/docs/fontawesome/brands/linkedin.svg +0 -1
  186. package/docs/fontawesome/brands/mastodon.svg +0 -1
  187. package/docs/fontawesome/solid/at.svg +0 -1
  188. package/docs/index.html +0 -1395
  189. package/docs/legal/index.html +0 -1740
  190. package/docs/privacy/index.html +0 -1615
  191. package/docs/search/search_index.json +0 -1
  192. package/docs/sitemap.xml +0 -55
  193. package/docs/sitemap.xml.gz +0 -0
  194. package/docs/tags/index.html +0 -2084
  195. package/docs/terms-conditions/index.html +0 -1655
  196. package/docs/terms-use/index.html +0 -1584
  197. package/favicon-192.png +0 -0
  198. package/favicon-512.png +0 -0
  199. package/favicon.svg.br +0 -0
  200. package/favicon.svg.gz +0 -0
  201. package/html/spotlight.html +0 -435
  202. package/html/spotlight.html.br +0 -0
  203. package/html/spotlight.html.gz +0 -0
  204. package/img/banner-1280x640.png +0 -0
  205. package/img/banner-1440.png +0 -0
  206. package/img/banner-og-1200x630.png +0 -0
  207. package/img/favicon-template.png +0 -0
  208. package/img/fb-cover.png +0 -0
  209. package/img/fb-cover2.png +0 -0
  210. package/img/fsf-member.png +0 -0
  211. package/img/gh-logo.png +0 -0
  212. package/img/gpl3-small.png +0 -0
  213. package/img/gpl3.png +0 -0
  214. package/img/linkedin-banner-new.png +0 -0
  215. package/img/linkedin-banner.png +0 -0
  216. package/img/linkedin-banner2.png +0 -0
  217. package/img/logo-1024x1024.png +0 -0
  218. package/img/logo-alt.png +0 -0
  219. package/img/logo-elevated.png +0 -0
  220. package/img/logo-light-elevated.png +0 -0
  221. package/img/logo-light-slogan.png +0 -0
  222. package/img/logo-light.png +0 -0
  223. package/img/logo-slogan.png +0 -0
  224. package/img/logo-transparent-black-small.png +0 -0
  225. package/img/logo-transparent-black.png +0 -0
  226. package/img/logo-transparent-elevated.png +0 -0
  227. package/img/logo-transparent-slogan.png +0 -0
  228. package/img/mastodon-banner.png +0 -0
  229. package/img/netpro-logo-transparent.png +0 -0
  230. package/img/posts/acode.png +0 -0
  231. package/img/posts/linksheet.png +0 -0
  232. package/img/posts/tosdr.png +0 -0
  233. package/img/posts/urlcheck.png +0 -0
  234. package/img/qr/pgp-github.png +0 -0
  235. package/img/qr/pgp-support.png +0 -0
  236. package/img/qr/vcard.png +0 -0
  237. package/img/sd311.png +0 -0
  238. package/img/shield.png +0 -0
  239. package/img/shield.svg +0 -1
  240. package/img/shield.svg.br +0 -0
  241. package/img/shield.svg.gz +0 -0
  242. package/img/shield2.png +0 -0
  243. package/img/shield3-2000x2000.png +0 -0
  244. package/img/shield3-black-1024x1024.png +0 -0
  245. package/img/shield3-black.png +0 -0
  246. package/img/shield3-white.png +0 -0
  247. package/img/trademark.jpg +0 -0
  248. package/index.html +0 -268
  249. package/index.html.br +0 -0
  250. package/index.html.gz +0 -0
  251. package/js/app.d544156ea2ba85a7d486.mjs +0 -1
  252. package/js/runtime.52b1ac291305b90de3df.mjs +0 -1
  253. package/js/vendor/.gitkeep +0 -0
  254. package/legal.html +0 -535
  255. package/legal.html.br +0 -0
  256. package/legal.html.gz +0 -0
  257. package/privacy.html +0 -404
  258. package/privacy.html.br +0 -0
  259. package/privacy.html.gz +0 -0
  260. package/site.webmanifest +0 -25
  261. package/sitemap.xml +0 -177
  262. package/terms-and-conditions.html +0 -409
  263. package/terms-and-conditions.html.br +0 -0
  264. package/terms-and-conditions.html.gz +0 -0
  265. package/terms-of-use.html +0 -380
  266. package/terms-of-use.html.br +0 -0
  267. package/terms-of-use.html.gz +0 -0
  268. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets → assets}/nsa-happy-dance.png +0 -0
  269. /package/{favicon.svg → src/lib/img/favicon.svg} +0 -0
  270. /package/{favicon-180.png → src/lib/img/icon-180x180.png} +0 -0
  271. /package/{img/badge_obtainium.png → src/lib/img/obtainium.png} +0 -0
  272. /package/{img → src/lib/img}/qr/pgp-contact.png +0 -0
  273. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/pgp-github.png +0 -0
  274. /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
  275. /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/vcard.png +0 -0
  276. /package/{CNAME → static/CNAME} +0 -0
  277. /package/{favicon.ico → static/favicon.ico} +0 -0
  278. /package/{docs/img/favicon.png → static/icon-192x192.png} +0 -0
  279. /package/{docs/img/logo.png → static/icon-512x512.png} +0 -0
  280. /package/{favicon-splash.png → static/icon-splash.png} +0 -0
  281. /package/{img → static/img}/logo-transparent.png +0 -0
  282. /package/{img → static/img}/logo.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,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 -->