@networkpro/web 1.21.1 → 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.
Files changed (44) hide show
  1. package/CHANGELOG.md +102 -2
  2. package/README.md +3 -10
  3. package/package.json +8 -8
  4. package/src/app.html +1 -12
  5. package/src/lib/components/Logo.svelte +2 -7
  6. package/src/lib/components/layout/HeaderDefault.svelte +2 -3
  7. package/src/lib/data/fossData.js +8 -0
  8. package/src/lib/data/pgpKeys.js +82 -0
  9. package/src/lib/images.js +46 -17
  10. package/src/lib/index.js +8 -2
  11. package/src/lib/pages/AboutContent.svelte +107 -111
  12. package/src/lib/pages/FossContent.svelte +1 -1
  13. package/src/lib/pages/HomeContent.svelte +11 -8
  14. package/src/lib/pages/LicenseContent.svelte +1 -1
  15. package/src/lib/pages/PGPContent.svelte +19 -40
  16. package/src/lib/pages/PrivacyContent.svelte +6 -3
  17. package/src/lib/pages/PrivacyDashboard.svelte +5 -2
  18. package/src/lib/pages/ServicesContent.svelte +7 -4
  19. package/src/lib/pages/TermsConditionsContent.svelte +1 -1
  20. package/src/lib/pages/TermsUseContent.svelte +3 -3
  21. package/src/lib/styles/css/default.css +1 -1
  22. package/src/lib/styles/global.min.css +1 -1
  23. package/src/lib/types/appConstants.js +6 -3
  24. package/src/service-worker.js +3 -11
  25. package/static/icon-about.png +0 -0
  26. package/static/manifest.json +17 -4
  27. package/static/pgp/support@netwk.pro.asc +77 -0
  28. package/static/sitemap.xml +5 -5
  29. package/tests/e2e/app.spec.js +8 -3
  30. package/tests/e2e/mobile.spec.js +12 -3
  31. package/src/lib/img/qr/pgp-github.png +0 -0
  32. package/src/lib/img/qr/pgp-github.webp +0 -0
  33. package/static/pgp/pgp-contact.png +0 -0
  34. package/static/pgp/pgp-contact.webp +0 -0
  35. package/static/pgp/pgp-github.png +0 -0
  36. package/static/pgp/pgp-github.webp +0 -0
  37. package/static/pgp/pgp-security.png +0 -0
  38. package/static/pgp/pgp-security.webp +0 -0
  39. package/static/pgp/pgp-support.png +0 -0
  40. package/static/pgp/pgp-support.webp +0 -0
  41. package/static/pgp/support@neteng.pro.asc +0 -47
  42. package/static/pgp/vcard.png +0 -0
  43. package/static/pgp/vcard.webp +0 -0
  44. /package/{static → src/lib}/img/powered-by-proton.svg +0 -0
