@networkpro/web 1.22.0 → 1.22.1

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/CHANGELOG.md CHANGED
@@ -22,6 +22,42 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
22
22
 
23
23
  ---
24
24
 
25
+ ## [1.22.1] - 2025-10-21
26
+
27
+ ### Documentation
28
+
29
+ - Updated directory structure and **static/pgp** section of `README.md`.
30
+
31
+ ### Changed
32
+
33
+ - Bumped project version to `v1.22.1`.
34
+ - Updated the text and layout of `AboutContent.svelte`.
35
+ - Added a link to the privacy email address in `PrivacyContent.svelte` and `PrivacyDashboard.svelte` for easier access.
36
+ - Updated the text of `ServicesContent.svelte`.
37
+ - Increased default Playwright test timeouts for navigation-sensitive suites (Desktop and Mobile) to improve stability under CI latency conditions.
38
+ - Implemented `Promise.all()` pattern for combined click and navigation waits, reducing flakiness in route transition tests.
39
+ - Updated the `'about' link'\*\* navigation tests in both Desktop and Mobile scenarios to include:
40
+ - Explicit `page.waitForLoadState('domcontentloaded')` calls before assertions.
41
+ - Extended per-suite timeouts (`90s`) using `test.setTimeout(90000)` for reliability on slower environments.
42
+ - Added fallback `waitForURL('\*\*/about', { timeout: 60000 })` to ensure deterministic routing checks.
43
+ - Adjusted test structure for consistency across device profiles and browsers.
44
+ - Verified local runs remain performant while increasing tolerance for **CI network latency**.
45
+
46
+ ### Fixed
47
+
48
+ - Corrected `TermsUseContent.svelte` to reflect hosting by Vercel, not Netlify.
49
+ - Corrected license identifier syntax on the following pages:
50
+ - `AboutContent.svelte`
51
+ - `FossContent.svelte`
52
+ - `LicenseContent.svelte`
53
+ - `PrivacyContent.svelte`
54
+ - `PrivacyDashboard.svelte`
55
+ - `ServicesContent.svelte`
56
+ - `TermsConditionsContent.svelte`
57
+ - `TermsUseContent.svelte`
58
+
59
+ ---
60
+
25
61
  ## [1.22.0] - 2025-10-20
26
62
 
27
63
  ### Added
@@ -1231,7 +1267,8 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
1231
1267
 
1232
1268
  <!-- Link references -->
1233
1269
 
1234
- [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.22.0...HEAD
1270
+ [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.22.1...HEAD
1271
+ [1.22.1]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.22.1
1235
1272
  [1.22.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.22.0
1236
1273
  [1.21.1]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.21.1
1237
1274
  [1.21.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.21.0
@@ -1273,4 +1310,4 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
1273
1310
  [1.12.3]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.3
1274
1311
  [1.12.1]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.1
1275
1312
 
1276
- <!-- cspell:ignore qrcode cryptom otphelp -->
1313
+ <!-- cspell:ignore qrcode cryptom otphelp domcontentloaded -->
package/README.md CHANGED
@@ -83,7 +83,7 @@ This project follows the principles of [Keep a Changelog](https://keepachangelog
83
83
  │ ├── hooks.server.js # Injects CSP headers and permissions policy
84
84
  │ └── service-worker.js # Custom PWA service worker
85
85
  ├── static/ # Public assets served at site root
86
- │ ├── pgp/ # PGP keys and QR code images
86
+ │ ├── pgp/ # PGP keys
87
87
  │ ├── disableSw.js # Service worker bypass (via ?nosw param)
88
88
  │ ├── manifest.json # PWA metadata
89
89
  │ ├── robots.txt # SEO: allow/disallow crawlers
@@ -106,26 +106,19 @@ This project follows the principles of [Keep a Changelog](https://keepachangelog
106
106
 
107
107
  ### 🔐 `static/pgp/` Directory Structure
108
108
 
109
- This directory contains public PGP key files and their corresponding QR codes.
109
+ This directory contains public PGP key files. Their corresponding QR code images are now loaded dynamically from `src/lib/img/qr`. A dynamic QR code import utility in `src/lib/images.js` allows these files to be imported directly from `$lib`.
110
110
 
111
111
  ```bash
