@networkpro/web 1.22.2 → 1.24.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 (49) hide show
  1. package/.github/workflows/build-and-publish.yml +3 -3
  2. package/.github/workflows/lighthouse.yml +1 -1
  3. package/.github/workflows/meta-check.yml +1 -1
  4. package/.github/workflows/publish-test.yml +3 -3
  5. package/.github/workflows/secret-scan.yml +105 -0
  6. package/.github/workflows/templates/publish.template.yml +3 -3
  7. package/.node-version +1 -1
  8. package/.nvmrc +1 -1
  9. package/CHANGELOG.md +96 -1
  10. package/LICENSE.md +1 -1
  11. package/README.md +5 -5
  12. package/budget.json +1 -1
  13. package/package.json +11 -10
  14. package/src/app.html +4 -4
  15. package/src/lib/README.md +12 -9
  16. package/src/lib/components/Badges.svelte +2 -2
  17. package/src/lib/components/LegalNav.svelte +1 -1
  18. package/src/lib/components/MetaTags.svelte +42 -16
  19. package/src/lib/components/layout/Footer.svelte +7 -7
  20. package/src/lib/components/layout/HeaderDefault.svelte +1 -1
  21. package/src/lib/components/layout/HeaderHome.svelte +1 -1
  22. package/src/lib/index.js +2 -2
  23. package/src/lib/meta.js +24 -24
  24. package/src/lib/pages/AboutContent.svelte +9 -9
  25. package/src/lib/pages/HomeContent.svelte +1 -1
  26. package/src/lib/pages/LicenseContent.svelte +6 -7
  27. package/src/lib/pages/ServicesContent.svelte +1 -2
  28. package/src/lib/pages/TermsUseContent.svelte +1 -1
  29. package/src/lib/types/README.md +2 -2
  30. package/src/routes/+layout.js +2 -3
  31. package/src/routes/+layout.svelte +11 -3
  32. package/src/routes/+page.svelte +7 -26
  33. package/src/routes/about/+page.svelte +10 -21
  34. package/src/routes/{license → foss}/+page.server.js +2 -2
  35. package/src/routes/{foss-spotlight → foss}/+page.svelte +11 -22
  36. package/src/routes/{foss-spotlight → legal}/+page.server.js +2 -2
  37. package/src/routes/{license → legal}/+page.svelte +11 -22
  38. package/src/routes/pgp/+page.svelte +10 -21
  39. package/src/routes/privacy/+page.svelte +10 -21
  40. package/src/routes/privacy-dashboard/+page.svelte +10 -27
  41. package/src/routes/services/+page.svelte +3 -16
  42. package/src/routes/terms-conditions/+page.svelte +10 -21
  43. package/src/routes/terms-of-use/+page.svelte +10 -21
  44. package/static/sitemap.xml +13 -13
  45. package/tests/e2e/mobile.spec.js +36 -17
  46. package/tests/e2e/shared/helpers.js +39 -1
  47. package/tests/meta/meta.test.js +1 -1
  48. package/tests/unit/server/meta.test.js +1 -1
  49. package/vercel.json +8 -8
@@ -38,7 +38,7 @@ jobs:
38
38
  - name: Set up Node.js
39
39
  uses: actions/setup-node@v6
40
40
  with:
41
- node-version: 22
41
+ node-version: 24
42
42
  cache: npm
43
43
  cache-dependency-path: package-lock.json
44
44
 
@@ -123,7 +123,7 @@ jobs:
123
123
  - name: Set up Node.js for npmjs
124
124
  uses: actions/setup-node@v6
125
125
  with:
126
- node-version: 22
126
+ node-version: 24
127
127
  registry-url: https://registry.npmjs.org/
128
128
  cache: npm
129
129
  cache-dependency-path: package-lock.json
@@ -184,7 +184,7 @@ jobs:
184
184
  - name: Set up Node.js for GPR
185
185
  uses: actions/setup-node@v6
186
186
  with:
187
- node-version: 22
187
+ node-version: 24
188
188
  registry-url: https://npm.pkg.github.com/
189
189
  cache: npm
190
190
  cache-dependency-path: package-lock.json
@@ -44,7 +44,7 @@ jobs:
44
44
  - name: Setup Node.js
45
45
  uses: actions/setup-node@v6
46
46
  with:
47
- node-version: 22
47
+ node-version: 24
48
48
  cache: npm
49
49
  cache-dependency-path: package-lock.json
50
50
 