package/CHANGELOG.md CHANGED
@@ -22,6 +22,104 @@ 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
+
61
+ ## [1.22.0] - 2025-10-20
62
+
63
+ ### Added
64
+
65
+ - Introduced **dynamic QR code image imports** using `import.meta.glob` in `src/lib/images.js`.
66
+ - Implemented new `getQR()` helper function for streamlined QR lookups.
67
+ - Added `QR_IMAGES` registry for centralized QR asset management.
68
+ - Created dedicated PGP key data module (`src/lib/data/pgpKeys.js`) with dynamic QR bindings.
69
+ - Added new app constants (`EMAIL_LINK`, `SECURE_LINK`, `PRIVACY_LINK`) to:
70
+ - `src/lib/index.js`
71
+ - `src/lib/types/appConstants.js`
72
+ - Re-exported `src/lib/data/pgpKeys.js` from `src/lib/index.js`.
73
+ - Added favicon and manifest entry for `icon-about.png`.
74
+ - Introduced updated **contact assets block** in `AboutContent.svelte` with enhanced typing.
75
+ - Exported `src/lib/img/powered-by-proton.svg` from `src/lib/images.js`.
76
+ - Added missing JSDoc annotation to `src/lib/data/fossData.js`.
77
+ - Added updated PGP key for `support@netwk.pro` (previously `support@neteng.pro`).
78
+
79
+ ### Changed
80
+
81
+ - Bumped project version to `v1.22.0`.
82
+ - Updated generator metadata in `src/app.html` to reflect **SvelteKit 2.47.2**.
83
+ - Refactored **PGPContent.svelte** to use the `getQR()` helper and dynamic QR registry.
84
+ - Refactored **AboutContent.svelte** to use the centralized `PGP_KEYS` dataset and app constants.
85
+ - Split PGP key fingerprints into two lines for improved readability.
86
+ - Enhanced **images.js** with support for eager QR image imports.
87
+ - Replaced static PGP imports with automated dynamic resolution.
88
+ - Updated **manifest.json** to reference the new app icon.
89
+ - Revised layout and text consistency for PGP and contact sections in **AboutContent.svelte**.
90
+ - Updated type definitions in `src/lib/types/appConstants.js` for `CONTACT` constants.
91
+ - Cleaned up unused imports and improved inline JSDoc typings throughout the app.
92
+ - Updated asset references in `IGNORE_PATHS` and `REQUIRED_ASSETS` in `src/service-worker.js`.
93
+ - Added spacing adjustments to the tagline in **Logo.svelte**.
94
+ - Updated **HeaderDefault.svelte** to reference the global constant for the **Blog** link.
95
+ - Revised text and app constant usage in **HomeContent.svelte**.
96
+ - Updated the contact section and **Effective Date** in **ServicesContent.svelte**.
97
+ - Rebuilt `src/lib/styles/global.min.css` using **LightningCSS**.
98
+ - Refreshed `_Last Modified_` timestamps in `static/sitemap.xml`.
99
+
100
+ ### Fixed
101
+
102
+ - Fixed SSR error caused by missing `getQR` reference during page load.
103
+ - Corrected destructuring of `CONTACT` constants during SSR initialization.
104
+ - Fixed fingerprint rendering fallback when fingerprint type was non-array.
105
+ - Adjusted QR image alignment and eager/lazy decoding behavior.
106
+
107
+ ### Removed
108
+
109
+ - Deleted outdated static assets from `static/pgp`, replaced with dynamically loaded QR images.
110
+ - Removed redundant manual image imports from legacy sections of `images.js`.
111
+ - Removed unnecessary comment block from the `<head>` section of `src/app.html`.
112
+ - Removed `font-weight: bold` property from the `.fingerprint` CSS class in `src/lib/styles/css/default.css`.
113
+
114
+ ### 🧩 Technical Notes
115
+
116
+ - Updated `vite` from `v7.1.10` → `v7.1.11` to address **CVE-2025-62522**.
117
+ - Updated dependencies for SvelteKit `2.47.2` compatibility:
118
+ - `@sveltejs/kit`, `svelte`, `vite`, and `eslint`-related plugins.
119
+ - Cleaned up build cache and service worker registration logic in `src/service-worker.js`.
120
+
121
+ ---
122
+
25
123
  ## [1.21.1] - 2025-10-17
26
124
 
27
125
  ### Added
@@ -1169,7 +1267,9 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
1169
1267
 
1170
1268
  <!-- Link references -->
1171
1269
 
