@networkpro/web 1.15.4 → 1.17.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.
@@ -0,0 +1,214 @@
1
+ <!-- =========================================================================
2
+ CONTRIBUTING.md
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
+ <a name="top"></a>
10
+
11
+ [SPDX-License-Identifier](https://spdx.dev/learn/handling-license-info/):
12
+ `CC-BY-4.0 OR GPL-3.0-or-later`
13
+
14
+ # 🤝 Contributing to Network Pro Strategies
15
+
16
+ **Network Pro Strategies**
17
+ **Effective Date:** July 31, 2025
18
+
19
+ &nbsp;
20
+
21
+ Thanks for your interest in improving **Network Pro Strategies** (Network Pro™)! We're always looking for collaborators and contributors of all skill levels. This guide will help you get started quickly and effectively.
22
+
23
+ Following these guidelines helps us all work together efficiently and respectfully. 🙌
24
+
25
+ ---
26
+
27
+ ## 🐛 Using the Issue Tracker
28
+
29
+ Use the [issue tracker](https://github.com/netwk-pro/netwk-pro.github.io/issues) for:
30
+
31
+ - Reporting [bugs](#bug-reports)
32
+ - Submitting [feature requests](#feature-requests)
33
+ - Proposing [pull requests](#pull-requests)
34
+
35
+ 🚫 Please do **not** use issues for general support — instead, head to:
36
+
37
+ - [Stack Overflow Teams](https://stack.neteng.pro/)
38
+ - [GitHub Discussions](https://discuss.neteng.pro)
39
+ - [Discord](https://discord.neteng.pro)
40
+
41
+ ---
42
+
43
+ <section id="bug-reports">
44
+
45
+ ## 🐞 Bug Reports
46
+
47
+ A bug is a clear, reproducible issue in the code. High-quality reports help us fix problems faster.
48
+
49
+ ### ✅ A good bug report includes
50
+
51
+ - A **descriptive title**
52
+ - Steps to reproduce
53
+ - Your environment (OS, browser, version)
54
+ - Expected vs actual behavior
55
+ - Links to a minimal reproducible case (if possible)
56
+
57
+ _Example_:
58
+
59
+ <!-- markdownlint-disable MD042 -->
60
+
61
+ > **Title**: Checkbox toggle fails on Safari 17
62
+ > Steps:
63
+ >
64
+ > 1. Visit page X
65
+ > 2. Click toggle
66
+ > 3. Observe that...
67
+ > Expected: ...
68
+ > Actual: ...
69
+ > [Live example](#)
70
+
71
+ <!-- markdownlint-enable MD042 -->
72
+
73
+ </section>
74
+
75
+ &nbsp;
76
+
77
+ <sub>[Back to top](#top)</sub>
78
+
79
+ ---
80
+
81
+ <section id="feature-requests">
82
+
83
+ ## ✨ Feature Requests
84
+
85
+ Feature requests are welcome — just make sure it aligns with the project’s goals.
86
+
87
+ Before posting:
88
+
89
+ - Search for similar requests
90
+ - Clearly describe the problem it solves
91
+ - Explain the use case and who benefits
92
+
93
+ Strong proposals help us prioritize.
94
+
95
+ </section>
96
+
97
+ &nbsp;
98
+
99
+ <sub>[Back to top](#top)</sub>
100
+
101
+ ---
102
+
103
+ <section id="pull-requests">
104
+
105
+ ## 🔁 Pull Requests
106
+
107
+ Well-scoped, well-documented pull requests are the lifeblood of open-source.
108
+
109
+ ### ⚠️ Ask First
110
+
111
+ Before large PRs (new features, refactors, dependency upgrades), please check with maintainers first.
112
+
113
+ ### 📋 Steps
114
+
115
+ 1. **Fork the repo & set remotes**:
116
+
117
+ ```bash
118
+ git clone https://github.com/<your-username>/netwk-pro.github.io.git
119
+ cd netwk-pro.github.io
120
+ git remote add upstream https://github.com/netwk-pro/netwk-pro.github.io.git
121
+ ```
122
+
123
+ 2. **Stay Updated**
124
+
125
+ ```bash
126
+ git checkout master
127
+ git pull upstream master
128
+ ```
129
+
130
+ 3. **Create a topic branch:**
131
+
132
+ ```bash
133
+ git checkout -b my-feature
134
+ ```
135
+
136
+ 4. **Install & test locally:**
137
+
138
+ ```bash
139
+ npm install
140
+ npm run checkout
141
+ ```
142
+
143
+ 5. **Make your changes**
144
+
145
+ (and commit them in logical chunks with good commit messages).
146
+
147
+ 6. **Build:**
148
+
149
+ ```bash
150
+ npm run build
151
+ git add build/
152
+ git commit -m "Build: update assets"
153
+ ```
154
+
155
+ 7. **Push and open a PR:**
156
+
157
+ ```bash
158
+ git push origin my-feature
159
+ ```
160
+
161
+ Open your PR with a clear title, description, and reference the related issue (if any).
162
+
163
+ </section>
164
+
165
+ &nbsp;
166
+
167
+ <sub>[Back to top](#top)</sub>
168
+
169
+ ---
170
+
171
+ ## ✅ Coding & Style Notes
172
+
173
+ - Use the defined code style (Prettier, ESLint, Stylelint, markdownlint)
174
+ - Avoid unrelated changes in the same PR
175
+ - Keep PRs focused and test-covered when appropriate
176
+
177
+ &nbsp;
178
+
179
+ ## 🔐 Legal Notice
180
+
181
+ By submitting a pull request, you agree to license your contributions under:
182
+
183
+ - [CC BY 4.0](https://netwk.pro/license#cc-by)
184
+ - [GNU GPL 3.0 or later](https://netwk.pro/license#gnu-gpl)
185
+
186
+ &nbsp;
187
+
188
+ <sub>[Back to top](#top)</sub>
189
+
190
+ &nbsp;
191
+
192
+ _Thanks again for your contribution and for being part of the Network Pro&trade; community!_
193
+
194
+ ---
195
+
196
+ <div style="font-size: 12px; font-weight: bold; text-align: center;">
197
+
198
+ [Home](https://netwk.pro) &nbsp; | &nbsp; [Terms of Use](https://netwk.pro/terms-of-use)
199
+ [Privacy Policy](https://netwk.pro/privacy) &nbsp; | &nbsp; [Legal](https://netwk.pro/license)
200
+
201
+ </div>
202
+
203
+ &nbsp;
204
+
205
+ <span style="font-size: 12px; text-align: center;">
206
+
207
+ Copyright &copy; 2025
208
+ **[Network Pro Strategies](https://netwk.pro/)** (Network Pro&trade;)
209
+
210
+ Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](https://netwk.pro/license#trademark) of Network Pro Strategies.
211
+
212
+ 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, either version 3 of the License, or (at your option) any later version.
213
+
214
+ </span>
package/LICENSE.md CHANGED
@@ -51,7 +51,7 @@ This document is provided for convenience only. In the event of any discrepancy,
51
51
 
52
52
  ## 1. Copyright
53
53
 
54
- All content—including text, software, logos, graphics, documentation, and other materials—provided by **Network Pro Strategies** (“Network Pro”, “Company”, “Licensor”) is protected by U.S. and international copyright laws.
54
+ All content—including text, software, logos, graphics, documentation, and other materials—provided by **Network Pro Strategies** (“Network Pro&trade;”, “Company”, “Licensor”) is protected by U.S. and international copyright laws.
55
55
 
56
56
  Copyright &copy; 2025 **[Network Pro Strategies](https://netwk.pro)** (Network Pro&trade;)
57
57
 
@@ -113,7 +113,7 @@ This work is dual-licensed under:
113
113
 
114
114
  ## 7. Creative Commons License (CC BY 4.0)
115
115
 
116
- <sup>Formats: [HTML](https://netwk.pro/assets/license/CC-BY-4.0.html) | [Markdown](https://netwk.pro/assets/license/CC-BY-4.0.md) | [Text](https://netwk.pro/assets/license/CC-BY-4.0.txt) | [RDFa](https://netwk.pro/assets/license/CC-BY-4.0-rdfa.xml) | [XMP](https://netwk.pro/assets/license/CC-BY-4.0.xml)</sup>
116
+ <sup>View / Download: [HTML](https://netwk.pro/bin/license/CC-BY-4.0.html) | [Markdown](https://netwk.pro/bin/license/CC-BY-4.0.md) | [Text](https://netwk.pro/bin/license/CC-BY-4.0.txt) | [RDFa](https://netwk.pro/bin/license/CC-BY-4.0-rdfa.xml) | [XMP](https://netwk.pro/bin/license/CC-BY-4.0.xml)</sup>
117
117
 
118
118
  Network Pro&trade; (the "Licensed Material") is licensed under **Creative
119
119
  Commons Attribution 4.0 International** (CC BY 4.0)
@@ -139,7 +139,7 @@ Permissions beyond the scope of this License—or instead of those permitted by
139
139
 
140
140
  ## 8. GNU General Public License (GPL)
141
141
 
142
- <sup>Formats: [HTML](https://netwk.pro/assets/license/COPYING.html) | [Markdown](https://netwk.pro/assets/license/COPYING.md) | [Text](https://netwk.pro/assets/license/COPYING.txt) | [RDFa](https://netwk.pro/assets/license/COPYING-rdfa.xml) | [ODT](https://netwk.pro/assets/license/COPYING.odt)</sup>
142
+ <sup>View / Download: [HTML](https://netwk.pro/bin/license/COPYING.html) | [Markdown](https://netwk.pro/bin/license/COPYING.md) | [Text](https://netwk.pro/bin/license/COPYING.txt) | [RDFa](https://netwk.pro/bin/license/COPYING-rdfa.xml) | [ODT](https://netwk.pro/bin/license/COPYING.odt)</sup>
143
143
 
144
144
  Network Pro&trade; is free software: you can redistribute it and/or modify it under the terms of the **GNU General Public 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.
145
145
 
package/README.md CHANGED
@@ -309,18 +309,30 @@ https://netwk.pro/?debug=true
309
309
 
310
310
  ## 📣 CSP Report Handler
311
311
 
312
- To receive and inspect CSP violation reports in development or production, the repo includes a Netlify-compatible [Edge Function](https://docs.netlify.com/edge-functions/overview/) at:
312
+ This project integrates with a dedicated CSP reporting endpoint, implemented as a [Netlify Edge Function](https://docs.netlify.com/edge-functions/overview/) and hosted separately at:
313
313
 
314
- ```bash
315
- netlify/edge-functions/csp-report.js
316
- ```
314
+ - <https://csp.netwk.pro/.netlify/functions/csp-report>
315
+ - Source: [netwk-pro/csp-endpoint](https://github.com/netwk-pro/csp-endpoint)
317
316
 
318
- This Edge Function receives Content Security Policy (CSP) violation reports at `/api/csp-report` and logs relevant details to the console. High-risk violations (e.g., `script-src`, `form-action`) also trigger real-time alerts via `ntfy`. You can further integrate with logging tools, SIEM platforms, or notification systems as needed.
317
+ The endpoint receives Content Security Policy (CSP) violation reports and logs details for inspection. High-risk violations (e.g., `script-src`, `form-action`) also trigger real-time alerts via [`ntfy`](https://ntfy.sh/). You can extend this further by integrating with SIEM platforms, logging tools, or notification systems.
319
318
 
320
- Make sure to include the `report-uri` directive in your CSP header:
319
+ ### Usage
321
320
 
322
- ```bash
323
- Content-Security-Policy: ...; report-uri /api/csp-report;
321
+ To enable reporting, make sure your CSP headers include both the legacy `report-uri` and the modern `report-to` directives.
322
+ This project’s `hooks.server.js` already configures both, along with the required `Report-To` header:
323
+
324
+ ```http
325
+ # Example response headers
326
+ Content-Security-Policy: ...; report-uri https://csp.netwk.pro/.netlify/functions/csp-report; report-to csp-endpoint;
327
+
328
+ Report-To: {
329
+ "group": "csp-endpoint",
330
+ "max_age": 10886400,
331
+ "endpoints": [
332
+ { "url": "https://csp.netwk.pro/.netlify/functions/csp-report" }
333
+ ],
334
+ "include_subdomains": true
335
+ }
324
336
  ```
325
337
 
326
338
  </section>
@@ -494,7 +506,7 @@ _Designed for professionals. Hardened for privacy. Built with intent._
494
506
  Copyright &copy; 2025
495
507
  **[Network Pro Strategies](https://netwk.pro) (Network Pro&trade;)**
496
508
 
497
- Network Pro&trade;, the shield logo, and the "Locking Down Networks&trade;" slogan are [trademarks](https://netwk.pro/license#trademark) of Network Pro Strategies.
509
+ Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](https://netwk.pro/license#trademark) of Network Pro Strategies.
498
510
 
499
511
  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.
500
512
 
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@networkpro/web",
3
3
  "private": false,
4
- "version": "1.15.4",
4
+ "version": "1.17.0",
5
5
  "description": "Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro Strategies",
6
6
  "keywords": [
7
7
  "advisory",
@@ -78,47 +78,46 @@
78
78
  "postinstall": "npm run check:node"
79
79
  },
80
80
  "dependencies": {
81
- "dompurify": "^3.2.6",
82
- "posthog-js": "^1.257.0",
81
+ "dompurify": "^3.2.7",
82
+ "posthog-js": "^1.266.0",
83
83
  "semver": "^7.7.2",
84
- "svelte": "5.36.12"
84
+ "svelte": "5.39.1"
85
85
  },
86
86
  "devDependencies": {
87
- "@eslint/compat": "^1.3.1",
88
- "@eslint/js": "^9.31.0",
87
+ "@eslint/compat": "^1.3.2",
88
+ "@eslint/js": "^9.35.0",
89
89
  "@lhci/cli": "^0.15.1",
90
- "@playwright/test": "^1.54.1",
91
- "@sveltejs/adapter-netlify": "^5.1.0",
92
- "@sveltejs/kit": "2.25.1",
93
- "@sveltejs/vite-plugin-svelte": "^6.1.0",
94
- "@testing-library/jest-dom": "^6.6.3",
90
+ "@playwright/test": "^1.55.0",
91
+ "@sveltejs/adapter-netlify": "^5.2.3",
92
+ "@sveltejs/kit": "2.42.1",
93
+ "@sveltejs/vite-plugin-svelte": "^6.2.0",
94
+ "@testing-library/jest-dom": "^6.8.0",
95
95
  "@testing-library/svelte": "^5.2.8",
96
96
  "@vitest/coverage-v8": "^3.2.4",
97
97
  "autoprefixer": "^10.4.21",
98
- "browserslist": "^4.25.1",
99
- "eslint": "^9.31.0",
98
+ "browserslist": "^4.26.2",
99
+ "eslint": "^9.35.0",
100
100
  "eslint-config-prettier": "^10.1.8",
101
- "eslint-plugin-jsdoc": "^51.4.1",
102
- "eslint-plugin-svelte": "^3.11.0",
103
- "globals": "^16.3.0",
104
- "jsdom": "^26.1.0",
101
+ "eslint-plugin-jsdoc": "^58.1.1",
102
+ "eslint-plugin-svelte": "^3.12.3",
103
+ "globals": "^16.4.0",
104
+ "jsdom": "26.1.0",
105
105
  "lightningcss": "^1.30.1",
106
106
  "markdownlint": "^0.38.0",
107
107
  "markdownlint-cli2": "^0.18.1",
108
- "mdsvex": "^0.12.6",
109
- "playwright": "^1.54.1",
108
+ "playwright": "^1.55.0",
110
109
  "postcss": "^8.5.6",
111
110
  "prettier": "^3.6.2",
112
111
  "prettier-plugin-svelte": "^3.4.0",
113
- "stylelint": "^16.22.0",
112
+ "stylelint": "^16.24.0",
114
113
  "stylelint-config-html": "^1.1.0",
115
- "stylelint-config-recommended": "^16.0.0",
114
+ "stylelint-config-recommended": "^17.0.0",
116
115
  "stylelint-order": "^7.0.0",
117
- "svelte-check": "^4.3.0",
118
- "svelte-eslint-parser": "^1.3.0",
116
+ "svelte-check": "^4.3.1",
117
+ "svelte-eslint-parser": "^1.3.2",
119
118
  "svelte-preprocess": "^6.0.3",
120
- "typescript": "^5.8.3",
121
- "vite": "^7.0.5",
119
+ "typescript": "^5.9.2",
120
+ "vite": "^7.1.5",
122
121
  "vite-plugin-lightningcss": "^0.0.5",
123
122
  "vite-tsconfig-paths": "^5.1.4",
124
123
  "vitest": "^3.2.4"
@@ -33,7 +33,7 @@ export default defineConfig({
33
33
 
34
34
  /* Shared settings for all projects */
35
35
  use: {
36
- baseURL: 'http://localhost:4173?nosw', // Update to use preview server URL
36
+ baseURL: 'http://localhost:4173', // Update to use preview server URL
37
37
  trace: 'on-first-retry',
38
38
  timeout: 60000, // Default action timeout of 60 seconds for each step
39
39
  navigationTimeout: 60000, // Timeout for navigation operations
@@ -83,7 +83,7 @@ export default defineConfig({
83
83
  /* Run your local preview server before starting the tests */
84
84
  webServer: {
85
85
  command: 'npm run preview', // Use preview server
86
- url: 'http://localhost:4173?nosw', // Match the preview server URL
86
+ url: 'http://localhost:4173', // Match the preview server URL
87
87
  reuseExistingServer: !process.env.CI,
88
88
  timeout: 60 * 1000, // wait up to 60 seconds for preview to be ready
89
89
  },
package/src/app.html CHANGED
@@ -63,7 +63,7 @@
63
63
  content="bx4ham0zkpvzztzu213bhpt76m9siq" />
64
64
  <!-- cspell:enable -->
65
65
 
66
- <meta name="generator" content="SvelteKit 2.25.1" />
66
+ <meta name="generator" content="SvelteKit 2.42.1" />
67
67
 
68
68
  <script src="/disableSw.js"></script>
69
69
 
@@ -72,7 +72,7 @@
72
72
  <body>
73
73
  <div id="svelte">%sveltekit.body%</div>
74
74
 
75
- <!-- LinkedIn Insight Tag removed 2025-05-26 by SunDevil311 -->
75
+ <!-- LinkedIn Insight Tag removed 2025-05-26 -->
76
76
 
77
77
  <!-- cspell:ignore preconnects webfonts lintrk -->
78
78
  </body>
@@ -68,7 +68,8 @@ This file is part of Network Pro.
68
68
  loading="lazy"
69
69
  src={badge.src}
70
70
  alt={badge.alt}
71
- style="width: {badge.width}; height: {badge.height};" />
71
+ style:width={badge.width}
72
+ style:height={badge.height} />
72
73
  </a>
73
74
  </td>
74
75
  {/each}
@@ -60,15 +60,15 @@ This file is part of Network Pro.
60
60
 
61
61
  /**
62
62
  * Width of the logo in pixels.
63
- * @type {number}
63
+ * @type {string}
64
64
  */
65
- export let width = 250;
65
+ export let width = '250px';
66
66
 
67
67
  /**
68
68
  * Height of the logo in pixels.
69
- * @type {number}
69
+ * @type {string}
70
70
  */
71
- export let height = 250;
71
+ export let height = '250px';
72
72
 
73
73
  /**
74
74
  * Fetch priority for the logo image.
@@ -93,7 +93,8 @@ This file is part of Network Pro.
93
93
  src={logoPng}
94
94
  {alt}
95
95
  {fetchpriority}
96
- style="width: {width}px; height: {height}px" />
96
+ style:width
97
+ style:height />
97
98
  </picture>
98
99
 
99
100
  {#if showSlogan}
@@ -117,32 +117,18 @@ This file is part of Network Pro.
117
117
  Licensed under
118
118
  {#each licenses as license, index}
119
119
  {#if license.type === 'CC BY 4.0'}
120
- <a
121
- href={license.url}
122
- target={PAGE.SELF}
123
- rel={relLicense}
124
- style="display: inline-block">
120
+ <a href={license.url} target={PAGE.SELF} rel={relLicense}>
125
121
  <strong>{license.type}</strong>
126
122
  </a>
127
123
  {#if license.icons}
128
124
  {#each license.icons as icon}
129
- <a
130
- href={license.externalUrl}
131
- target={PAGE.BLANK}
132
- rel={relLicense}
133
- style="display: inline-block">
125
+ <a href={license.externalUrl} target={PAGE.BLANK} rel={relLicense}>
134
126
  <img
127
+ class="cc-img"
135
128
  decoding="async"
136
129
  loading="lazy"
137
130
  src={icon.src}
138
- alt={icon.alt}
139
- style="
140
- width: 18px !important;
141
- height: 18px !important;
142
- margin-left: 3px;
143
- text-decoration: none;
144
- vertical-align: text-bottom;
145
- " />
131
+ alt={icon.alt} />
146
132
  </a>
147
133
  {/each}
148
134
  {/if}
@@ -242,34 +242,24 @@ This file is part of Network Pro.
242
242
  <a
243
243
  rel={PAGE.REL}
244
244
  href="https://creativecommons.org/licenses/by/4.0/"
245
- target={PAGE.BLANK}>
245
+ target={PAGE.BLANK}
246
+ class="cc-link">
246
247
  <img
248
+ class="cc-img"
247
249
  decoding="async"
248
250
  loading="lazy"
249
- style="
250
- display: inline-block;
251
- height: 18px !important;
252
- margin-left: 3px;
253
- text-decoration: none;
254
- vertical-align: text-bottom;
255
- "
256
251
  src={ccSrc}
257
252
  alt="Creative Commons BY" />
258
253
  </a>
259
254
  <a
260
255
  rel={PAGE.REL}
261
256
  href="https://creativecommons.org/licenses/by/4.0/"
262
- target={PAGE.BLANK}>
257
+ target={PAGE.BLANK}
258
+ class="cc-link">
263
259
  <img
260
+ class="cc-img"
264
261
  decoding="async"
265
262
  loading="lazy"
266
- style="
267
- display: inline-block;
268
- height: 18px !important;
269
- margin-left: 3px;
270
- text-decoration: none;
271
- vertical-align: text-bottom;
272
- "
273
263
  src={bySrc}
274
264
  alt="Creative Commons BY" />
275
265
  </a>.
@@ -518,6 +518,7 @@ footer .container {
518
518
  padding: 0;
519
519
  margin: -1px;
520
520
  border: 0;
521
+ /* stylelint-disable-next-line property-no-deprecated */
521
522
  clip: rect(0, 0, 0, 0);
522
523
  overflow: hidden;
523
524
  white-space: nowrap;
@@ -602,3 +603,14 @@ footer .container {
602
603
  transform: rotate(360deg);
603
604
  }
604
605
  }
606
+
607
+ .cc-link {
608
+ text-decoration: none;
609
+ }
610
+
611
+ .cc-img {
612
+ display: inline-block;
613
+ height: 18px !important;
614
+ margin-left: 3px;
615
+ vertical-align: text-bottom;
616
+ }
@@ -179,6 +179,7 @@ a:visited:focus-visible {
179
179
  padding: 0;
180
180
  margin: -1px;
181
181
  border: 0;
182
+ /* stylelint-disable-next-line property-no-deprecated */
182
183
  clip: rect(0, 0, 0, 0);
183
184
  overflow: hidden;
184
185
  white-space: nowrap;
@@ -198,6 +199,7 @@ a:visited:focus-visible {
198
199
  width: auto;
199
200
  height: auto;
200
201
  margin: 0;
202
+ /* stylelint-disable-next-line property-no-deprecated */
201
203
  clip: auto;
202
204
  overflow: visible;
203
205
  white-space: inherit;
@@ -294,12 +296,12 @@ a:visited:focus-visible {
294
296
  pre,
295
297
  blockquote {
296
298
  border: 1px solid #999;
297
- page-break-inside: avoid;
299
+ break-inside: avoid;
298
300
  }
299
301
 
300
302
  tr,
301
303
  img {
302
- page-break-inside: avoid;
304
+ break-inside: avoid;
303
305
  }
304
306
 
305
307
  p,
@@ -311,6 +313,6 @@ a:visited:focus-visible {
311
313
 
312
314
  h2,
313
315
  h3 {
314
- page-break-after: avoid;
316
+ break-after: avoid;
315
317
  }
316
318
  }
@@ -3,4 +3,4 @@ Copyright © 2025 Network Pro Strategies (Network Pro™)
3
3
  SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
4
4
  This file is part of Network Pro.
5
5
  ========================================================================== */
6
- html{-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{margin:.67em 0;font-size:2em}hr{box-sizing:content-box}pre{font-family:monospace;font-size:1em}a{background-color:#0000}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted buttontext}fieldset{padding:.35em .75em .625em}legend{color:inherit;box-sizing:border-box;white-space:normal;max-width:100%;padding:0;display:table}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details{display:block}summary{display:list-item}template{display:none}html{color:#222;scroll-behavior:smooth;font-size:1em;line-height:1.4}::-moz-selection{text-shadow:none;background:#191919}::selection{text-shadow:none;background:#191919}hr{border:0;border-top:1px solid #ccc;height:1px;margin:1em 0;padding:0;display:block;overflow:visible}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}body{color:#fafafa;background-color:#191919;margin:10px;font-family:Arial,Helvetica,sans-serif}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:focus{color:#111;background-color:#ffc627}a:visited,a:visited:hover{color:#cba557}a:visited:focus,a:visited:focus-visible{color:#111!important}.hidden,[hidden]{display:none!important}.visually-hidden{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{clip:auto;width:auto;height:auto;white-space:inherit;margin:0;position:static;overflow:visible}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}@media print{*,:before,:after{color:#000!important;box-shadow:none!important;text-shadow:none!important;background:#fff!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^=\#]:after,a[href^=javascript\:]:after{content:""}pre{white-space:pre-wrap!important}pre,blockquote{page-break-inside:avoid;border:1px solid #999}tr,img{page-break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}}.full-width-section{background-position:50%;background-size:cover;width:100%;max-width:1920px;margin:0 auto}.container{max-width:1200px;margin:0 auto;padding:0 12px}.readable{max-width:900px;margin:0 auto}header,footer{width:100%}header .container,footer .container{max-width:1200px;margin:0 auto;padding:20px 12px}.gh{border-collapse:collapse;border-spacing:0;margin:0 auto}.gh td,.gh th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.gh .gh-tcell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.gh,.gh col{width:auto!important}.gh-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.soc{border-collapse:collapse;border-spacing:0;margin:0 auto}.soc td,.soc th{border-collapse:collapse;word-break:normal;padding:8px;overflow:hidden}.soc .soc-fa{text-align:center;vertical-align:middle}@media screen and (width<=767px){.soc,.soc col{width:auto!important}.soc-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.foss{border-collapse:collapse;border-spacing:0}.foss td,.foss th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.foss .foss-cell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.foss,.foss col{width:auto!important}.foss-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}}.bnav{text-align:center;border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav td,.bnav th{text-align:center;vertical-align:middle;word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav .bnav-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav,.bnav col{width:auto!important}.bnav-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.bnav2{border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav2 td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav2 th{word-break:normal;border-style:none;padding:12px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.bnav2 .bnav2-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav2,.bnav2 col{width:auto!important}.bnav2-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.pgp{border-collapse:collapse;border-spacing:0;margin:0 auto}.pgp td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp th{word-break:normal;border:1px solid #000;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp .pgp-col1{text-align:right;vertical-align:middle;padding-right:1rem}.pgp .pgp-col2{text-align:left;vertical-align:middle;padding-left:1rem}@media screen and (width<=767px){.pgp,.pgp col{width:auto!important}.pgp-wrap{-webkit-overflow-scrolling:touch;margin:2rem 0 auto;overflow-x:auto}}.logo{margin-left:auto;margin-right:auto;display:block}.index-title1{text-align:center;font-style:italic;font-weight:700}.index-title2{letter-spacing:-.015em;text-align:center;font-variant:small-caps;font-size:1.25rem;line-height:1.625rem}.index1{letter-spacing:-.035em;text-align:center;font-style:italic;font-weight:700;line-height:2.125rem}.index2{letter-spacing:-.035em;text-align:center;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.index3{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem}.index4{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem;text-decoration:underline}.subhead{letter-spacing:-.035em;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.bold{font-weight:700}.emphasis{font-style:italic}.uline{text-decoration:underline}.bolditalic{font-style:italic;font-weight:700}.bquote{border-left:3px solid #9e9e9e;margin-left:30px;padding-left:10px;font-style:italic}.small-text{font-size:.75rem;line-height:1.125rem}.large-text-center{text-align:center;font-size:1.25rem;line-height:1.75rem}.prewrap{white-space:pre-wrap;display:block}.hr-styled{width:75%;margin:auto}.center-text{text-align:center}.copyright{text-align:center;font-size:.75rem;line-height:1.125rem}.gold{color:#ffc627}.visited{color:#cba557}.goldseparator{color:#ffc627;margin:0 .5rem}.center-nav{text-align:center;padding:5px;font-size:1rem;line-height:1.5rem}.block{overflow-wrap:break-word;resize:none;white-space:normal;word-break:normal;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-family:monospace;font-size:.875rem;line-height:1.125rem}.fingerprint{white-space:pre-line;font-weight:700;display:block}.pgp-image{width:150px;height:150px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}.emoji{margin-right:8px}.headline{margin-bottom:4px;font-style:italic;font-weight:700;display:block}.label{font-family:inherit;font-weight:700}.description{font-family:inherit;font-style:normal;font-weight:400;display:inline}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pgp-entry{flex-wrap:wrap;align-items:center;gap:2rem;margin-bottom:2rem;display:flex}.pgp-text{flex:2;min-width:250px}.pgp-qr{flex:1;min-width:150px}.obtainium-direct-label{margin:.25rem 0 .75rem;font-weight:700}.obtainium-manual-label{margin-top:.75rem;font-weight:700}.obtainium-img{width:185px;height:55px;margin-bottom:.25rem}.obtainium-margin{margin-left:4px}.obtainium-fa-down{color:#ffc627;margin-left:4px}.obtainium-icon{width:50px;height:50px}.proton-img{width:168px;height:24px}.redirect-text{text-align:center;margin-top:4rem}.redirect-content{text-align:center;margin-top:2rem;font-family:system-ui,sans-serif}.loading-spinner{border:4px solid #ddd;border-top-color:#ffc627;border-radius:50%;width:48px;height:48px;margin:2rem auto;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}
6
+ html{-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{margin:.67em 0;font-size:2em}hr{box-sizing:content-box}pre{font-family:monospace;font-size:1em}a{background-color:#0000}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted buttontext}fieldset{padding:.35em .75em .625em}legend{color:inherit;box-sizing:border-box;white-space:normal;max-width:100%;padding:0;display:table}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details{display:block}summary{display:list-item}template{display:none}html{color:#222;scroll-behavior:smooth;font-size:1em;line-height:1.4}::-moz-selection{text-shadow:none;background:#191919}::selection{text-shadow:none;background:#191919}hr{border:0;border-top:1px solid #ccc;height:1px;margin:1em 0;padding:0;display:block;overflow:visible}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}body{color:#fafafa;background-color:#191919;margin:10px;font-family:Arial,Helvetica,sans-serif}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:focus{color:#111;background-color:#ffc627}a:visited,a:visited:hover{color:#cba557}a:visited:focus,a:visited:focus-visible{color:#111!important}.hidden,[hidden]{display:none!important}.visually-hidden{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{clip:auto;width:auto;height:auto;white-space:inherit;margin:0;position:static;overflow:visible}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}@media print{*,:before,:after{color:#000!important;box-shadow:none!important;text-shadow:none!important;background:#fff!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^=\#]:after,a[href^=javascript\:]:after{content:""}pre{white-space:pre-wrap!important}pre,blockquote{break-inside:avoid;border:1px solid #999}tr,img{break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{break-after:avoid}}.full-width-section{background-position:50%;background-size:cover;width:100%;max-width:1920px;margin:0 auto}.container{max-width:1200px;margin:0 auto;padding:0 12px}.readable{max-width:900px;margin:0 auto}header,footer{width:100%}header .container,footer .container{max-width:1200px;margin:0 auto;padding:20px 12px}.gh{border-collapse:collapse;border-spacing:0;margin:0 auto}.gh td,.gh th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.gh .gh-tcell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.gh,.gh col{width:auto!important}.gh-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.soc{border-collapse:collapse;border-spacing:0;margin:0 auto}.soc td,.soc th{border-collapse:collapse;word-break:normal;padding:8px;overflow:hidden}.soc .soc-fa{text-align:center;vertical-align:middle}@media screen and (width<=767px){.soc,.soc col{width:auto!important}.soc-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.foss{border-collapse:collapse;border-spacing:0}.foss td,.foss th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.foss .foss-cell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.foss,.foss col{width:auto!important}.foss-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}}.bnav{text-align:center;border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav td,.bnav th{text-align:center;vertical-align:middle;word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav .bnav-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav,.bnav col{width:auto!important}.bnav-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.bnav2{border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav2 td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav2 th{word-break:normal;border-style:none;padding:12px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.bnav2 .bnav2-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav2,.bnav2 col{width:auto!important}.bnav2-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.pgp{border-collapse:collapse;border-spacing:0;margin:0 auto}.pgp td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp th{word-break:normal;border:1px solid #000;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp .pgp-col1{text-align:right;vertical-align:middle;padding-right:1rem}.pgp .pgp-col2{text-align:left;vertical-align:middle;padding-left:1rem}@media screen and (width<=767px){.pgp,.pgp col{width:auto!important}.pgp-wrap{-webkit-overflow-scrolling:touch;margin:2rem 0 auto;overflow-x:auto}}.logo{margin-left:auto;margin-right:auto;display:block}.index-title1{text-align:center;font-style:italic;font-weight:700}.index-title2{letter-spacing:-.015em;text-align:center;font-variant:small-caps;font-size:1.25rem;line-height:1.625rem}.index1{letter-spacing:-.035em;text-align:center;font-style:italic;font-weight:700;line-height:2.125rem}.index2{letter-spacing:-.035em;text-align:center;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.index3{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem}.index4{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem;text-decoration:underline}.subhead{letter-spacing:-.035em;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.bold{font-weight:700}.emphasis{font-style:italic}.uline{text-decoration:underline}.bolditalic{font-style:italic;font-weight:700}.bquote{border-left:3px solid #9e9e9e;margin-left:30px;padding-left:10px;font-style:italic}.small-text{font-size:.75rem;line-height:1.125rem}.large-text-center{text-align:center;font-size:1.25rem;line-height:1.75rem}.prewrap{white-space:pre-wrap;display:block}.hr-styled{width:75%;margin:auto}.center-text{text-align:center}.copyright{text-align:center;font-size:.75rem;line-height:1.125rem}.gold{color:#ffc627}.visited{color:#cba557}.goldseparator{color:#ffc627;margin:0 .5rem}.center-nav{text-align:center;padding:5px;font-size:1rem;line-height:1.5rem}.block{overflow-wrap:break-word;resize:none;white-space:normal;word-break:normal;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-family:monospace;font-size:.875rem;line-height:1.125rem}.fingerprint{white-space:pre-line;font-weight:700;display:block}.pgp-image{width:150px;height:150px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}.emoji{margin-right:8px}.headline{margin-bottom:4px;font-style:italic;font-weight:700;display:block}.label{font-family:inherit;font-weight:700}.description{font-family:inherit;font-style:normal;font-weight:400;display:inline}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pgp-entry{flex-wrap:wrap;align-items:center;gap:2rem;margin-bottom:2rem;display:flex}.pgp-text{flex:2;min-width:250px}.pgp-qr{flex:1;min-width:150px}.obtainium-direct-label{margin:.25rem 0 .75rem;font-weight:700}.obtainium-manual-label{margin-top:.75rem;font-weight:700}.obtainium-img{width:185px;height:55px;margin-bottom:.25rem}.obtainium-margin{margin-left:4px}.obtainium-fa-down{color:#ffc627;margin-left:4px}.obtainium-icon{width:50px;height:50px}.proton-img{width:168px;height:24px}.redirect-text{text-align:center;margin-top:4rem}.redirect-content{text-align:center;margin-top:2rem;font-family:system-ui,sans-serif}.loading-spinner{border:4px solid #ddd;border-top-color:#ffc627;border-radius:50%;width:48px;height:48px;margin:2rem auto;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.cc-link{text-decoration:none}.cc-img{vertical-align:text-bottom;margin-left:3px;display:inline-block;height:18px!important}
@@ -45,5 +45,5 @@ This file is part of Network Pro.
45
45
  {#if show && target}
46
46
  <RedirectPage to={target} />
47
47
  {:else}
48
- <p style="text-align: center; margin-top: 4rem;">Preparing to redirect…</p>
48
+ <p class="redirect-text">Preparing to redirect…</p>
49
49
  {/if}
@@ -28,7 +28,7 @@ export async function GET({ params, setHeaders }) {
28
28
  'Content-Type': 'application/pgp-keys',
29
29
  'Content-Disposition': `attachment; filename="${key}"`,
30
30
  });
31
- return new Response(file);
31
+ return new Response(new Uint8Array(file));
32
32
  } catch {
33
33
  return new Response('File not found', { status: 404 });
34
34
  }