112
112
  static/
113
113
  ├── pgp/
114
114
  │ ├── contact@s.neteng.pro.asc # Public key for secure email
115
- │ ├── pgp-contact.png # QR code (PNG) for secure email key
116
- │ ├── pgp-contact.webp # Optimized WebP version of the QR code
117
- │ ├── pgp-security.png # QR code (PNG) for security contact key
118
- │ ├── pgp-security.webp # WebP version of the security QR code
119
- │ ├── pgp-support.png # QR code (PNG) for support key
120
- │ ├── pgp-support.webp # WebP version of the support QR code
121
115
  │ ├── security@s.neteng.pro.asc # Public key for security contact
122
116
  │ ├── support@neteng.pro.asc # Public key for general support
123
117
  └── ...
124
118
  ```
125
119
 
126
120
  - `.asc` files are **excluded from service worker precaching** but served directly via the `/pgp/[key]` route.
127
- - QR code images are **served statically** by the `/pgp` route using `<picture>` elements.
128
- - **WebP versions** are also used in the `/pgp` route, while the `/about` route imports **dynamic equivalents** from `src/lib/img/qr`.
121
+ - QR code images—including WebP and PNG versions—are **served dynamically** from `src/lib/img/qr` using `<picture>` elements.
129
122
  - This route does **not use fallback rendering**; only explicitly defined files are available and expected to resolve.
130
123
  - A dynamic `[key]/+server.js` handler under `src/routes/pgp/` serves the `.asc` files with appropriate `Content-Type` and download headers.
131
124
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@networkpro/web",
3
3
  "private": false,
4
- "version": "1.22.0",
4
+ "version": "1.22.1",
5
5
  "description": "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro Strategies",
6
6
  "keywords": [
7
7
  "advisory",
@@ -73,7 +73,7 @@ This file is part of Network Pro.
73
73
  */
74
74
  const navLinks = [
75
75
  {
76
- label: 'SPDX License Identifier',
76
+ label: 'SPDX-License-Identifier',
77
77
  href: 'https://spdx.dev/learn/handling-license-info',
78
78
  target: PAGE.BLANK,
79
79
  text: 'CC-BY-4.0 OR GPL-3.0-or-later',
@@ -120,7 +120,7 @@ This file is part of Network Pro.
120
120
  <p>
121
121
  <strong>{COMPANY_INFO.NAME} ({COMPANY_INFO.APP_NAME}&trade;)</strong>
122
122
  <br />
123
- <em>Networking, Security, Privacy</em>
123
+ <em>Security, Networking, Privacy</em>
124
124
  </p>
125
125
  </section>
126
126
 
@@ -144,11 +144,10 @@ This file is part of Network Pro.
144
144
 
145
145
  <p>
146
146
  At <strong>{COMPANY_INFO.NAME} ({COMPANY_INFO.APP_NAME}&trade;)</strong>, we
147
- deliver network security and engineering, information security (IS),
148
- information technology (IT), cyber security, and digital privacy consulting
149
- with clarity, credibility, and care. We believe that real security doesn't
150
- have to come at the cost of user autonomy, and that privacy-minded solutions
151
- can be both practical and powerful.
147
+ deliver network security and engineering, cybersecurity, and digital privacy
148
+ consulting with clarity, credibility, and care. We believe that real security
149
+ doesn't have to come at the cost of user autonomy, and that privacy-minded
150
+ solutions can be both practical and powerful.
152
151
  </p>
153
152
 
154
153
  <p>
@@ -189,7 +188,7 @@ This file is part of Network Pro.
189
188
  <p>
190
189
  Additionally, {COMPANY_INFO.APP_NAME}&trade; provides
191
190
  <a href={servLink} target={PAGE.SELF}>on-site services</a>
192
- in the Greater Phoenix Metro Area (Maricopa County, AZ). Our
191
+ in the Greater Phoenix Metropolitan Area (Maricopa County, AZ). Our
193
192
  <a href={servLink} target={PAGE.SELF}>on-site services</a> are available to both
194
193
  consumers and businesses. In addition to consulting, we offer the following services:
195
194
  </p>
@@ -204,14 +203,14 @@ This file is part of Network Pro.
204
203
  <li><strong>Add or Configure a Printer</strong></li>
205
204
  </ul>
206
205
 
206
+ <div class="spacer"></div>
207
+
207
208
  <p>
208
209
  We also believe education is a core pillar of real-world security. That's why
209
210
  we invest in raising awareness—across both technical and general audiences—on
210
211
  best practices in digital privacy, secure design, and threat mitigation.
211
212
  </p>
212
213
 
213
- <div class="spacer"></div>
214
-
215
214
  <p>
216
215
  At {COMPANY_INFO.APP_NAME}&trade;, we deliver robust, intentional solutions
217
216
  for individuals and organizations that prioritize integrity — without
@@ -223,8 +222,8 @@ This file is part of Network Pro.
223
222
  Ready to take the next step? <a href={contactLink} target={PAGE.BLANK}
224
223
  >Let's connect</a>
225
224
  to explore how we can help fortify your home or business.
226
- <a href={consultLink} target={PAGE.BLANK}>Schedule a consultation</a> today and
227
- discover what's possible.
225
+ <a href={consultLink} target={PAGE.BLANK}
226
+ >Schedule a free, initial consultation</a> today and discover what's possible.
228
227
  </p>
229
228
 
230
229
  <p>
@@ -61,7 +61,7 @@ This file is part of Network Pro.
61
61
  rel={PAGE.REL}
62
62
  href="https://spdx.dev/learn/handling-license-info"
63
63
  target={PAGE.BLANK}>
64
- SPDX License Identifier
64
+ SPDX-License-Identifier
65
65
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
66
66
  </span>
67
67
  </section>
@@ -77,7 +77,7 @@ This file is part of Network Pro.
77
77
  rel={PAGE.REL}
78
78
  href="https://spdx.dev/learn/handling-license-info"
79
79
  target={PAGE.BLANK}>
80
- SPDX License Identifier
80
+ SPDX-License-Identifier
81
81
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
82
82
  </span>
83
83
  </section>
@@ -55,7 +55,7 @@ This file is part of Network Pro.
55
55
  ];
56
56
 
57
57
  /** @type {string} */
58
- const effectiveDate = 'October 10, 2025';
58
+ const effectiveDate = 'October 21, 2025';
59
59
 
60
60
  /** @type {string} */
61
61
  const classSmall = 'small-text';
@@ -112,7 +112,7 @@ This file is part of Network Pro.
112
112
  rel={PAGE.REL}
113
113
  href="https://spdx.dev/learn/handling-license-info"
114
114
  target={PAGE.BLANK}>
115
- SPDX License Identifier
115
+ SPDX-License-Identifier
116
116
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
117
117
  </span>
118
118
  </section>
@@ -432,7 +432,10 @@ This file is part of Network Pro.
432
432
  href={prightsLink}
433
433
  target={PAGE.BLANK}>Privacy Rights Request Form</a
434
434
  >. Alternatively, you can email us at
435
- <strong>{CONTACT.PRIVACY}</strong>
435
+ <strong
436
+ ><a href={`mailto:${CONTACT.PRIVACY_LINK}`} target={PAGE.BLANK}
437
+ >{CONTACT.PRIVACY_LINK}</a
438
+ ></strong>
436
439
  with the subject line: "<strong>Privacy Rights Preferences</strong>".
437
440
  </p>
438
441
  {:else if link.id === 'third-party'}
@@ -87,7 +87,7 @@ This file is part of Network Pro.
87
87
  rel={PAGE.REL}
88
88
  href="https://spdx.dev/learn/handling-license-info"
89
89
  target={PAGE.BLANK}>
90
- SPDX License Identifier
90
+ SPDX-License-Identifier
91
91
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
92
92
  </span>
93
93
  </section>
@@ -240,7 +240,10 @@ This file is part of Network Pro.
240
240
  href={prightsLink}
241
241
  target={PAGE.BLANK}>Privacy Rights Request Form</a
242
242
  >. Alternatively, you can email us at
243
- <strong>{CONTACT.PRIVACY}</strong>
243
+ <strong
244
+ ><a href={`mailto:${CONTACT.PRIVACY_LINK}`} target={PAGE.BLANK}
245
+ >{CONTACT.PRIVACY_LINK}</a
246
+ ></strong>
244
247
  with the subject line: "<strong>Privacy Rights Preferences</strong>".
245
248
  </p>
246
249
  </section>
@@ -44,7 +44,7 @@ This file is part of Network Pro.
44
44
  * @type {{ effectiveDate: string, classSmall: string }}
45
45
  */
46
46
  const constants = {
47
- effectiveDate: 'October 20, 2025',
47
+ effectiveDate: 'October 21, 2025',
48
48
  classSmall: 'small-text',
49
49
  };
50
50
  </script>
@@ -56,7 +56,7 @@ This file is part of Network Pro.
56
56
  rel={PAGE.REL}
57
57
  href="https://spdx.dev/learn/handling-license-info"
58
58
  target={PAGE.BLANK}>
59
- SPDX License Identifier
59
+ SPDX-License-Identifier
60
60
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
61
61
  </span>
62
62
  </section>
@@ -83,7 +83,7 @@ This file is part of Network Pro.
83
83
  If you're a business seeking similar on-site solutions, we've got you covered!
84
84
  We offer tailored services to meet the unique needs of commercial clients as
85
85
  well. Simply <a href={consultLink} target={PAGE.BLANK}
86
- >schedule a consultation</a>
86
+ >schedule a free, initial consultation</a>
87
87
  or <a href={contactLink} target={PAGE.BLANK}>contact us directly</a> — we'd be
88
88
  happy to discuss how {COMPANY_INFO.APP_NAME}&trade; can support your business
89
89
  on-site.
@@ -67,7 +67,7 @@ This file is part of Network Pro.
67
67
  rel={PAGE.REL}
68
68
  href="https://spdx.dev/learn/handling-license-info"
69
69
  target={PAGE.BLANK}>
70
- SPDX License Identifier
70
+ SPDX-License-Identifier
71
71
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
72
72
  </span>
73
73
  </section>
@@ -65,7 +65,7 @@ This file is part of Network Pro.
65
65
  * @type {{ effectiveDate: string, classSmall: string }}
66
66
  */
67
67
  const constants = {
68
- effectiveDate: 'May 21, 2025',
68
+ effectiveDate: 'October 21, 2025',
69
69
  classSmall: 'small-text',
70
70
  };
71
71
  </script>
@@ -77,7 +77,7 @@ This file is part of Network Pro.
77
77
  rel={PAGE.REL}
78
78
  href="https://spdx.dev/learn/handling-license-info"
79
79
  target={PAGE.BLANK}>
80
- SPDX License Identifier
80
+ SPDX-License-Identifier
81
81
  </a>: &nbsp;<code>CC-BY-4.0 OR GPL-3.0-or-later</code>
82
82
  </span>
83
83
  </section>
@@ -142,7 +142,7 @@ This file is part of Network Pro.
142
142
  These Terms of Use apply to all platforms associated with the Company,
143
143
  including but not limited to:
144
144
  <strong>
145
- GitHub, our main website (hosted via Netlify and GitHub Pages), Stack
145
+ GitHub, our main website (hosted via Vercel and GitHub Pages), Stack
146
146
  Overflow Teams, Nextcloud, communications on Discord and/or Slack, and
147
147
  our social media presence (e.g., Facebook, Instagram, X, and similar
148
148
  platforms).
@@ -11,7 +11,7 @@ This file is part of Network Pro.
11
11
  * @description Runs Playwright E2E tests with desktop and root route assertions.
12
12
  * @module tests/e2e
13
13
  * @author Scott Lopez
14
- * @updated 2025-09-17
14
+ * @updated 2025-10-21
15
15
  */
16
16
 
17
17
  import { expect, test } from '@playwright/test';
@@ -24,6 +24,8 @@ import {
24
24
 
25
25
  // Root route should display nav bar and about link
26
26
  test.describe('Desktop Tests', () => {
27
+ test.setTimeout(90_000); // increase timeout for all desktop tests
28
+
27
29
  test("should display the navigation bar and 'about' link", async ({
28
30
  page,
29
31
  }) => {
@@ -67,12 +69,15 @@ test.describe('Desktop Tests', () => {
67
69
  await page.waitForLoadState('domcontentloaded', { timeout: 60000 });
68
70
 
69
71
  const nav = await getVisibleNav(page);
70
-
71
72
  const aboutLink = nav.getByRole('link', { name: 'about' });
72
73
  await expect(aboutLink).toBeVisible();
73
74
  await aboutLink.click();
74
75
 
75
- await page.waitForURL('/about', { timeout: 60000 });
76
+ // safer wait pattern with load state
77
+ await Promise.all([
78
+ page.waitForLoadState('load'),
79
+ page.waitForURL('**/about', { timeout: 60000 }),
80
+ ]);
76
81
  await expect(page).toHaveURL(/\/about/);
77
82
  });
78
83
  }); // End Desktop Tests
@@ -11,7 +11,7 @@ This file is part of Network Pro.
11
11
  * @description Runs Playwright E2E tests with mobile assertions.
12
12
  * @module tests/e2e
13
13
  * @author Scott Lopez
14
- * @updated 2025-09-17
14
+ * @updated 2025-10-21
15
15
  */
16
16
 
17
17
  import { expect, test } from '@playwright/test';
@@ -19,6 +19,8 @@ import { getFooter, getVisibleNav, setMobileView } from './shared/helpers.js';
19
19
 
20
20
  // Mobile viewport smoke tests for the root route
21
21
  test.describe('Mobile Tests', () => {
22
+ test.setTimeout(90_000); // increase timeout for all desktop tests
23
+
22
24
  test('should display the main description text on mobile', async ({
23
25
  page,
24
26
  browserName,
@@ -57,13 +59,20 @@ test.describe('Mobile Tests', () => {
57
59
 
58
60
  await setMobileView(page);
59
61
  await page.goto('/');
62
+ await page.waitForLoadState('domcontentloaded', { timeout: 60000 });
60
63
 
61
64
  const nav = await getVisibleNav(page);
62
65
  const aboutLink = nav.getByRole('link', { name: 'about' });
63
66
  await expect(aboutLink).toBeVisible();
64
67
 
65
- await aboutLink.click();
66
- await expect(page).toHaveURL(/\/about/, { timeout: 60000 });
68
+ // combine click + wait in a Promise.all to ensure navigation completes
69
+ await Promise.all([
70
+ page.waitForLoadState('load'),
71
+ page.waitForURL('**/about', { timeout: 60000 }),
72
+ aboutLink.click(),
73
+ ]);
74
+
75
+ await expect(page).toHaveURL(/\/about/);
67
76
  });
68
77
 
69
78
  test('should display the footer on /about (mobile)', async ({