1172
- [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.21.1...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
1272
+ [1.22.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.22.0
1173
1273
  [1.21.1]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.21.1
1174
1274
  [1.21.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.21.0
1175
1275
  [1.20.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.20.0
@@ -1210,4 +1310,4 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
1210
1310
  [1.12.3]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.3
1211
1311
  [1.12.1]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.12.1
1212
1312
 
1213
- <!-- 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.21.1",
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",
@@ -78,9 +78,9 @@
78
78
  },
79
79
  "dependencies": {
80
80
  "dompurify": "^3.3.0",
81
- "posthog-js": "^1.276.0",
81
+ "posthog-js": "^1.278.0",
82
82
  "semver": "^7.7.3",
83
- "svelte": "5.40.2"
83
+ "svelte": "5.41.1"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@eslint/compat": "^1.4.0",
@@ -88,7 +88,7 @@
88
88
  "@lhci/cli": "^0.15.1",
89
89
  "@playwright/test": "^1.56.1",
90
90
  "@sveltejs/adapter-vercel": "^6.0.0",
91
- "@sveltejs/kit": "2.47.1",
91
+ "@sveltejs/kit": "2.47.2",
92
92
  "@sveltejs/vite-plugin-svelte": "^6.2.1",
93
93
  "@testing-library/jest-dom": "^6.9.1",
94
94
  "@testing-library/svelte": "^5.2.8",
@@ -97,8 +97,8 @@
97
97
  "browserslist": "^4.26.3",
98
98
  "eslint": "^9.38.0",
99
99
  "eslint-config-prettier": "^10.1.8",
100
- "eslint-plugin-jsdoc": "^61.1.4",
101
- "eslint-plugin-svelte": "^3.12.4",
100
+ "eslint-plugin-jsdoc": "^61.1.5",
101
+ "eslint-plugin-svelte": "^3.12.5",
102
102
  "globals": "^16.4.0",
103
103
  "jsdom": "26.1.0",
104
104
  "lightningcss": "^1.30.2",
@@ -113,10 +113,10 @@
113
113
  "stylelint-config-recommended": "^17.0.0",
114
114
  "stylelint-order": "^7.0.0",
115
115
  "svelte-check": "^4.3.3",
116
- "svelte-eslint-parser": "^1.3.3",
116
+ "svelte-eslint-parser": "^1.4.0",
117
117
  "svelte-preprocess": "^6.0.3",
118
118
  "typescript": "^5.9.3",
119
- "vite": "^7.1.10",
119
+ "vite": "^7.1.11",
120
120
  "vite-plugin-lightningcss": "^0.0.5",
121
121
  "vite-tsconfig-paths": "^5.1.4",
122
122
  "vitest": "^3.2.4"
package/src/app.html CHANGED
@@ -24,17 +24,6 @@
24
24
  sizes="any"
25
25
  type="image/x-icon" />
26
26
 
27
- <!-- Preconnect to PostHog domains
28
- <link
29
- rel="preconnect"
30
- href="https://us.i.posthog.com"
31
- crossorigin="anonymous" />
32
- <link
33
- rel="preconnect"
34
- href="https://us-assets.i.posthog.com"
35
- crossorigin="anonymous" />
36
- -->
37
-
38
27
  <!-- Preload FontAwesome webfonts -->
39
28
  <link
40
29
  rel="preload"
@@ -64,7 +53,7 @@
64
53
  content="bx4ham0zkpvzztzu213bhpt76m9siq" />
65
54
  <!-- cspell:enable -->
66
55
 
67
- <meta name="generator" content="SvelteKit 2.47.1" />
56
+ <meta name="generator" content="SvelteKit 2.47.2" />
68
57
 
69
58
  <script src="/disableSw.js"></script>
70
59
 
@@ -75,12 +75,6 @@ This file is part of Network Pro.
75
75
  * @type {"high" | "low" | "auto"}
76
76
  */
77
77
  export let fetchpriority = 'high';
78
-
79
- /**
80
- * Tagline text to display.
81
- * @type {string}
82
- */
83
- export let tagline = 'Security | Networking | Privacy';
84
78
  </script>
85
79
 
86
80
  <!-- BEGIN LOGO AND SITE TITLE -->
@@ -107,6 +101,7 @@ This file is part of Network Pro.
107
101
  <div class="spacer"></div>
108
102
 
109
103
  {#if showTagline}
110
- <h2 class="index-title2">{tagline}</h2>
104
+ <h2 class="index-title2"
105
+ >{['Security', 'Networking', 'Privacy'].join(' \u00A0 | \u00A0 ')}</h2>
111
106
  {/if}
112
107
  <!-- END LOGO AND SITE TITLE -->
@@ -15,14 +15,13 @@ This file is part of Network Pro.
15
15
 
16
16
  //console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
17
17
 
18
- const { PAGE } = CONSTANTS;
18
+ const { PAGE, LINKS } = CONSTANTS;
19
19
 
20
20
  const homeLink = base || '/';
21
21
  const aboutLink = `${base}/about`;
22
22
  const servLink = `${base}/services`;
23
23
  const lhubLink = `${base}/links`;
24
24
  const fossLink = `${base}/foss-spotlight`;
25
- const blogLink = 'https://blog.netwk.pro';
26
25
  const discussLink =
27
26
  'https://github.com/netwk-pro/netwk-pro.github.io/discussions';
28
27
 
@@ -46,7 +45,7 @@ This file is part of Network Pro.
46
45
  { label: 'services', href: servLink, target: PAGE.SELF, external: false },
47
46
  {
48
47
  label: 'blog',
49
- href: blogLink,
48
+ href: LINKS.BLOG,
50
49
  target: PAGE.SELF,
51
50
  external: false,
52
51
  },
@@ -6,6 +6,14 @@ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
6
  This file is part of Network Pro.
7
7
  ========================================================================== */
8
8
 
9
+ /**
10
+ * @file fossData.js
11
+ * @description Data for FOSS Spotlight route
12
+ * @module src/lib/data
13
+ * @author Scott Lopez
14
+ * @updated 2025-10-20
15
+ */
16
+
9
17
  // Import FOSS images
10
18
  import { acodePng, acodeWbp, cryptomPng, cryptomWbp, eauthPng, eauthWbp, hboardPng, hboardWbp, lsheetPng, lsheetWbp, otphelpPng, otphelpWbp, pmxPng, pmxWbp, squirclePng, squircleWbp, tosPng, tosWbp, urlPng, urlWbp } from "$lib";
11
19
 
@@ -0,0 +1,82 @@
1
+ /* ==========================================================================
2
+ src/lib/data/pgpKeys.js
3
+
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
5
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
+ This file is part of Network Pro.
7
+ ========================================================================== */
8
+
9
+ /**
10
+ * @file pgpKeys.js
11
+ * @description Dedicated data module for PGP key definitions
12
+ * @module src/lib/data
13
+ * @author Scott Lopez
14
+ * @updated 2025-10-20
15
+ */
16
+
17
+ import { getQR } from '$lib';
18
+
19
+ /**
20
+ * @typedef {{ png?: string; webp?: string }} QrImagePair
21
+ *
22
+ * @typedef {QrImagePair & {
23
+ * id: string;
24
+ * name: string;
25
+ * email: string;
26
+ * fingerprint: string;
27
+ * opgp: string;
28
+ * file: string;
29
+ * }} PgpKeyEntry
30
+ */
31
+
32
+ /**
33
+ * Base definitions for PGP keys. Each `id` must match a QR code image name
34
+ * (e.g. "pgp-support" → pgp-support.png / pgp-support.webp).
35
+ *
36
+ * @type {Array<{
37
+ * id: string;
38
+ * name: string;
39
+ * email: string;
40
+ * fingerprint: string;
41
+ * opgp: string;
42
+ * file: string;
43
+ * }>}
44
+ */
45
+ const BASE_PGP_KEYS = [
46
+ {
47
+ id: 'pgp-support',
48
+ name: 'General Contact & Support',
49
+ email: 'support (at) netwk.pro',
50
+ fingerprint: '6590 B992 E2E3 EFF1 2738 7BCE 2AF0 93E9 DEC6 1BA0',
51
+ opgp: 'https://keys.openpgp.org/search?q=support%40netwk.pro',
52
+ file: '/pgp/support@netwk.pro.asc',
53
+ },
54
+ {
55
+ id: 'pgp-contact',
56
+ name: 'Secure Email',
57
+ email: 'contact (at) s.neteng.pro',
58
+ fingerprint: 'DF11 8BAA 6C2D 9DCD EBDC 2DDC F993 7349 9495 F957',
59
+ opgp: 'https://keys.openpgp.org/search?q=contact%40s.neteng.pro',
60
+ file: '/pgp/contact@s.neteng.pro.asc',
61
+ },
62
+ {
63
+ id: 'pgp-security',
64
+ name: 'Security Contact',
65
+ email: 'security (at) s.neteng.pro',
66
+ fingerprint: 'B7FE 1D4E 6CAB 3E71 4A9F DF6E 48CB 7290 C00D 0DA5',
67
+ opgp: 'https://keys.openpgp.org/search?q=security%40s.neteng.pro',
68
+ file: '/pgp/security@s.neteng.pro.asc',
69
+ },
70
+ ];
71
+
72
+ /**
73
+ * Full list of enriched PGP keys, each with dynamically resolved QR images.
74
+ *
75
+ * @type {PgpKeyEntry[]}
76
+ */
77
+ export const PGP_KEYS = BASE_PGP_KEYS.map((entry) => ({
78
+ ...entry,
79
+ ...getQR(entry.id),
80
+ }));
81
+
82
+ // cspell:ignore EBDC
package/src/lib/images.js CHANGED
@@ -13,7 +13,7 @@ This file is part of Network Pro.
13
13
  * @description Provides convenient access to images in the src/lib/img directory
14
14
  * @module src/lib
15
15
  * @author Scott Lopez
16
- * @updated 2025-06-16
16
+ * @updated 2025-10-20
17
17
  */
18
18
 
19
19
  // Import favicon images
@@ -33,6 +33,7 @@ import bySvg from '$lib/img/by.svg';
33
33
  import ccSvg from '$lib/img/cc.svg';
34
34
  import obtainiumPng from '$lib/img/obtainium.png';
35
35
  import obtainiumWbp from '$lib/img/obtainium.webp';
36
+ import protonPower from '$lib/img/powered-by-proton.svg';
36
37
 
37
38
  // Import images for posts
38
39
  import acodePng from '$lib/img/posts/acode.png';
@@ -56,15 +57,47 @@ import tosWbp from '$lib/img/posts/tosdr.webp';
56
57
  import urlPng from '$lib/img/posts/urlcheck.png';
57
58
  import urlWbp from '$lib/img/posts/urlcheck.webp';
58
59
 
59
- // Import QR code images
60
- import pgpContactPng from '$lib/img/qr/pgp-contact.png';
61
- import pgpContactWbp from '$lib/img/qr/pgp-contact.webp';
62
- import pgpSecurityPng from '$lib/img/qr/pgp-security.png';
63
- import pgpSecurityWbp from '$lib/img/qr/pgp-security.webp';
64
- import pgpSupportPng from '$lib/img/qr/pgp-support.png';
65
- import pgpSupportWbp from '$lib/img/qr/pgp-support.webp';
66
- import vcfPng from '$lib/img/qr/vcard.png';
67
- import vcfWbp from '$lib/img/qr/vcard.webp';
60
+ // ================================================================
61
+ // Dynamic QR code image imports
62
+ // ================================================================
63
+
64
+ // Dynamically import all QR code images in src/lib/img/qr
65
+ const qrModules = import.meta.glob('$lib/img/qr/*.{png,webp}', { eager: true });
66
+
67
+ /**
68
+ * Aggregated QR code image lookup.
69
+ * Example: QR_IMAGES['pgp-support'].png → blob URL
70
+ * @typedef {'png' | 'webp'} QRExtension
71
+ * @type {Record<string, { png?: string; webp?: string }>}
72
+ */
73
+ export const QR_IMAGES = {};
74
+
75
+ // Populate QR_IMAGES
76
+ for (const [path, mod] of Object.entries(qrModules)) {
77
+ // Ensure we’re dealing with an ES module with a default export
78
+ const module = /** @type {{ default: string }} */ (mod);
79
+
80
+ const file = path.split('/').pop();
81
+ if (!file) continue; // file is possibly undefined
82
+
83
+ const [name, ext] = file.split('.');
84
+ if (!QR_IMAGES[name]) QR_IMAGES[name] = {};
85
+
86
+ if (ext === 'png' || ext === 'webp') {
87
+ QR_IMAGES[name][ext] = module.default;
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Retrieve QR code image pair (png/webp) by name.
93
+ * Safely returns an empty object if not found.
94
+ *
95
+ * @param {string} name - Base filename (e.g., "pgp-support" or "vcard")
96
+ * @returns {{ png?: string; webp?: string }}
97
+ */
98
+ export function getQR(name) {
99
+ return QR_IMAGES[name] ?? {};
100
+ }
68
101
 
69
102
  // Re-export all imports
70
103
  export {
@@ -87,19 +120,15 @@ export {
87
120
  lsheetPng,
88
121
  lsheetWbp, obtainiumPng,
89
122
  obtainiumWbp, otphelpPng,
90
- otphelpWbp, pgpContactPng,
91
- pgpContactWbp, pgpSecurityPng,
92
- pgpSecurityWbp, pgpSupportPng,
93
- pgpSupportWbp, pmxPng,
123
+ otphelpWbp, pmxPng,
94
124
  pmxWbp,
125
+ protonPower,
95
126
  squirclePng,
96
127
  squircleWbp,
97
128
  tosPng,
98
129
  tosWbp,
99
130
  urlPng,
100
- urlWbp,
101
- vcfPng,
102
- vcfWbp
131
+ urlWbp
103
132
  };
104
133
 
105
134
  // cspell:ignore eauth hboard cryptom tosdr otphelp
package/src/lib/index.js CHANGED
@@ -16,7 +16,7 @@ This file is part of Network Pro.
16
16
  * and re-exported here for flat `$lib` imports.
17
17
  * @module src/lib
18
18
  * @author Scott Lopez
19
- * @updated 2025-10-10
19
+ * @updated 2025-10-20
20
20
  */
21
21
 
22
22
  // Re-export all images so they can be imported directly from `$lib`
@@ -30,6 +30,9 @@ export * from './components/index.js';
30
30
  // Re-export all pages so they can be imported directly from `$lib`
31
31
  export * from './pages/index.js';
32
32
 
33
+ // Re-export `pgpKeys` data so it can be imported directly from `$lib`
34
+ export { PGP_KEYS } from '$lib/data/pgpKeys.js';
35
+
33
36
  // Export utility functions
34
37
  // Uncomment and adjust these as needed for your project
35
38
  // export * from './utils/formatting.js';
@@ -53,9 +56,12 @@ export const CONSTANTS = {
53
56
  YEAR: '2025',
54
57
  },
55
58
  CONTACT: {
56
- EMAIL: 'support (at) neteng.pro',
59
+ EMAIL: 'support (at) netwk.pro',
60
+ EMAIL_LINK: 'support@netwk.pro',
57
61
  SECURE: 'contact (at) s.neteng.pro',
62
+ SECURE_LINK: 'contact@s.neteng.pro',
58
63
  PRIVACY: 'privacy (at) netwk.pro',
64
+ PRIVACY_LINK: 'privacy@netwk.pro',
59
65
  PHONE: '(623) 252-4350',
60
66
  },
61
67
  PAGE: {