@@ -25,7 +25,7 @@ jobs:
25
25
  - name: Set up Node.js
26
26
  uses: actions/setup-node@v6
27
27
  with:
28
- node-version: 22
28
+ node-version: 24
29
29
 
30
30
  - name: Install dependencies
31
31
  run: npm ci
@@ -36,7 +36,7 @@ jobs:
36
36
  - name: Set up Node.js
37
37
  uses: actions/setup-node@v6
38
38
  with:
39
- node-version: 22
39
+ node-version: 24
40
40
  cache: npm
41
41
  cache-dependency-path: package-lock.json
42
42
 
@@ -121,7 +121,7 @@ jobs:
121
121
  - name: Set up Node.js for npmjs
122
122
  uses: actions/setup-node@v6
123
123
  with:
124
- node-version: 22
124
+ node-version: 24
125
125
  registry-url: https://registry.npmjs.org/
126
126
  cache: npm
127
127
  cache-dependency-path: package-lock.json
@@ -182,7 +182,7 @@ jobs:
182
182
  - name: Set up Node.js for GPR
183
183
  uses: actions/setup-node@v6
184
184
  with:
185
- node-version: 22
185
+ node-version: 24
186
186
  registry-url: https://npm.pkg.github.com/
187
187
  cache: npm
188
188
  cache-dependency-path: package-lock.json
@@ -0,0 +1,105 @@
1
+ # .github/workflows/secret-scan.yml
2
+ #
3
+ # Copyright © 2025 Network Pro Strategies (Network Pro™)
4
+ # SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
5
+ # This file is part of Network Pro
6
+
7
+ name: Secret Scan (Gitleaks)
8
+
9
+ on:
10
+ pull_request:
11
+ schedule:
12
+ - cron: '0 8 * * *' # nightly scan at 8 AM UTC
13
+ workflow_dispatch:
14
+
15
+ jobs:
16
+ gitleaks-scan:
17
+ runs-on: ubuntu-24.04
18
+ permissions:
19
+ contents: read
20
+ security-events: write
21
+ steps:
22
+ # ---------------------------------------------------------------------
23
+ # Checkout the full repo history (needed for Gitleaks to scan all commits)
24
+ # ---------------------------------------------------------------------
25
+ - uses: actions/checkout@v5
26
+ with:
27
+ fetch-depth: 0
28
+
29
+ # ---------------------------------------------------------------------
30
+ # Run Gitleaks scan
31
+ # Uses org license key (safe because GitHub never passes secrets to forks)
32
+ # ---------------------------------------------------------------------
33
+ - name: Run Gitleaks scan
34
+ id: gitleaks
35
+ uses: gitleaks/gitleaks-action@v2
36
+ env:
37
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
38
+ GITLEAKS_LICENSE: ${{ secrets.GITLEAKS_LICENSE }}
39
+ GITLEAKS_REPORT_PATH: gitleaks-report.json
40
+
41
+ # ---------------------------------------------------------------------
42
+ # LAYER 2: Secret-handling / fork guard
43
+ # Upload artifact only if workflow runs in trusted context
44
+ # (either not a PR, or a PR from the same repo)
45
+ # ---------------------------------------------------------------------
46
+ - name: Upload Gitleaks Report
47
+ if: always() && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request')
48
+ uses: actions/upload-artifact@v4
49
+ with:
50
+ name: gitleaks-report
51
+ path: gitleaks-report.json
52
+
53
+ # ---------------------------------------------------------------------
54
+ # LAYER 1: Output redaction
55
+ # Public-safe summary – shows only secret descriptions, hides file paths.
56
+ # ---------------------------------------------------------------------
57
+ - name: Post Gitleaks summary
58
+ if: always()
59
+ run: |
60
+ echo "### 🧩 Gitleaks Scan Summary" >> $GITHUB_STEP_SUMMARY
61
+ if [ -s gitleaks-report.json ]; then
62
+ count=$(jq '.findings | length' gitleaks-report.json)
63
+ if [ "$count" -gt 0 ]; then
64
+ echo "🚨 **$count potential secret$( [ "$count" -ne 1 ] && echo "s" ) detected!**" >> $GITHUB_STEP_SUMMARY
65
+ echo "" >> $GITHUB_STEP_SUMMARY
66
+ # 🔒 Redacted output: no file paths or secret values
67
+ jq -r '.findings[] | "- \(.Description) (at undisclosed path)"' gitleaks-report.json | head -n 10 >> $GITHUB_STEP_SUMMARY
68
+ echo "" >> $GITHUB_STEP_SUMMARY
69
+ echo "_Full report available in Artifacts section (maintainers only)._ " >> $GITHUB_STEP_SUMMARY
70
+ else
71
+ echo "✅ No secrets detected." >> $GITHUB_STEP_SUMMARY
72
+ fi
73
+ else
74
+ echo "⚠️ No report file found." >> $GITHUB_STEP_SUMMARY
75
+ fi
76
+
77
+ # ---------------------------------------------------------------------
78
+ # LAYER 2: Secret-handling / fork guard
79
+ # Create issue only in trusted repo context (avoids using tokens on forks)
80
+ # ---------------------------------------------------------------------
81
+ - name: Create issue for detected secrets
82
+ if: failure() && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request')
83
+ uses: actions/github-script@v7
84
+ with:
85
+ github-token: ${{ secrets.GITHUB_TOKEN }}
86
+ script: |
87
+ const issueTitle = `🚨 Secret(s) detected in ${context.repo.repo}`;
88
+ const issueBody = `Gitleaks found potential secrets in commit ${context.sha}.\n\nCheck workflow logs and artifacts for details.`;
89
+ await github.rest.issues.create({
90
+ owner: context.repo.owner,
91
+ repo: context.repo.repo,
92
+ title: issueTitle,
93
+ body: issueBody,
94
+ labels: ['security', 'gitleaks']
95
+ });
96
+
97
+ # ---------------------------------------------------------------------
98
+ # LAYER 2: Secret-handling / fork guard
99
+ # Send ntfy alert only for trusted repo context.
100
+ # ---------------------------------------------------------------------
101
+ - name: Send ntfy notification
102
+ if: failure() && (github.event.pull_request.head.repo.full_name == github.repository || github.event_name != 'pull_request')
103
+ run: |
104
+ curl -d "🚨 Gitleaks found secrets in repo: $GITHUB_REPOSITORY on commit $GITHUB_SHA" \
105
+ https://ntfy.neteng.pro/${{ secrets.NTFY_TOPIC }}
@@ -46,7 +46,7 @@ jobs:
46
46
  - name: Set up Node.js
