@networkpro/web 1.0.0 → 1.1.2

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.
package/README.md CHANGED
@@ -52,7 +52,7 @@ Web: <https://bio.neteng.pro>
52
52
 
53
53
  </section>
54
54
 
55
- [![Netlify Status](https://api.netlify.com/api/v1/badges/94ec8cc0-4712-409a-b54e-2dfbe7024a42/deploy-status)](https://app.netlify.com/sites/networkpro/deploys) [![NPM Version](https://img.shields.io/npm/v/%40networkpro%2Fdev-sveltekit?registry_uri=https%3A%2F%2Fregistry.npmjs.com&style=flat&logo=npm&logoSize=auto&color=%23CB3837)](https://www.npmjs.com/package/@networkpro/dev-sveltekit) [![Build and Publish to Registries](https://github.com/netwk-pro/dev-sveltekit/actions/workflows/build-and-publish.yml/badge.svg)](https://github.com/netwk-pro/dev-sveltekit/actions/workflows/build-and-publish.yml)
55
+ [![Netlify Status](https://api.netlify.com/api/v1/badges/93910633-3fdb-4bb3-a9bf-5d91ccfeebf9/deploy-status)](https://app.netlify.com/projects/networkpro-web/deploys) [![NPM Version](https://img.shields.io/npm/v/%40networkpro%2Fweb?registry_uri=https%3A%2F%2Fregistry.npmjs.com&style=flat&logo=npm&logoSize=auto&color=%23CB3837)](https://www.npmjs.com/package/@networkpro/web) [![Build and Publish to Registries](https://github.com/netwk-pro/netwk-pro.github.io/actions/workflows/build-and-publish.yml/badge.svg)](https://github.com/netwk-pro/netwk-pro.github.io/actions/workflows/build-and-publish.yml)
56
56
  [![Code Style: Prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat)](https://github.com/prettier/prettier) [![stylelint](https://img.shields.io/badge/stylelint-%23747474?style=flat&logo=stylelint&logoSize=auto&labelColor=%23263238)](https://stylelint.io/)
57
57
  [![Contributor Covenant](https://img.shields.io/badge/Contributor%20Covenant-2.1-4baaaa.svg)](https://github.com/netwk-pro/netwk-pro.github.io/blob/master/CODE_OF_CONDUCT.md)
58
58
 
@@ -80,16 +80,16 @@ We also believe education is a core pillar of real-world security. That’s why
80
80
 
81
81
  &nbsp;
82
82
 
83
- 🔹 [Let’s connect](https://contact.neteng.pro) to discuss how we can help secure and strengthen your business today.
83
+ 🔹 [Let’s connect](https://netwk.pro/contact) to discuss how we can help secure and strengthen your business today.
84
84
 
85
85
  ---
86
86
 
87
87
  You can find our PGP keys and a vCard containing our contact information for your convenience below.
88
88
 
89
- | <img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/img/qr/pgp-support.png" width="125px" height="125px" alt="PGP Key - support@neteng.pro"> | **[support@neteng.pro](https://keys.openpgp.org/search?q=support%40neteng.pro)**<br />**PGP Key (ed25519)**<br />&nbsp;<br /><a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/support@neteng.pro.aexpk" download type="application/pgp-keys">**aexpk**</a>&nbsp; **&#47;** &nbsp;<a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/support@neteng.pro.asc" download type="application/pgp-keys">**asc**</a><br />&nbsp;<br />6590b992e2e3eff12738<br />7bce2af093e9dec61ba0 |
89
+ | <img decoding="sync" loading="eager" src="https://netwk.pro/img/qr/pgp-support.png" width="125px" height="125px" alt="PGP Key - support@neteng.pro"> | **[support@neteng.pro](https://keys.openpgp.org/search?q=support%40neteng.pro)**<br />**PGP Key (ed25519)**<br />&nbsp;<br /><a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/support@neteng.pro.aexpk" download type="application/pgp-keys">**aexpk**</a>&nbsp; **&#47;** &nbsp;<a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/support@neteng.pro.asc" download type="application/pgp-keys">**asc**</a><br />&nbsp;<br />6590b992e2e3eff12738<br />7bce2af093e9dec61ba0 |
90
90
  | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
91
- | **[contact@s.neteng.pro](https://keys.openpgp.org/search?q=contact%40s.neteng.pro)**<br />**PGP Key (ed25519)**<br />&nbsp;<br /><a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact@s.neteng.pro.aexpk" download type="application/pgp-keys">**aexpk**</a>&nbsp; **&#47;** &nbsp;<a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact@s.neteng.pro.asc" download type="application/pgp-keys">**asc**</a><br />&nbsp;<br />**df118baa6c2d9dcdebdc**<br />**2ddcf99373499495f957** | <img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/img/qr/pgp-contact.png" width="125px" height="125px" alt="PGP Key - contact@s.neteng.pro"> |
92
- | <img decoding="async" loading="lazy" src="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/img/qr/vcard.png" width="125px" height="125px" alt="vCard"> | **vCard**<br />&nbsp;<br /><a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact.vcf" download type="text/vcard">**vcf**</a> |
91
+ | **[contact@s.neteng.pro](https://keys.openpgp.org/search?q=contact%40s.neteng.pro)**<br />**PGP Key (ed25519)**<br />&nbsp;<br /><a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact@s.neteng.pro.aexpk" download type="application/pgp-keys">**aexpk**</a>&nbsp; **&#47;** &nbsp;<a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact@s.neteng.pro.asc" download type="application/pgp-keys">**asc**</a><br />&nbsp;<br />**df118baa6c2d9dcdebdc**<br />**2ddcf99373499495f957** | <img decoding="async" loading="lazy" src="https://netwk.pro/img/qr/pgp-contact.png" width="125px" height="125px" alt="PGP Key - contact@s.neteng.pro"> |
92
+ | <img decoding="async" loading="lazy" src="https://netwk.pro/img/qr/vcard.png" width="125px" height="125px" alt="vCard"> | **vCard**<br />&nbsp;<br /><a href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact.vcf" download type="text/vcard">**vcf**</a> |
93
93
 
94
94
  <sub>[Back to top](#top)</sub>
95
95
 
@@ -109,8 +109,8 @@ You can find our PGP keys and a vCard containing our contact information for you
109
109
  Copyright &copy; 2025
110
110
  **[Network Pro Strategies](https://netwk.pro/)** (Network Pro&trade;)
111
111
 
112
- Network Pro&trade;, the shield logo, and the "Locking Down Networks&trade;" slogan are [trademarks](https://netwk.pro/legal#trademark) of Network Pro Strategies.
112
+ Network Pro&trade;, the shield logo, and the "Locking Down Networks&trade;" slogan are [trademarks](https://netwk.pro/license#trademark) of Network Pro Strategies.
113
113
 
114
- Licensed under **[CC BY 4.0](https://creativecommons.org/licenses/by/4.0/)** and the **[GNU GPL](https://spdx.org/licenses/GPL-3.0-or-later.html)**, as published by the [Free Software Foundation](https://fsf.org), either version 3 of the License, or (at your option) any later version.
114
+ Licensed under **[CC BY 4.0](https://netwk.pro/license#cc-by)** and the **[GNU GPL](https://netwk.pro/license#gnu-gpl)**, as published by the [Free Software Foundation](https://fsf.org), either version 3 of the License, or (at your option) any later version.
115
115
 
116
116
  </span>
package/_headers ADDED
@@ -0,0 +1,9 @@
1
+ /*
2
+ Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' https://snap.licdn.com; img-src 'self' https://px.ads.linkedin.com; connect-src 'self' https://px.ads.linkedin.com https://snap.licdn.com; style-src 'self' 'unsafe-inline'; form-action 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; upgrade-insecure-requests;
3
+ X-Content-Type-Options: nosniff
4
+ X-Frame-Options: DENY
5
+ Referrer-Policy: strict-origin-when-cross-origin
6
+ Permissions-Policy: geolocation=(), camera=(), microphone=()
7
+ Cross-Origin-Embedder-Policy: require-corp
8
+ Cross-Origin-Opener-Policy: same-origin
9
+ Cross-Origin-Resource-Policy: same-origin
package/netlify.toml CHANGED
@@ -1,13 +1,3 @@
1
1
  [build]
2
2
  command = "npm run build"
3
3
  publish = "build"
4
-
5
- [[plugins]]
6
- package = "@netlify/plugin-sitemap"
7
-
8
- [plugins.inputs]
9
- buildDir = "build"
10
- filePath = "static/sitemap.xml"
11
- trailingSlash = true
12
- changeFreq = "monthly"
13
- priority = 0.5
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@networkpro/web",
3
3
  "private": false,
4
4
  "sideEffects": false,
5
- "version": "1.0.0",
5
+ "version": "1.1.2",
6
6
  "description": "Locking Down Networks, Unlocking Confidence | Security, Networking, Privacy — Network Pro Strategies",
7
7
  "keywords": [
8
8
  "security",
@@ -20,7 +20,7 @@
20
20
  },
21
21
  "repository": {
22
22
  "type": "git",
23
- "url": "git+https://github.com/netwk-pro/dev-sveltekit.git"
23
+ "url": "git+https://github.com/netwk-pro/netwk-pro.github.io.git"
24
24
  },
25
25
  "license": "CC-BY-4.0 OR GPL-3.0-or-later",
26
26
  "author": {
@@ -66,7 +66,7 @@
66
66
  "@netlify/plugin-sitemap": "^0.8.1",
67
67
  "@playwright/test": "^1.52.0",
68
68
  "@sveltejs/adapter-netlify": "^5.0.2",
69
- "@sveltejs/kit": "^2.21.0",
69
+ "@sveltejs/kit": "^2.21.1",
70
70
  "@sveltejs/vite-plugin-svelte": "^5.0.3",
71
71
  "@testing-library/jest-dom": "^6.6.3",
72
72
  "@testing-library/svelte": "^5.2.7",
@@ -101,5 +101,10 @@
101
101
  "vite": "^6.3.5",
102
102
  "vite-plugin-lightningcss": "^0.0.5",
103
103
  "vitest": "^3.1.3"
104
+ },
105
+ "overrides": {
106
+ "@sveltejs/kit": {
107
+ "cookie": "^0.7.0"
108
+ }
104
109
  }
105
110
  }
package/src/app.html CHANGED
@@ -2,39 +2,41 @@
2
2
  <html lang="en">
3
3
  <head>
4
4
  <meta charset="utf-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
6
 
6
7
  <!-- =====================================================================
7
8
  SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
8
9
  This file is part of Network Pro.
9
- ===================================================================== -->
10
+ ====================================================================== -->
10
11
 
11
12
  <title>%sveltekit.title%</title>
12
13
  <meta name="description" content="%sveltekit.description%" />
14
+ <meta
15
+ name="robots"
16
+ content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
17
+ <meta name="author" content="Network Pro Strategies" />
13
18
 
14
- <!-- Preconnect optimizations for LinkedIn -->
15
- <link rel="preconnect" href="https://snap.licdn.com" crossorigin />
16
- <link rel="preconnect" href="https://px.ads.linkedin.com" crossorigin />
17
-
18
- <!-- FontAwesome is self-hosted, so its preconnect has been removed -->
19
+ <!-- Optional CSP for Dev -->
20
+ <meta
21
+ http-equiv="Content-Security-Policy"
22
+ content="default-src 'self'; script-src 'self' 'unsafe-inline' https://snap.licdn.com; style-src 'self' 'unsafe-inline'; img-src 'self' data: https://px.ads.linkedin.com; connect-src 'self' https://px.ads.linkedin.com;" />
19
23
 
20
- <!-- Keep only the ICO favicon for maximum compatibility -->
24
+ <!-- Favicon: Keep only ICO for max compatibility -->
21
25
  <link
22
26
  rel="icon"
23
27
  href="%sveltekit.assets%/favicon.ico"
24
28
  sizes="any"
25
29
  type="image/x-icon" />
26
30
 
27
- <!-- SVG and PNG favicons will be added by the layout component -->
31
+ <!-- Preconnects (placed early to optimize connection time) -->
32
+ <link rel="preconnect" href="https://snap.licdn.com" crossorigin />
33
+ <link rel="preconnect" href="https://px.ads.linkedin.com" crossorigin />
28
34
 
35
+ <!-- Manifest + theme color -->
29
36
  <link rel="manifest" href="manifest.json" />
30
37
  <meta name="theme-color" content="#ffc627" />
31
38
 
32
- <meta name="viewport" content="width=device-width, initial-scale=1" />
33
-
34
- <meta name="author" content="Network Pro Strategies" />
35
- <meta
36
- name="robots"
37
- content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
39
+ <meta name="generator" content="SvelteKit 2.21.1" />
38
40
 
39
41
  %sveltekit.head%
40
42
  </head>
@@ -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,73 @@
1
+ /* ==========================================================================
2
+ src/lib/meta.js
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
+ /**
9
+ * @typedef {object} MetaData
10
+ * @property {string} title - The title of the page
11
+ * @property {string} description - The description of the page
12
+ */
13
+
14
+ /**
15
+ * @type {Record<string, MetaData>}
16
+ */
17
+ const meta = {
18
+ "/": {
19
+ title:
20
+ "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
21
+ description:
22
+ "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
23
+ },
24
+ "/about": {
25
+ title: "About Us — Network Pro™",
26
+ description: "About Us | Security, Networking, Privacy — Network Pro™",
27
+ },
28
+ "/privacy-policy": {
29
+ title: "Privacy Policy — Network Pro™",
30
+ description:
31
+ "Privacy Policy | Security, Networking, Privacy — Network Pro™",
32
+ },
33
+ "/terms-of-use": {
34
+ title: "Website Terms of Use — Network Pro™",
35
+ description:
36
+ "Website Terms of Use | Security, Networking, Privacy — Network Pro™",
37
+ },
38
+ "/license": {
39
+ title: "Legal, Copyright, and Licensing — Network Pro™",
40
+ description:
41
+ "Legal, Copyright, and Licensing | Security, Networking, Privacy — Network Pro™",
42
+ },
43
+ "/terms-conditions": {
44
+ title: "Consulting Terms and Conditions — Network Pro™",
45
+ description:
46
+ "Terms and Conditions | Security, Networking, Privacy — Network Pro™",
47
+ },
48
+ "/foss-spotlight": {
49
+ title: "FOSS Spotlight — Network Pro™",
50
+ description:
51
+ "FOSS Spotlight | Security, Networking, Privacy — Network Pro™",
52
+ },
53
+ "/contact": {
54
+ title: "Contact Form — Network Pro™",
55
+ description: "Contact Form | Security, Networking, Privacy — Network Pro™",
56
+ },
57
+ "/privacy-rights": {
58
+ title: "Privacy Rights Request Form — Network Pro™",
59
+ description:
60
+ "Privacy Rights Request Form | Security, Networking, Privacy — Network Pro™",
61
+ },
62
+ };
63
+
64
+ /** @type {MetaData} */
65
+ const defaultMeta = {
66
+ title: "Loading... | Network Pro™",
67
+ description:
68
+ "Please wait while the content loads... | Security, Networking, Privacy — Network Pro™",
69
+ };
70
+
71
+ // Export values
72
+ export { defaultMeta, meta };
73
+
@@ -113,7 +113,7 @@ This file is part of Network Pro.
113
113
  |
114
114
  <a
115
115
  rel={constants.rel}
116
- href="https://raw.githubusercontent.com/netwk-pro/netwk-pro-legal/refs/heads/master/assets/onboard/consulting-terms.pdf"
116
+ href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/consulting-terms.pdf"
117
117
  target={constants.targetBlank}>
118
118
  PDF <span class="fas fa-file-arrow-down"></span>
119
119
  </a>
@@ -12,62 +12,13 @@ This file is part of Network Pro.
12
12
  */
13
13
 
14
14
  /**
15
- * @type {Record<string, MetaData>}
16
- * Defines metadata for specific routes. The key is the pathname (string),
17
- * and the value is an object containing the title and description for the route.
15
+ * Fallback metadata to satisfy typing in +layout.svelte and +page.svelte.
16
+ * Actual meta content is provided per-route via +page.server.js.
18
17
  */
19
- const meta = {
20
- "/": {
21
- title:
22
- "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
23
- description:
24
- "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
25
- },
26
- "/about": {
27
- title: "About Us — Network Pro™",
28
- description: "About Us | Security, Networking, Privacy — Network Pro™",
29
- },
30
- "/privacy-policy": {
31
- title: "Privacy Policy — Network Pro™",
32
- description:
33
- "Privacy Policy | Security, Networking, Privacy — Network Pro™",
34
- },
35
- "/terms-of-use": {
36
- title: "Website Terms of Use — Network Pro™",
37
- description:
38
- "Website Terms of Use | Security, Networking, Privacy — Network Pro™",
39
- },
40
- "/license": {
41
- title: "Legal, Copyright, and Licensing — Network Pro™",
42
- description:
43
- "Legal, Copyright, and Licensing | Security, Networking, Privacy — Network Pro™",
44
- },
45
- "/terms-conditions": {
46
- title: "Consulting Terms and Conditions — Network Pro™",
47
- description:
48
- "Terms and Conditions | Security, Networking, Privacy — Network Pro™",
49
- },
50
- "/foss-spotlight": {
51
- title: "FOSS Spotlight — Network Pro™",
52
- description:
53
- "FOSS Spotlight | Security, Networking, Privacy — Network Pro™",
54
- },
55
- "/contact": {
56
- title: "Contact Form — Network Pro™",
57
- description: "Contact Form | Security, Networking, Privacy — Network Pro™",
58
- },
59
- "/privacy-rights": {
60
- title: "Privacy Rights Request Form — Network Pro™",
61
- description:
62
- "Privacy Rights Request Form | Security, Networking, Privacy — Network Pro™",
63
- },
64
- };
65
-
66
- // Fallback metadata for all routes
67
- const defaultMeta = {
68
- title: "Loading... | Network Pro™",
18
+ const fallbackMeta = {
19
+ title: "Security, Networking, Privacy — Network Pro™",
69
20
  description:
70
- "Please wait while the content loads... | Security, Networking, Privacy — Network Pro™",
21
+ "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
71
22
  };
72
23
 
73
24
  export const prerender = "auto";
@@ -76,19 +27,12 @@ export const trailingSlash = "never";
76
27
  /**
77
28
  * @param {{ url: URL }} param0
78
29
  * @returns {{ pathname: string, meta: MetaData }}
79
- * The load function returns the current pathname and the appropriate metadata
80
- * for the route, ensuring that default metadata is used if no specific route is defined.
81
30
  */
82
31
  export function load({ url }) {
83
- // Normalize the pathname to remove trailing slashes
84
32
  const normalizedPathname = url.pathname.replace(/\/+$/, "") || "/";
85
33
 
86
- // Determine metadata based on static routes, fallback to defaultMeta
87
- const currentMeta = meta[normalizedPathname] || defaultMeta;
88
-
89
- // Return the metadata and pathname to the layout
90
34
  return {
91
35
  pathname: normalizedPathname,
92
- meta: currentMeta,
36
+ meta: fallbackMeta, // Required to ensure meta always exists for typing
93
37
  };
94
38
  }
@@ -6,6 +6,8 @@ This file is part of Network Pro.
6
6
  ========================================================================== -->
7
7
 
8
8
  <script>
9
+ export let data;
10
+
9
11
  import ContainerSection from "$lib/components/ContainerSection.svelte";
10
12
  import Footer from "$lib/components/layout/Footer.svelte";
11
13
  import HeaderDefault from "$lib/components/layout/HeaderDefault.svelte";
@@ -13,8 +15,9 @@ This file is part of Network Pro.
13
15
  import { browser } from "$app/environment";
14
16
  // TODO: Testing in progress
15
17
  import { registerServiceWorker } from "$lib/registerServiceWorker.js";
18
+ import "$lib/styles";
16
19
 
17
- // Import logo images and favicons and format for preloading
20
+ // Import favicon images
18
21
  import logoPng from "$lib/img/logo-web.png";
19
22
  import logoWbp from "$lib/img/logo-web.webp";
20
23
  import faviconSvg from "$lib/img/favicon.svg";
@@ -23,8 +26,14 @@ This file is part of Network Pro.
23
26
  /**
24
27
  * @type {string}
25
28
  * Style class for the mobile-web-app-capable meta tag.
29
+ * OpenGraph URL for the website.
30
+ * Company name for the website.
31
+ * Twitter account for the website.
26
32
  */
27
33
  const webApp = "mobile-web-app-capable";
34
+ const ogUrl = "https://netwk.pro";
35
+ const companyName = "Network Pro Strategies";
36
+ const twitterAct = "@NetEng_Pro";
28
37
 
29
38
  if (browser) {
30
39
  // Preload logo images
@@ -34,10 +43,8 @@ This file is part of Network Pro.
34
43
  });
35
44
 
36
45
  // Preload favicon SVG
37
- fetch(faviconSvg).then((response) => response.text());
38
-
39
- // Preload Apple Touch icon
40
46
  const touchImg = new Image();
47
+ // Preload Apple Touch icon
41
48
  touchImg.src = appleTouchIcon;
42
49
 
43
50
  // TODO: Testing in progress
@@ -45,35 +52,27 @@ This file is part of Network Pro.
45
52
  registerServiceWorker();
46
53
  }
47
54
 
48
- // Import global and FontAwesome styles and web fonts
49
- import "$lib/styles";
50
-
51
- export let data;
55
+ // fallback values if data.meta not set
56
+ const metaTitle =
57
+ data?.meta?.title || "Security, Networking, Privacy — Network Pro™";
58
+ const metaDescription =
59
+ data?.meta?.description ||
60
+ "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™";
52
61
 
53
62
  // Pathname normalization takes place in +layout.js
54
63
  </script>
55
64
 
56
- <!-- Update the document's metadata dynamically -->
57
65
  <svelte:head>
58
- <title>{data?.meta?.title || "Network Pro Strategies (Network Pro™)"}</title>
59
- <meta
60
- name="description"
61
- content={data?.meta?.description ||
62
- "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™"} />
66
+ <!-- Static only, dynamic content moved to $lib/components/MetaTags.svelte -->
67
+ <link rel="preload" href={logoWbp} as="image" type="image/webp" />
68
+ <link rel="preload" href={logoPng} as="image" type="image/png" />
69
+ <link rel="preload" href={faviconSvg} as="image" type="image/svg+xml" />
70
+ <link rel="preload" href={appleTouchIcon} as="image" type="image/png" />
63
71
 
64
- <!-- Standard favicon and Apple Touch icon references -->
65
72
  <link rel="icon" href={faviconSvg} type="image/svg+xml" />
66
73
  <link rel="apple-touch-icon" href={appleTouchIcon} />
67
74
 
68
- <!-- Preload links for all four critical assets -->
69
- {#if browser}
70
- <link rel="preload" href={logoWbp} as="image" type="image/webp" />
71
- <link rel="preload" href={logoPng} as="image" type="image/png" />
72
- <link rel="preload" href={faviconSvg} as="image" type="image/svg+xml" />
73
- <link rel="preload" href={appleTouchIcon} as="image" type="image/png" />
74
- {/if}
75
-
76
- <!-- PWA-specific meta tags -->
75
+ <!-- PWA -->
77
76
  <link rel="manifest" href="/manifest.json" />
78
77
  <meta name={webApp} content="yes" />
79
78
  <meta name={"apple-" + webApp} content="yes" />
@@ -81,6 +80,10 @@ This file is part of Network Pro.
81
80
  name="apple-mobile-web-app-status-bar-style"
82
81
  content="black-translucent" />
83
82
  <meta name="theme-color" content="#ffc627" />
83
+
84
+ <meta
85
+ name="facebook-domain-verification"
86
+ content="bx4ham0zkpvzztzu213bhpt76m9siq" />
84
87
  </svelte:head>
85
88
 
86
89
  <!-- BEGIN HEADER -->
@@ -0,0 +1,27 @@
1
+ /* ==========================================================================
2
+ src/routes/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /**
13
+ * @typedef {object} MetaData
14
+ * @property {string} title - The title of the page
15
+ * @property {string} description - The description of the page
16
+ */
17
+
18
+ /**
19
+ * Load metadata for the root route.
20
+ *
21
+ * @returns {{ meta: MetaData }}
22
+ */
23
+ export function load() {
24
+ return {
25
+ meta: meta["/"] || defaultMeta,
26
+ };
27
+ }
@@ -12,6 +12,7 @@ This file is part of Network Pro.
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import Logo from "$lib/components/Logo.svelte";
14
14
  import SocialMedia from "$lib/components/SocialMedia.svelte";
15
+ import MetaTags from "$lib/components/MetaTags.svelte";
15
16
 
16
17
  /**
17
18
  * @type {string}
@@ -24,8 +25,12 @@ This file is part of Network Pro.
24
25
  * Style class for the div element.
25
26
  */
26
27
  const spaceStyle = "spacer";
28
+
29
+ export let data;
27
30
  </script>
28
31
 
32
+ <MetaTags title={data.meta.title} description={data.meta.description} />
33
+
29
34
  <link rel="canonical" href="https://netwk.pro" />
30
35
 
31
36
  <section id="home-page" data-testid="home-page">
@@ -0,0 +1,17 @@
1
+ /* ==========================================================================
2
+ src/routes/about/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /** @type {import('./$types').PageServerLoad} */
13
+ export function load() {
14
+ return {
15
+ meta: meta["/about"] || defaultMeta,
16
+ };
17
+ }
@@ -11,6 +11,7 @@ This file is part of Network Pro.
11
11
  import FullWidthSection from "$lib/components/FullWidthSection.svelte";
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import SocialMedia from "$lib/components/SocialMedia.svelte";
14
+ import MetaTags from "$lib/components/MetaTags.svelte";
14
15
 
15
16
  /**
16
17
  * @type {string}
@@ -23,8 +24,12 @@ This file is part of Network Pro.
23
24
  * Style class for the div element.
24
25
  */
25
26
  const spaceStyle = "spacer";
27
+
28
+ export let data;
26
29
  </script>
27
30
 
31
+ <MetaTags title={data.meta.title} description={data.meta.description} />
32
+
28
33
  <link rel="canonical" href="https://netwk.pro/about" />
29
34
 
30
35
  <section id="about">
@@ -0,0 +1,17 @@
1
+ /* ==========================================================================
2
+ src/routes/foss-spotlight/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /** @type {import('./$types').PageServerLoad} */
13
+ export function load() {
14
+ return {
15
+ meta: meta["/foss-spotlight"] || defaultMeta,
16
+ };
17
+ }
@@ -11,6 +11,7 @@ This file is part of Network Pro.
11
11
  import FossContent from "$lib/pages/FossContent.svelte";
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import SocialMedia from "$lib/components/SocialMedia.svelte";
14
+ import MetaTags from "$lib/components/MetaTags.svelte";
14
15
 
15
16
  /**
16
17
  * @type {string}
@@ -23,8 +24,12 @@ This file is part of Network Pro.
23
24
  * Style class for the div element.
24
25
  */
25
26
  const spaceStyle = "spacer";
27
+
28
+ export let data;
26
29
  </script>
27
30
 
31
+ <MetaTags title={data.meta.title} description={data.meta.description} />
32
+
28
33
  <link rel="canonical" href="https://netwk.pro/foss-spotlight" />
29
34
 
30
35
  <section id="license">
@@ -0,0 +1,17 @@
1
+ /* ==========================================================================
2
+ src/routes/license/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /** @type {import('./$types').PageServerLoad} */
13
+ export function load() {
14
+ return {
15
+ meta: meta["/license"] || defaultMeta,
16
+ };
17
+ }
@@ -11,6 +11,7 @@ This file is part of Network Pro.
11
11
  import LicenseContent from "$lib/pages/LicenseContent.svelte";
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import SocialMedia from "$lib/components/SocialMedia.svelte";
14
+ import MetaTags from "$lib/components/MetaTags.svelte";
14
15
 
15
16
  /**
16
17
  * @type {string}
@@ -23,8 +24,12 @@ This file is part of Network Pro.
23
24
  * Style class for the div element.
24
25
  */
25
26
  const spaceStyle = "spacer";
27
+
28
+ export let data;
26
29
  </script>
27
30
 
31
+ <MetaTags title={data.meta.title} description={data.meta.description} />
32
+
28
33
  <link rel="canonical" href="https://netwk.pro/license" />
29
34
 
30
35
  <section id="license">
@@ -1,5 +1,5 @@
1
1
  /* ==========================================================================
2
- src/lib/page.svelte.test.js
2
+ src/routes/page.svelte.test.js
3
3
 
4
4
  SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
5
5
  This file is part of Network Pro.
@@ -12,7 +12,18 @@ import Page from "./+page.svelte";
12
12
 
13
13
  describe("/+page.svelte", () => {
14
14
  test("should render the home page section", () => {
15
- render(Page);
15
+ const mockData = {
16
+ pathname: "/", // Required because layout uses it
17
+ meta: {
18
+ title:
19
+ "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
20
+ description:
21
+ "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro™",
22
+ },
23
+ };
24
+
25
+ render(Page, { props: { data: mockData } });
26
+
16
27
  expect(screen.getByTestId("home-page")).toBeInTheDocument();
17
28
  });
18
29
  });
@@ -0,0 +1,17 @@
1
+ /* ==========================================================================
2
+ src/routes/privacy-policy/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /** @type {import('./$types').PageServerLoad} */
13
+ export function load() {
14
+ return {
15
+ meta: meta["/privacy-policy"] || defaultMeta,
16
+ };
17
+ }
@@ -11,6 +11,7 @@ This file is part of Network Pro.
11
11
  import PrivacyContent from "$lib/pages/PrivacyContent.svelte";
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import SocialMedia from "$lib/components/SocialMedia.svelte";
14
+ import MetaTags from "$lib/components/MetaTags.svelte";
14
15
 
15
16
  /**
16
17
  * @type {string}
@@ -23,8 +24,12 @@ This file is part of Network Pro.
23
24
  * Style class for the div element.
24
25
  */
25
26
  const spaceStyle = "spacer";
27
+
28
+ export let data;
26
29
  </script>
27
30
 
31
+ <MetaTags title={data.meta.title} description={data.meta.description} />
32
+
28
33
  <link rel="canonical" href="https://netwk.pro/privacy-policy" />
29
34
 
30
35
  <section id="privacy-policy">
@@ -0,0 +1,17 @@
1
+ /* ==========================================================================
2
+ src/routes/terms-conditions/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /** @type {import('./$types').PageServerLoad} */
13
+ export function load() {
14
+ return {
15
+ meta: meta["/terms-conditions"] || defaultMeta,
16
+ };
17
+ }
@@ -11,6 +11,7 @@ This file is part of Network Pro.
11
11
  import TermsConditionsContent from "$lib/pages/TermsConditionsContent.svelte";
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import SocialMedia from "$lib/components/SocialMedia.svelte";
14
+ import MetaTags from "$lib/components/MetaTags.svelte";
14
15
 
15
16
  /**
16
17
  * @type {string}
@@ -23,8 +24,12 @@ This file is part of Network Pro.
23
24
  * Style class for the div element.
24
25
  */
25
26
  const spaceStyle = "spacer";
27
+
28
+ export let data;
26
29
  </script>
27
30
 
31
+ <MetaTags title={data.meta.title} description={data.meta.description} />
32
+
28
33
  <link rel="canonical" href="https://netwk.pro/terms-conditions" />
29
34
 
30
35
  <section id="terms-conditions">
@@ -0,0 +1,17 @@
1
+ /* ==========================================================================
2
+ src/routes/terms-of-use/+page.server.js
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
+ import { defaultMeta, meta } from "$lib/meta.js";
9
+
10
+ export const prerender = false;
11
+
12
+ /** @type {import('./$types').PageServerLoad} */
13
+ export function load() {
14
+ return {
15
+ meta: meta["/terms-of-use"] || defaultMeta,
16
+ };
17
+ }
@@ -11,6 +11,7 @@ This file is part of Network Pro.
11
11
  import TermsUseContent from "$lib/pages/TermsUseContent.svelte";
12
12
  import LegalNav from "$lib/components/LegalNav.svelte";
13
13
  import SocialMedia from "$lib/components/SocialMedia.svelte";
14
+ import MetaTags from "$lib/components/MetaTags.svelte";
14
15
 
15
16
  /**
16
17
  * @type {string}
@@ -23,8 +24,12 @@ This file is part of Network Pro.
23
24
  * Style class for the div element.
24
25
  */
25
26
  const spaceStyle = "spacer";
27
+
28
+ export let data;
26
29
  </script>
27
30
 
31
+ <MetaTags title={data.meta.title} description={data.meta.description} />
32
+
28
33
  <link rel="canonical" href="https://netwk.pro/terms-of-use" />
29
34
 
30
35
  <section id="terms-of-use">
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -7,7 +7,7 @@
7
7
 
8
8
  <loc>https://netwk.pro</loc>
9
9
 
10
- <lastmod>2025-05-16</lastmod>
10
+ <lastmod>2025-05-18</lastmod>
11
11
 
12
12
  <changefreq>weekly</changefreq>
13
13
 
@@ -19,7 +19,7 @@
19
19
 
20
20
  <loc>https://netwk.pro/foss-spotlight</loc>
21
21
 
22
- <lastmod>2025-05-15</lastmod>
22
+ <lastmod>2025-05-18</lastmod>
23
23
 
24
24
  <changefreq>weekly</changefreq>
25
25
 
@@ -31,7 +31,7 @@
31
31
 
32
32
  <loc>https://netwk.pro/contact</loc>
33
33
 
34
- <lastmod>2025-05-16</lastmod>
34
+ <lastmod>2025-05-18</lastmod>
35
35
 
36
36
  <changefreq>monthly</changefreq>
37
37
 
@@ -43,7 +43,7 @@
43
43
 
44
44
  <loc>https://netwk.pro/privacy-rights</loc>
45
45
 
46
- <lastmod>2025-05-16</lastmod>
46
+ <lastmod>2025-05-18</lastmod>
47
47
 
48
48
  <changefreq>monthly</changefreq>
49
49
 
@@ -55,7 +55,7 @@
55
55
 
56
56
  <loc>https://netwk.pro/privacy-policy</loc>
57
57
 
58
- <lastmod>2025-05-16</lastmod>
58
+ <lastmod>2025-05-18</lastmod>
59
59
 
60
60
  <changefreq>monthly</changefreq>
61
61
 
@@ -67,7 +67,7 @@
67
67
 
68
68
  <loc>https://netwk.pro/license</loc>
69
69
 
70
- <lastmod>2025-05-16</lastmod>
70
+ <lastmod>2025-05-18</lastmod>
71
71
 
72
72
  <changefreq>monthly</changefreq>
73
73
 
@@ -79,7 +79,7 @@
79
79
 
80
80
  <loc>https://netwk.pro/terms-of-use</loc>
81
81
 
82
- <lastmod>2025-05-15</lastmod>
82
+ <lastmod>2025-05-18</lastmod>
83
83
 
84
84
  <changefreq>monthly</changefreq>
85
85
 
@@ -91,7 +91,7 @@
91
91
 
92
92
  <loc>https://netwk.pro/terms-conditions</loc>
93
93
 
94
- <lastmod>2025-05-15</lastmod>
94
+ <lastmod>2025-05-18</lastmod>
95
95
 
96
96
  <changefreq>monthly</changefreq>
97
97
 
package/tests/app.spec.js CHANGED
@@ -15,8 +15,8 @@ test.describe("Desktop Tests", () => {
15
15
  await page.setViewportSize({ width: 1280, height: 720 });
16
16
  await page.goto("/");
17
17
 
18
- // Wait for the title to be updated (not `%sveltekit.title%`)
19
- await page.waitForFunction(() => document.title !== "%sveltekit.title%");
18
+ // Wait for the correct title to appear (CSP-safe)
19
+ await expect(page).toHaveTitle(/Locking Down Networks/);
20
20
 
21
21
  // Verify the page title contains the expected partial match
22
22
  const title = await page.title();
@@ -14,8 +14,8 @@ test.describe("Mobile Responsiveness", () => {
14
14
  await page.setViewportSize({ width: 375, height: 812 });
15
15
  await page.goto("/");
16
16
 
17
- // Wait for the title to be updated (not `%sveltekit.title%`)
18
- await page.waitForFunction(() => document.title !== "%sveltekit.title%");
17
+ // Wait for the correct title to appear (CSP-safe)
18
+ await expect(page).toHaveTitle(/Locking Down Networks/);
19
19
 
20
20
  // Verify the main heading is visible
21
21
  const mainHeading = page.locator("h2");
@@ -30,8 +30,8 @@ test.describe("Mobile Responsiveness", () => {
30
30
  await page.setViewportSize({ width: 375, height: 812 });
31
31
  await page.goto("/");
32
32
 
33
- // Wait for the title to be updated (not `%sveltekit.title%`)
34
- await page.waitForFunction(() => document.title !== "%sveltekit.title%");
33
+ // Wait for the correct title to appear (CSP-safe)
34
+ await expect(page).toHaveTitle(/Locking Down Networks/);
35
35
 
36
36
  // Check that there are no overlapping elements
37
37
  const body = await page.locator("body").boundingBox();
@@ -46,8 +46,8 @@ test.describe("Mobile Responsiveness", () => {
46
46
  await page.setViewportSize({ width: 375, height: 812 });
47
47
  await page.goto("/");
48
48
 
49
- // Wait for the title to be updated (not `%sveltekit.title%`)
50
- await page.waitForFunction(() => document.title !== "%sveltekit.title%");
49
+ // Wait for the correct title to appear (CSP-safe)
50
+ await expect(page).toHaveTitle(/Locking Down Networks/);
51
51
 
52
52
  // Check the "about" link is tappable and visible
53
53
  const aboutLink = page.locator("a", { hasText: "about" });