47
47
  uses: actions/setup-node@v6
48
48
  with:
49
- node-version: 22
49
+ node-version: 24
50
50
  cache: npm
51
51
  cache-dependency-path: package-lock.json
52
52
 
@@ -131,7 +131,7 @@ jobs:
131
131
  - name: Set up Node.js for npmjs
132
132
  uses: actions/setup-node@v6
133
133
  with:
134
- node-version: 22
134
+ node-version: 24
135
135
  registry-url: https://registry.npmjs.org/
136
136
  cache: npm
137
137
  cache-dependency-path: package-lock.json
@@ -192,7 +192,7 @@ jobs:
192
192
  - name: Set up Node.js for GPR
193
193
  uses: actions/setup-node@v6
194
194
  with:
195
- node-version: 22
195
+ node-version: 24
196
196
  registry-url: https://npm.pkg.github.com/
197
197
  cache: npm
198
198
  cache-dependency-path: package-lock.json
package/.node-version CHANGED
@@ -1 +1 @@
1
- 22.21.0
1
+ 24.11.0
package/.nvmrc CHANGED
@@ -1 +1 @@
1
- 22.21.0
1
+ 24.11.0
package/CHANGELOG.md CHANGED
@@ -22,6 +22,99 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
22
22
 
23
23
  ---
24
24
 
25
+ ## [1.24.0]
26
+
27
+ ### Added
28
+
29
+ - Introduced [GitLeaks](https://github.com/gitleaks/gitleaks-action) secret scan CI action as `.github/workflows/secret-scan.yml`.
30
+ - Introduced two-phase scan strategy:
31
+ - **Pull Request scans** to detect secrets before merge.
32
+ - **Nightly scheduled scans** (`cron: "0 4 * * *"`) for full-history coverage.
33
+ - Added **artifact upload** for the `gitleaks-report.json` file, allowing maintainers to download complete results from the Actions UI.
34
+ - Implemented **public-safe summary output** in `$GITHUB_STEP_SUMMARY`:
35
+ - Displays secret descriptions only.
36
+ - Redacts file paths and other sensitive details.
37
+ - Provides a concise, readable summary of findings.
38
+ - Added **GitHub Issue creation step** to automatically open a security issue when leaks are detected.
39
+ - Integrated optional **ntfy.sh notifications** for real-time alerting on secret leaks.
40
+ - Implemented **fork-safety guards** to prevent workflows triggered from untrusted forks from:
41
+ - Accessing organization secrets (license keys, ntfy topic).
42
+ - Uploading artifacts or creating issues.
43
+ - Added descriptive comments and logical layer separation:
44
+ - **Layer 1 – Output Redaction**
45
+ - **Layer 2 – Secret / Fork Handling**
46
+
47
+ ### Changed
48
+
49
+ - Bumped project version to `v1.23.1`.
50
+ - Updated `.node-version` and `.nvmrc` to utilize **Node.js** `24.11.0` (LTS).
51
+ - Updated CI workflows to utilize `node-version: 24`:
52
+ - `build-and-publish.yml`
53
+ - `lighthouse.yml`
54
+ - `meta-check.yml`
55
+ - `playwright.yml`
56
+ - `publish-test.yml`
57
+ - `templates/publish.template.yml`
58
+ - Updated dependencies:
59
+ - `@eslint/js` `^9.38.0` → `^9.39.0`
60
+ - `eslint` `^9.38.0` → `^9.39.0`
61
+ - `globals` `^16.4.0` → `^16.5.0`
62
+ - `posthog-js` `^1.282.0` → `^1.284.0`
63
+
64
+ ---
65
+
66
+ ## [1.23.0] - 2025-10-30
67
+
68
+ ### Documentation
69
+
70
+ - Updated `src/lib/README.md` to reflect newly added app constants.
71
+
72
+ ### Changed
73
+
74
+ - Refactored all route files to use named imports from `$lib/components` and `$lib/pages` barrel modules, replacing individual `.svelte` imports for improved consistency and maintainability.
75
+ - Changed `COMPANY_INFO.APP_NAME` constant to `Network Pro™` in `src/lib/index.js`.
76
+ - Removed unnecessary `™` symbol from files that utilize the app constant.
77
+ - Changed `/license` and `/foss-spotlight` routes to `/legal` and `/foss`, respectively, for more intuitive navigation.
78
+ - Updated all references to the new routes, `/legal` and `/foss`.
79
+ - Updated `vercel.json` to redirect `/license` to `/legal`, and `/foss-spotlight` to `/foss`.
80
+ - Refactored Playwright helper utilities to modern standards:
81
+ - Replaced deprecated `page.waitForNavigation()` with `waitForURL()` and `waitForLoadState()` in `clickAndWaitForNavigation()` for improved SPA and full-page navigation reliability.
82
+ - Simplified logic and removed unsupported `lastResponse()` usage.
83
+ - Improved test stability for mobile navigation (especially in CI environments).
84
+ - Modified `tests/unit/server/meta.test.js` to match on `Locking Down Networks`, rather than `Network Pro`, which is now dynamically attached.
85
+ - Refreshed **Last Modified** timestamps in `static/sitemap.xml`.
86
+ - Updated `.node-version` and `.nvmrc` to utilize **Node.js** `22.21.1` (LTS).
87
+ - Updated generator metadata in `src/app.html` to reflect **SvelteKit 2.48.4**.
88
+ - Bumped project version to `v1.23.0`.
89
+ - Updated dependencies:
90
+ - `@sveltejs/kit` `2.48.3` → `2.48.4`
91
+ - `svelte` `5.43.0` → `5.43.2`
92
+ - `eslint-plugin-svelte` `^3.12.5` → `^3.13.0`
93
+
94
+ - Refactored metadata and SEO handling for consistency and maintainability:
95
+ - Centralized all `<meta>` and `<title>` management in `src/lib/components/MetaTags.svelte`.
96
+ - Removed redundant per-page `<svelte:head>` entries and `MetaTags` imports in individual `+page.svelte` files.
97
+ - Added dynamic canonical URL generation using route `pathname` from `+layout.js`.
98
+ - Implemented automatic title and description suffixing:
99
+ - Titles now end with `— Network Pro™`.
100
+ - Descriptions now end with `| Security, Networking, Privacy — Network Pro Strategies`.
101
+ - Cleaned up fallback values (`defaultTitle`, `defaultDescription`, `defaultMeta`) to prevent redundant branding text.
102
+ - Adjusted layout structure to ensure correct canonical and OpenGraph metadata per route.
103
+
104
+ - Updated `src/app.html`:
105
+ - Removed duplicate document sections and placeholder meta tags.
106
+ - Verified correct `%sveltekit.head%` placement for dynamic head injection.
107
+ - Moved static PWA-related metadata (e.g., `<meta name="theme-color">`) into `app.html`.
108
+ - Retained dynamic icons and preload links for cache-busted assets via `+layout.svelte`.
109
+
110
+ ### Security
111
+
112
+ - Added transitive dependency overrides to address reported vulnerabilities:
113
+ - `tar@7.5.1` → `tar@7.5.2` (fixes CVE-2025-64118: race condition/uninitialized memory exposure).
114
+ - Confirmed overrides applied correctly via `npm ls` and `npm explain`.
115
+
116
+ ---
117
+
25
118
  ## [1.22.2] - 2025-10-29
26
119
 
27
120
  ### Documentation
@@ -1310,7 +1403,9 @@ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en
1310
1403
 
1311
1404
  <!-- Link references -->
1312
1405
 
1313
- [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.22.2...HEAD
1406
+ [Unreleased]: https://github.com/netwk-pro/netwk-pro.github.io/compare/v1.24.0...HEAD
1407
+ [1.24.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.24.0
1408
+ [1.23.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.23.0
1314
1409
  [1.22.2]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.22.2
1315
1410
  [1.22.1]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.22.1
1316
1411
  [1.22.0]: https://github.com/netwk-pro/netwk-pro.github.io/releases/tag/v1.22.0
package/LICENSE.md CHANGED
@@ -45,7 +45,7 @@ This document is provided for convenience only. In the event of any discrepancy,
45
45
 
46
46
  ---
47
47
 
48
- **Formats Available:** [HTML](https://netwk.pro/license) | Markdown
48
+ **Formats Available:** [HTML](https://netwk.pro/legal) | Markdown
49
49
 
50
50
  <a name="ownership"></a>
51
51
 
package/README.md CHANGED
@@ -465,11 +465,11 @@ Refer to the Wiki for:
465
465
 
466
466
  This project is licensed under:
467
467
 
468
- - [Creative Commons BY 4.0](https://netwk.pro/license#cc-by)
468
+ - [Creative Commons BY 4.0](https://netwk.pro/legal#cc-by)
469
469
 
470
- - Or optionally, [GNU GPL v3 or later](https://netwk.pro/license#gnu-gpl)
470
+ - Or optionally, [GNU GPL v3 or later](https://netwk.pro/legal#gnu-gpl)
471
471
 
472
- Source code, branding, and visual assets are subject to reuse and distribution terms specified on our [Legal, Copyright, and Licensing page](https://netwk.pro/license).
472
+ Source code, branding, and visual assets are subject to reuse and distribution terms specified on our [Legal, Copyright, and Licensing page](https://netwk.pro/legal).
473
473
 
474
474
  </section>
475
475
 
@@ -499,9 +499,9 @@ _Designed for professionals. Hardened for privacy. Built with intent._
499
499
  Copyright &copy; 2025
500
500
  **[Network Pro Strategies](https://netwk.pro) (Network Pro&trade;)**
501
501
 
502
- Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](https://netwk.pro/license#trademark) of Network Pro Strategies.
502
+ Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](https://netwk.pro/legal#trademark) of Network Pro Strategies.
503
503
 
504
- 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://www.fsf.org), either version 3 of the License, or (at your option) any later version.
504
+ Licensed under **[CC BY 4.0](https://netwk.pro/legal#cc-by)** and the **[GNU GPL](https://netwk.pro/legal#gnu-gpl)**, as published by the [Free Software Foundation](https://www.fsf.org), either version 3 of the License, or (at your option) any later version.
505
505
 
506
506
  </span>
507
507
 
package/budget.json CHANGED
@@ -21,7 +21,7 @@
21
21
  ]
22
22
  },
23
23
  {
24
- "path": "/foss-spotlight",
24
+ "path": "/foss",
25
25
  "resourceSizes": [
26
26
  { "resourceType": "image", "budget": 500 },
27
27
  { "resourceType": "total", "budget": 1200 }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@networkpro/web",
3
3
  "private": false,
4
- "version": "1.22.2",
4
+ "version": "1.24.0",
5
5
  "description": "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro Strategies",
6
6
  "keywords": [
7
7
  "advisory",
@@ -79,28 +79,28 @@
79
79
  },
80
80
  "dependencies": {
81
81
  "dompurify": "^3.3.0",
82
- "posthog-js": "^1.282.0",
82
+ "posthog-js": "^1.284.0",
83
83
  "semver": "^7.7.3",
84
- "svelte": "5.43.0"
84
+ "svelte": "5.43.2"
85
85
  },
86
86
  "devDependencies": {
87
87
  "@eslint/compat": "^1.4.1",
88
- "@eslint/js": "^9.38.0",
88
+ "@eslint/js": "^9.39.0",
89
89
  "@lhci/cli": "^0.15.1",
90
90
  "@playwright/test": "^1.56.1",
91
91
  "@sveltejs/adapter-vercel": "^6.1.1",
92
- "@sveltejs/kit": "2.48.3",
92
+ "@sveltejs/kit": "2.48.4",
93
93
  "@sveltejs/vite-plugin-svelte": "^6.2.1",
94
94
  "@testing-library/jest-dom": "^6.9.1",
95
95
  "@testing-library/svelte": "^5.2.8",
96
96
  "@vitest/coverage-v8": "3.2.4",
97
97
  "autoprefixer": "^10.4.21",
98
98
  "browserslist": "^4.27.0",
99
- "eslint": "^9.38.0",
99
+ "eslint": "^9.39.0",
100
100
  "eslint-config-prettier": "^10.1.8",
101
101
  "eslint-plugin-jsdoc": "^61.1.11",
102
- "eslint-plugin-svelte": "^3.12.5",
103
- "globals": "^16.4.0",
102
+ "eslint-plugin-svelte": "^3.13.0",
103
+ "globals": "^16.5.0",
104
104
  "jsdom": "26.1.0",
105
105
  "lightningcss": "^1.30.2",
106
106
  "markdownlint": "^0.39.0",
@@ -124,7 +124,8 @@
124
124
  "vitest": "3.2.4"
125
125
  },
126
126
  "overrides": {
127
- "tmp": ">=0.2.4",
128
- "cookie": "^1.0.0"
127
+ "cookie": "^1.0.0",
128
+ "tar": "7.5.2",
129
+ "tmp": ">=0.2.4"
129
130
  }
130
131
  }
package/src/app.html CHANGED
@@ -10,12 +10,12 @@
10
10
  This file is part of Network Pro.
11
11
  ====================================================================== -->
12
12
 
13
- <title>%sveltekit.title%</title>
14
- <meta name="description" content="%sveltekit.description%" />
13
+ <!-- ✅ DO NOT include any <title> or <meta name="description"> tags here
14
+ Titles and metadata are managed by SvelteKit via MetaTags.svelte -->
15
+
15
16
  <meta
16
17
  name="robots"
17
18
  content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1" />
18
- <meta name="author" content="Scott Lopez" />
19
19
 
20
20
  <!-- Favicon: Keep only ICO for max compatibility -->
21
21
  <link
@@ -53,7 +53,7 @@
53
53
  content="bx4ham0zkpvzztzu213bhpt76m9siq" />
54
54
  <!-- cspell:enable -->
55
55
 
56
- <meta name="generator" content="SvelteKit 2.48.3" />
56
+ <meta name="generator" content="SvelteKit 2.48.4" />
57
57
 
58
58
  <script src="/disableSw.js"></script>
59
59
 
package/src/lib/README.md CHANGED
@@ -84,17 +84,20 @@ console.log(CONSTANTS.COMPANY_INFO.APP_NAME); // "Network Pro"
84
84
  | Key | Description | Example |
85
85
  | ---------- | ---------------------------- | ------------------------ |
86
86
  | `NAME` | Full company name | `Network Pro Strategies` |
87
- | `APP_NAME` | Application or branding name | `Network Pro` |
87
+ | `APP_NAME` | Application or branding name | `Network Pro™` |
88
88
  | `YEAR` | Copyright / app year | `2025` |
89
89
 
90
90
  ### 📬 CONTACT
91
91
 
92
- | Key | Description | Example |
93
- | --------- | ----------------------- | --------------------------- |
94
- | `EMAIL` | General support email | `support (at) neteng.pro` |
95
- | `SECURE` | Secure contact address | `contact (at) s.neteng.pro` |
96
- | `PRIVACY` | Privacy-related contact | `privacy (at) netwk.pro` |
97
- | `PHONE` | Company phone number | `(623) 252-4350` |
92
+ | Key | Description | Example |
93
+ | -------------- | ------------------------------ | --------------------------- |
94
+ | `EMAIL` | General support email | `support (at) netwk.pro` |
95
+ | `EMAIL_LINK` | General support email (link) | `support@netwk.pro` |
96
+ | `SECURE` | Secure contact address | `contact (at) s.neteng.pro` |
97
+ | `SECURE_LINK` | Secure contact address (link) | `contact@s.neteng.pro` |
98
+ | `PRIVACY` | Privacy-related contact | `privacy (at) netwk.pro` |
99
+ | `PRIVACY_LINK` | Privacy-related contact (link) | `privacy@netwk.pro` |
100
+ | `PHONE` | Company phone number | `(623) 252-4350` |
98
101
 
99
102
  ### 🗂️ PAGE
100
103
 
@@ -153,8 +156,8 @@ No need to modify imports when adding new images — just add them to `images.js
153
156
  Copyright &copy; 2025
154
157
  **[Network Pro Strategies](https://netwk.pro) (Network Pro&trade;)**
155
158
 
156
- Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](https://netwk.pro/license#trademark) of Network Pro Strategies.
159
+ Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](https://netwk.pro/legal#trademark) of Network Pro Strategies.
157
160
 
158
- 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://www.fsf.org), either version 3 of the License, or (at your option) any later version.
161
+ Licensed under **[CC BY 4.0](https://netwk.pro/legal#cc-by)** and the **[GNU GPL](https://netwk.pro/legal#gnu-gpl)**, as published by the [Free Software Foundation](https://www.fsf.org), either version 3 of the License, or (at your option) any later version.
159
162
 
160
163
  </span>
@@ -19,8 +19,8 @@ This file is part of Network Pro.
19
19
 
20
20
  const { PAGE } = CONSTANTS;
21
21
 
22
- const ccbyLink = `${base}/license#cc-by`;
23
- const gplLink = `${base}/license#gnu-gpl`;
22
+ const ccbyLink = `${base}/legal#cc-by`;
23
+ const gplLink = `${base}/legal#gnu-gpl`;
24
24
 
25
25
  /**
26
26
  * Badge link object.
@@ -19,7 +19,7 @@ This file is part of Network Pro.
19
19
 
20
20
  const termsLink = `${base}/terms-of-use`;
21
21
  const privacyLink = `${base}/privacy`;
22
- const licenseLink = `${base}/license`;
22
+ const licenseLink = `${base}/legal`;
23
23
  const pdashLink = `${base}/privacy-dashboard`;
24
24
 
25
25
  /**
@@ -9,6 +9,9 @@ This file is part of Network Pro.
9
9
  <script>
10
10
  export let title;
11
11
  export let description;
12
+ export let url = 'https://netwk.pro';
13
+ export let image = `${url}/img/banner-og-1200x630.png`;
14
+ export let pathname = '';
12
15
 
13
16
  import { CONSTANTS } from '$lib';
14
17
 
@@ -16,33 +19,56 @@ This file is part of Network Pro.
16
19
 
17
20
  const { COMPANY_INFO, LINKS } = CONSTANTS;
18
21
 
22
+ // Default fallbacks (for missing or undefined props)
23
+ const defaultTitle = 'Security, Networking, Privacy';
24
+ const defaultDescription = 'Locking Down Networks, Unlocking Confidence™';
25
+
26
+ // computed title/description with fallback
27
+ $: metaTitle = title
28
+ ? `${title}${title.includes(COMPANY_INFO.APP_NAME) ? '' : ` — ${COMPANY_INFO.APP_NAME}`}`
29
+ : defaultTitle;
30
+
31
+ $: metaDescription = description
32
+ ? `${description}${description.includes(COMPANY_INFO.NAME) ? '' : ` | Security, Networking, Privacy — ${COMPANY_INFO.NAME}`}`
33
+ : defaultDescription;
34
+
35
+ // Compute canonical URL
36
+ $: canonicalUrl = pathname
37
+ ? `${url.replace(/\/$/, '')}${pathname.startsWith('/') ? pathname : `/${pathname}`}`
38
+ : url;
39
+
19
40
  // Static shared values
20
- const ogUrl = LINKS.HOME;
21
- const ogImg = '/img/banner-og-1200x630.png';
22
- const companyName = COMPANY_INFO.NAME;
23
41
  const twitterAct = '@NetEng_Pro';
24
42
  </script>
25
43
 
26
44
  <svelte:head>
27
- <title>{title}</title>
28
- <meta name="description" content={description} />
45
+ <title>{metaTitle}</title>
46
+ <meta name="description" content={metaDescription} />
29
47
 
30
48
  <!-- OpenGraph -->
31
- <meta property="og:title" content={title} />
49
+ <meta property="og:title" content={metaTitle} />
50
+ <meta property="og:description" content={metaDescription} />
51
+ <meta property="og:url" content={url} />
32
52
  <meta property="og:type" content="website" />
33
- <meta property="og:url" content={ogUrl} />
34
- <meta property="og:image" content={ogImg} />
35
- <meta property="og:image:alt" content={companyName} />
36
- <meta property="og:description" content={description} />
53
+ <meta property="og:site_name" content={COMPANY_INFO.APP_NAME} />
54
+ <meta property="og:image" content={image} />
55
+ <meta property="og:image:alt" content={COMPANY_INFO.NAME} />
56
+ <meta property="og:locale" content="en_US" />
37
57
 
38
58
  <!-- Twitter -->
39
59
  <meta name="twitter:card" content="summary_large_image" />
60
+ <meta name="twitter:title" content={metaTitle} />
61
+ <meta name="twitter:description" content={metaDescription} />
40
62
  <meta name="twitter:site" content={twitterAct} />
41
63
  <meta name="twitter:creator" content={twitterAct} />
42
- <meta property="twitter:domain" content={ogUrl} />
43
- <meta property="twitter:url" content={ogUrl} />
44
- <meta name="twitter:title" content={title} />
45
- <meta name="twitter:description" content={description} />
46
- <meta name="twitter:image" content={ogImg} />
47
- <meta name="twitter:image:alt" content={companyName} />
64
+ <meta property="twitter:domain" content={url} />
65
+ <meta property="twitter:url" content={url} />
66
+ <meta name="twitter:image" content={image} />
67
+ <meta name="twitter:image:alt" content={COMPANY_INFO.NAME} />
68
+
69
+ <!-- Canonical URL -->
70
+ <link rel="canonical" href={canonicalUrl} />
71
+
72
+ <!-- Basic SEO -->
73
+ <meta name="author" content="Scott Lopez" />
48
74
  </svelte:head>
@@ -6,8 +6,6 @@ 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
- <!-- cspell:ignore ccby gnugpl -->
10
-
11
9
  <script>
12
10
  import { base } from '$app/paths';
13
11
  // Import icons for licenses
@@ -22,9 +20,9 @@ This file is part of Network Pro.
22
20
  const { COMPANY_INFO, CONTACT, PAGE, NAV } = CONSTANTS;
23
21
 
24
22
  // Dynamic links for licensing and trademark
25
- const ccbyLink = `${base}/license#cc-by`;
26
- const gnugplLink = `${base}/license#gnu-gpl`;
27
- const trademarkLink = `${base}/license#trademark`;
23
+ const ccbyLink = `${base}/legal#cc-by`;
24
+ const gnugplLink = `${base}/legal#gnu-gpl`;
25
+ const trademarkLink = `${base}/legal#trademark`;
28
26
 
29
27
  /** @type {string} */
30
28
  const creatorUrl = 'https://netwk.pro';
@@ -101,12 +99,12 @@ This file is part of Network Pro.
101
99
  target={PAGE.BLANK}>
102
100
  <strong>{COMPANY_INFO.NAME}</strong>
103
101
  </a>
104
- ({COMPANY_INFO.APP_NAME}&trade;)
102
+ ({COMPANY_INFO.APP_NAME})
105
103
  </p>
106
104
 
107
105
  <!-- Trademark Section -->
108
106
  <p>
109
- {COMPANY_INFO.APP_NAME}&trade;, the shield logo, and the "{creatorSlogan}&trade;"
107
+ {COMPANY_INFO.APP_NAME}, the shield logo, and the "{creatorSlogan}&trade;"
110
108
  slogan are
111
109
  <a href={trademarkLink} target={PAGE.SELF}>trademarks</a>
112
110
  of {COMPANY_INFO.NAME}.
@@ -146,3 +144,5 @@ This file is part of Network Pro.
146
144
  </p>
147
145
  </div>
148
146
  <!-- END FOOTER -->
147
+
148
+ <!-- cspell:ignore ccby gnugpl -->
@@ -21,7 +21,7 @@ This file is part of Network Pro.
21
21
  const aboutLink = `${base}/about`;
22
22
  const servLink = `${base}/services`;
23
23
  const lhubLink = `${base}/links`;
24
- const fossLink = `${base}/foss-spotlight`;
24
+ const fossLink = `${base}/foss`;
25
25
  const discussLink =
26
26
  'https://github.com/netwk-pro/netwk-pro.github.io/discussions';
27
27