@networkpro/web 1.7.0 → 1.7.3

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 (39) hide show
  1. package/LICENSE.md +2 -2
  2. package/README.md +60 -16
  3. package/cspell.json +5 -0
  4. package/netlify-functions/cspReport.js +8 -0
  5. package/package.json +5 -5
  6. package/src/lib/components/foss/FossFeatures.svelte +0 -23
  7. package/src/lib/components/foss/FossItemContent.svelte +1 -2
  8. package/src/lib/pages/AboutContent.svelte +50 -32
  9. package/src/lib/pages/LicenseContent.svelte +18 -22
  10. package/src/lib/pages/TermsConditionsContent.svelte +1 -4
  11. package/src/lib/styles/css/default.css +25 -2
  12. package/src/lib/styles/global.min.css +1 -1
  13. package/static/assets/bin/contact.vcf +13 -0
  14. package/static/assets/bin/linksheet.json +8 -0
  15. package/static/assets/consulting-terms.pdf +0 -0
  16. package/static/assets/license/CC-BY-4.0-rdfa.xml +741 -0
  17. package/static/assets/license/CC-BY-4.0.html +884 -0
  18. package/static/assets/license/CC-BY-4.0.md +367 -0
  19. package/static/assets/license/CC-BY-4.0.txt +156 -0
  20. package/static/assets/license/CC-BY-4.0.xml +25 -0
  21. package/static/assets/license/COPYING-rdfa.xml +1187 -0
  22. package/static/assets/license/COPYING.html +1062 -0
  23. package/static/assets/license/COPYING.md +611 -0
  24. package/static/assets/license/COPYING.odt +0 -0
  25. package/static/assets/license/COPYING.txt +232 -0
  26. package/static/disableSw.js +8 -0
  27. package/static/offline.html +3 -0
  28. package/static/robots.txt +2 -1
  29. package/static/sitemap.xml +40 -4
  30. package/static/styles/brands.min.css +6 -0
  31. package/static/styles/fontawesome.min.css +9 -0
  32. package/static/styles/global.min.css +6 -0
  33. package/static/styles/solid.min.css +6 -0
  34. package/tests/e2e/app.spec.js +40 -16
  35. package/tests/e2e/mobile.spec.js +32 -42
  36. package/tests/e2e/shared/helpers.js +57 -0
  37. /package/{assets/bin/contact@s.neteng.pro.aexpk → static/assets/bin/contact@s.neteng.pro.asc} +0 -0
  38. /package/{assets/bin/github@sl.neteng.cc.aexpk → static/assets/bin/github@sl.neteng.cc.asc} +0 -0
  39. /package/{assets/bin/support@neteng.pro.aexpk → static/assets/bin/support@neteng.pro.asc} +0 -0
package/LICENSE.md CHANGED
@@ -112,7 +112,7 @@ This work is dual-licensed under:
112
112
 
113
113
  ## 7. Creative Commons License (CC BY 4.0)
114
114
 
115
- <sup>Formats: [HTML](https://legal.netwk.pro/html/CC-BY-4.0.html) | [Markdown](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/CC-BY-4.0.md) | [Text](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/CC-BY-4.0.txt) | [RDFa](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/CC-BY-4.0-rdfa.xml) | [XMP](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/CC-BY-4.0.xml)</sup>
115
+ <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
116
 
117
117
  Network Pro&trade; (the "Licensed Material") is licensed under **Creative
118
118
  Commons Attribution 4.0 International** (CC BY 4.0)
@@ -138,7 +138,7 @@ Permissions beyond the scope of this License—or instead of those permitted by
138
138
 
139
139
  ## 8. GNU General Public License (GPL)
140
140
 
141
- <sup>Formats: [HTML](https://legal.netwk.pro/html/COPYING.html) | [Markdown](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/COPYING.md) | [Text](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/COPYING.txt) | [RDFa](https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/COPYING-rdfa.xml) | [ODT](https://github.com/netwk-pro/netwk-pro-legal/raw/refs/heads/master/assets/license/COPYING.odt)</sup>
141
+ <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
142
 
143
143
  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.
144
144
 
package/README.md CHANGED
@@ -31,10 +31,14 @@ All infrastructure and data flows are designed with **maximum transparency, self
31
31
  ```bash
32
32
  .
33
33
  ├── .github/workflows/ # CI workflows and automation
34
- ├── .vscode/ # Recommended VS Code settings, extensions
34
+ ├── .vscode/
35
+ │ ├── customData.json # Custom CSS data for FontAwesome icons
36
+ │ ├── extensions.json # Recommended VSCodium / VS Code extensions
37
+ │ ├── extensions.jsonc # Commented version of extensions.json for reference
38
+ │ └── settings.json # User settings for VSCodium / VS Code
35
39
  ├── netlify-functions/
36
40
  │ └── cspReport.js # Serverless function to receive and log CSP violation reports
37
- ├── scripts/ # Utility scripts
41
+ ├── scripts/ # General utility scripts
38
42
  ├── src/
39
43
  │ ├── lib/ # Reusable components, styles, utilities
40
44
  │ ├── routes/ # SvelteKit routes (+page.svelte, +page.server.js)
@@ -43,13 +47,33 @@ All infrastructure and data flows are designed with **maximum transparency, self
43
47
  │ ├── app.html # SvelteKit entry HTML with CSP/meta/bootentry
44
48
  │ └── service-worker.js # Custom Service Worker
45
49
  ├── static/ # Static assets served at root
50
+ │ ├── manifest.json # Manifest file for PWA configuration
51
+ │ ├── robots.txt # Instructions for web robots
52
+ │ └── sitemap.xml # Sitemap for search engines
46
53
  ├── tests/
47
54
  │ ├── e2e/ # End-to-end Playwright tests
48
55
  │ └── unit/ # Vite unit tests
56
+ ├── _redirects # Netlify redirects
49
57
  ├── netlify.toml # Netlify configuration
50
58
  └── ...
51
59
  ```
52
60
 
61
+ &nbsp;
62
+
63
+ ### E2E Test Structure
64
+
65
+ End-to-end tests are located in `tests/e2e/` and organized by feature or route:
66
+
67
+ ```bash
68
+ tests/
69
+ ├── e2e/
70
+ │ ├── app.spec.js # Desktop and mobile route tests
71
+ │ ├── mobile.spec.js # Mobile-specific assertions
72
+ │ └── shared/
73
+ │ └── helpers.js # Shared test utilities (e.g., getFooter, setDesktopView, setMobileView)
74
+ └── ...
75
+ ```
76
+
53
77
  ---
54
78
 
55
79
  ## 🛠 Getting Started
@@ -180,7 +204,7 @@ Located at `src/hooks.server.js`, this file is responsible for injecting dynamic
180
204
  To re-enable nonce generation for inline scripts in the future:
181
205
 
182
206
  1. Uncomment the nonce generation and injection logic in `hooks.server.js`.
183
- 2. Add `nonce="**cspNonce**"` to inline `<script>` blocks in `app.html` or route templates.
207
+ 2. Add `nonce="__cspNonce__"` to inline `<script>` blocks in `app.html` or route templates.
184
208
 
185
209
  > 💡 The `[headers]` block in `netlify.toml` has been deprecated — all headers are now set dynamically from within SvelteKit.
186
210
 
@@ -202,15 +226,15 @@ Located at `src/hooks.client.ts`, it is automatically used by the SvelteKit runt
202
226
  To receive and inspect CSP violation reports in development or production, the repo includes a Netlify-compatible function at:
203
227
 
204
228
  ```bash
205
- netlify-functions/csp-report.js
229
+ netlify-functions/cspReport.js
206
230
  ```
207
231
 
208
- This function receives reports sent to `/functions/csp-report` and logs them to the console. You can later integrate with logging tools or alerts (e.g., via email, Slack, or SIEM ingestion).
232
+ This function receives reports sent to `/functions/cspReport` and logs them to the console. You can later integrate with logging tools or alerts (e.g., via email, Slack, or SIEM ingestion).
209
233
 
210
234
  Make sure to include the `report-uri` directive in your CSP header:
211
235
 
212
236
  ```bash
213
- Content-Security-Policy: ...; report-uri /.netlify/functions/csp-report;
237
+ Content-Security-Policy: ...; report-uri /.netlify/functions/cspReport;
214
238
  ```
215
239
 
216
240
  &nbsp;
@@ -244,6 +268,24 @@ This project uses a mix of automated performance, accessibility, and end-to-end
244
268
 
245
269
  &nbsp;
246
270
 
271
+ ### E2E Setup
272
+
273
+ Playwright is included in `devDependencies` and installed automatically with:
274
+
275
+ ```bash
276
+ npm install
277
+ ```
278
+
279
+ To install browser dependencies (required once):
280
+
281
+ ```bash
282
+ npx playwright install
283
+ ```
284
+
285
+ > This downloads the browser binaries (Chromium, Firefox, WebKit) used for testing. You only need to run this once per machine or after a fresh clone.
286
+
287
+ &nbsp;
288
+
247
289
  ### Running Tests
248
290
 
249
291
  Local testing via Vitest and Playwright:
@@ -254,9 +296,11 @@ npm run test:server # Run server-side unit tests with Vitest
254
296
  npm run test:all # Run full test suite
255
297
  npm run test:watch # Watch mode for client tests
256
298
  npm run test:coverage # Collect code coverage reports
257
- npm run test:e2e # Runs Playwright E2E tests
299
+ npm run test:e2e # Runs Playwright E2E tests (with one retry on failure)
258
300
  ```
259
301
 
302
+ > Playwright will retry failed tests once `(--retries=1)` to reduce false negatives from transient flakiness (network, render delay, etc.).
303
+
260
304
  Audit your app using Lighthouse:
261
305
 
262
306
  ```bash
@@ -399,15 +443,15 @@ The following CLI commands are available via `npm run <script>` or `pnpm run <sc
399
443
 
400
444
  <!-- markdownlint-enable MD024 -->
401
445
 
402
- | Script | Description |
403
- | --------------- | -------------------------------------------- |
404
- | `test` | Alias for `test:all` |
405
- | `test:all` | Run both client and server test suites |
406
- | `test:client` | Run client tests with Vitest |
407
- | `test:server` | Run server-side tests with Vitest |
408
- | `test:watch` | Watch mode for client tests |
409
- | `test:coverage` | Collect coverage from both client and server |
410
- | `test:e2e` | Run Playwright E2E tests |
446
+ | Script | Description |
447
+ | --------------- | ------------------------------------------------------ |
448
+ | `test` | Alias for `test:all` |
449
+ | `test:all` | Run both client and server test suites |
450
+ | `test:client` | Run client tests with Vitest |
451
+ | `test:server` | Run server-side tests with Vitest |
452
+ | `test:watch` | Watch mode for client tests |
453
+ | `test:coverage` | Collect coverage from both client and server |
454
+ | `test:e2e` | Runs E2E tests with up to 1 automatic retry on failure |
411
455
 
412
456
  ---
413
457
 
package/cspell.json CHANGED
@@ -3,6 +3,7 @@
3
3
  "language": "en",
4
4
  "words": [
5
5
  "acode",
6
+ "anonymization",
6
7
  "autocapture",
7
8
  "autorun",
8
9
  "beforeinstallprompt",
@@ -30,12 +31,16 @@
30
31
  "noreferrer",
31
32
  "nosniff",
32
33
  "nosw",
34
+ "npmjs",
33
35
  "obtainium",
34
36
  "posthog",
35
37
  "SIEM",
38
+ "SPDY",
36
39
  "stylelintignore",
37
40
  "Subsite",
38
41
  "subsites",
42
+ "Supercookie",
43
+ "supercookies",
39
44
  "urlcheck",
40
45
  "vcard",
41
46
  "vite",
@@ -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 cspReport.js
11
+ * @description Sets up a CSP reporting endpoint with email notifications, to be deployed as a Netlify function.
12
+ * @module netlify-functions
13
+ * @author SunDevil311
14
+ * @updated 2025-05-29
15
+ */
16
+
9
17
  import nodemailer from "nodemailer";
10
18
 
11
19
  /**
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "sideEffects": [
5
5
  "./.netlify/shims.js"
6
6
  ],
7
- "version": "1.7.0",
7
+ "version": "1.7.3",
8
8
  "description": "Locking Down Networks, Unlocking Confidence | Security, Networking, Privacy — Network Pro Strategies",
9
9
  "keywords": [
10
10
  "advisory",
@@ -60,7 +60,7 @@
60
60
  "test:server": "vitest --config vitest.config.server.js",
61
61
  "test:watch": "vitest --config vitest.config.client.js --watch",
62
62
  "test:coverage": "npm run test:client -- --run --coverage && npm run test:server -- --run --coverage",
63
- "test:e2e": "npx playwright test",
63
+ "test:e2e": "npx playwright test --retries=1",
64
64
  "lint": "eslint . --ext .mjs,.js,.svelte",
65
65
  "lint:fix": "eslint . --ext .mjs,.js,.svelte --fix",
66
66
  "lint:jsdoc": "eslint . --ext .js,.mjs,.svelte --max-warnings=0",
@@ -80,7 +80,7 @@
80
80
  "nodemailer": "^7.0.3",
81
81
  "posthog-js": "^1.248.1",
82
82
  "semver": "^7.7.2",
83
- "svelte": "5.33.6"
83
+ "svelte": "5.33.10"
84
84
  },
85
85
  "devDependencies": {
86
86
  "@eslint/compat": "^1.2.9",
@@ -106,10 +106,10 @@
106
106
  "markdownlint-cli2": "^0.18.1",
107
107
  "mdsvex": "^0.12.6",
108
108
  "playwright": "^1.52.0",
109
- "postcss": "^8.5.3",
109
+ "postcss": "^8.5.4",
110
110
  "prettier": "^3.5.3",
111
111
  "prettier-plugin-svelte": "^3.4.0",
112
- "stylelint": "^16.19.1",
112
+ "stylelint": "^16.20.0",
113
113
  "stylelint-config-html": "^1.1.0",
114
114
  "stylelint-config-recommended": "^16.0.0",
115
115
  "stylelint-order": "^7.0.0",
@@ -52,27 +52,4 @@ This file is part of Network Pro.
52
52
  font-weight: 600;
53
53
  margin-bottom: 0.5em;
54
54
  }
55
-
56
- .emoji {
57
- margin-right: 8px;
58
- }
59
-
60
- .headline {
61
- display: block; /* Ensure it is on its own line */
62
- font-weight: bold; /* Keep the first item bold */
63
- font-style: italic; /* Only make the first item italic */
64
- margin-bottom: 4px; /* Add space between headline and the rest */
65
- }
66
-
67
- .label {
68
- font-weight: bold; /* Keep the label bold */
69
- font-family: inherit; /* Ensure it uses the same font-family as normal text */
70
- }
71
-
72
- .description {
73
- display: inline; /* Keep description inline */
74
- font-weight: normal; /* Ensure the description is normal (not bold) */
75
- font-family: inherit; /* Ensure it uses the same font-family as normal text */
76
- font-style: normal; /* Remove italic for the description */
77
- }
78
55
  </style>
@@ -126,8 +126,7 @@ This file is part of Network Pro.
126
126
  ><i class="fas fa-file-arrow-down" style="margin-left: 8px;"></i
127
127
  ></span>
128
128
  <a
129
- {rel}
130
- href="https://raw.githubusercontent.com/netwk-pro/dev-sveltekit/refs/heads/master/assets/bin/linksheet.json"
129
+ href="/assets/bin/linksheet.json"
131
130
  download
132
131
  type="application/json"
133
132
  style="margin-left: 8px;"
@@ -76,26 +76,30 @@ This file is part of Network Pro.
76
76
  label: "support@neteng.pro",
77
77
  qrSrc: pgpSupport,
78
78
  keySearch: "https://keys.openpgp.org/search?q=support%40neteng.pro",
79
- fingerprint: ["6590b992e2e3eff12738", "7bce2af093e9dec61ba0"],
79
+ fingerprint: ["6590B992E2E3EFF12738", "7BCE2AF093E9DEC61BA0"],
80
80
  },
81
81
  {
82
82
  label: "contact@s.neteng.pro",
83
83
  qrSrc: pgpContact,
84
84
  keySearch: "https://keys.openpgp.org/search?q=contact%40s.neteng.pro",
85
- fingerprint: ["df118baa6c2d9dcdebdc", "2ddcf99373499495f957"],
85
+ fingerprint: ["DF118BAA6C2D9DCDEBDC", "2DDCF99373499495F957"],
86
86
  },
87
87
  ];
88
88
 
89
89
  /**
90
- * vCard information for contact details
91
- * @type {{
92
- * qrSrc: string,
93
- * vcf: string
94
- * }}
90
+ * @typedef {Object} ContactAssets
91
+ * @property {string} vcf - Path to the contact vCard (.vcf file)
92
+ * @property {string} qrSrc - Path to QR image for contact info
93
+ * @property {string} supportAsc - Support PGP public key file (.asc)
94
+ * @property {string} contactAsc - Contact PGP public key file (.asc)
95
95
  */
96
- const vCard = {
96
+
97
+ /** @type {ContactAssets} */
98
+ const contactAssets = {
99
+ vcf: "/assets/bin/contact.vcf",
97
100
  qrSrc: vcfSrc,
98
- vcf: "https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/bin/contact.vcf",
101
+ supportAsc: "/assets/bin/support@neteng.pro.asc",
102
+ contactAsc: "/assets/bin/contact@s.neteng.pro.asc",
99
103
  };
100
104
  </script>
101
105
 
@@ -192,7 +196,7 @@ This file is part of Network Pro.
192
196
  <div class="spacer"></div>
193
197
 
194
198
  <p>
195
- <a {rel} href="https://netwk.pro/contact" target="_blank">Let's connect</a>
199
+ <a href="https://netwk.pro/contact" target="_self">Let's connect</a>
196
200
  to discuss how we can help secure and strengthen your business today.
197
201
  </p>
198
202
 
@@ -222,17 +226,25 @@ This file is part of Network Pro.
222
226
  alt={`PGP Key - ${pgpKeys[0].label}`} />
223
227
  </td>
224
228
  <td class="pgp-col2">
225
- <a
226
- {rel}
227
- href={pgpKeys[0].keySearch}
228
- download
229
- type="application/pgp-keys"
230
- target={tgtBlank}>
229
+ <a {rel} href={pgpKeys[0].keySearch} target={tgtBlank}>
231
230
  <strong>{pgpKeys[0].label}</strong>
232
231
  </a>
233
- <p>Fingerprint:</p>
234
- <p class="fingerprint">
235
- {pgpKeys[0].fingerprint.join("\n")}
232
+ <p
233
+ ><strong
234
+ ><a
235
+ href={contactAssets.supportAsc}
236
+ type="application/pgp-keys"
237
+ download
238
+ target={tgtBlank}
239
+ >asc
240
+ <span class="fas fa-file-arrow-down"></span></a
241
+ ></strong>
242
+ </p>
243
+ <p
244
+ >Fingerprint:<br />
245
+ <span class="fingerprint">
246
+ {pgpKeys[0].fingerprint.join("\n")}
247
+ </span>
236
248
  </p>
237
249
  </td>
238
250
  </tr>
@@ -240,17 +252,24 @@ This file is part of Network Pro.
240
252
  <!-- Row 1 (Second row) has its columns swapped -->
241
253
  <tr>
242
254
  <td class="pgp-col1">
243
- <a
244
- {rel}
245
- href={pgpKeys[1].keySearch}
246
- download
247
- type="application/pgp-keys"
248
- target={tgtBlank}>
255
+ <a {rel} href={pgpKeys[1].keySearch} target={tgtBlank}>
249
256
  <strong>{pgpKeys[1].label}</strong>
250
257
  </a>
251
- <p>Fingerprint:</p>
252
- <p class="fingerprint">
253
- {pgpKeys[1].fingerprint.join("\n")}
258
+ <p>
259
+ <strong
260
+ ><a
261
+ href={contactAssets.contactAsc}
262
+ type="application/pgp-keys"
263
+ download
264
+ target={tgtBlank}
265
+ >asc <span class="fas fa-file-arrow-down"></span></a
266
+ ></strong>
267
+ </p>
268
+ <p
269
+ >Fingerprint:<br />
270
+ <span class="fingerprint">
271
+ {pgpKeys[1].fingerprint.join("\n")}
272
+ </span>
254
273
  </p>
255
274
  </td>
256
275
  <td class="pgp-col2">
@@ -269,7 +288,7 @@ This file is part of Network Pro.
269
288
  <img
270
289
  {decoding}
271
290
  {loading}
272
- src={vCard.qrSrc}
291
+ src={contactAssets.qrSrc}
273
292
  class="pgp-image"
274
293
  alt="vCard" />
275
294
  </td>
@@ -277,10 +296,9 @@ This file is part of Network Pro.
277
296
  <strong>vCard</strong>
278
297
  <p>
279
298
  <a
280
- {rel}
281
- href={vCard.vcf}
282
- download
299
+ href={contactAssets.vcf}
283
300
  type="text/vcard"
301
+ download
284
302
  target={tgtBlank}>
285
303
  <strong>vcf</strong>
286
304
  </a>
@@ -220,30 +220,28 @@ This file is part of Network Pro.
220
220
  <p class={constants.classSmall}>
221
221
  Formats:
222
222
  <a
223
- rel={constants.rel}
224
- href="https://legal.netwk.pro/html/CC-BY-4.0.html"
225
- target={constants.targetSelf}>HTML</a>
223
+ href="/assets/license/CC-BY-4.0.html"
224
+ download
225
+ target={constants.targetBlank}>HTML</a>
226
226
  |
227
227
  <a
228
- rel={constants.rel}
229
- href="https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/CC-BY-4.0.md"
228
+ href="/assets/license/CC-BY-4.0.md"
229
+ download
230
230
  target={constants.targetBlank}>Markdown</a>
231
231
  |
232
232
  <a
233
- rel={constants.rel}
234
- href="https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/CC-BY-4.0.txt"
233
+ href="/assets/license/CC-BY-4.0.txt"
234
+ download
235
235
  target={constants.targetBlank}>Text</a>
236
236
  |
237
237
  <a
238
- rel={constants.rel}
238
+ href="/assets/license/CC-BY-4.0-rdfa.xml"
239
239
  download
240
- href="https://raw.githubusercontent.com/netwk-pro/netwk-pro-legal/refs/heads/master/assets/license/CC-BY-4.0-rdfa.xml"
241
240
  target={constants.targetBlank}>RDFa</a>
242
241
  |
243
242
  <a
244
- rel={constants.rel}
243
+ href="/assets/license/CC-BY-4.0.xml"
245
244
  download
246
- href="https://raw.githubusercontent.com/netwk-pro/netwk-pro-legal/refs/heads/master/assets/license/CC-BY-4.0.xml"
247
245
  target={constants.targetBlank}>XMP</a>
248
246
  </p>
249
247
 
@@ -325,30 +323,28 @@ This file is part of Network Pro.
325
323
  <p class={constants.classSmall}>
326
324
  Formats:
327
325
  <a
328
- rel={constants.rel}
329
- href="https://legal.netwk.pro/html/COPYING.html"
330
- target={constants.targetSelf}>HTML</a>
326
+ href="/assets/license/COPYING.html"
327
+ download
328
+ target={constants.targetBlank}>HTML</a>
331
329
  |
332
330
  <a
333
- rel={constants.rel}
334
- href="https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/COPYING.md"
331
+ href="/assets/license/COPYING.md"
332
+ download
335
333
  target={constants.targetBlank}>Markdown</a>
336
334
  |
337
335
  <a
338
- rel={constants.rel}
339
- href="https://github.com/netwk-pro/netwk-pro-legal/blob/master/assets/license/COPYING.txt"
336
+ href="/assets/license/COPYING.txt"
337
+ download
340
338
  target={constants.targetBlank}>Text</a>
341
339
  |
342
340
  <a
343
- rel={constants.rel}
341
+ href="/assets/license/COPYING-rdfa.xml"
344
342
  download
345
- href="https://raw.githubusercontent.com/netwk-pro/netwk-pro-legal/refs/heads/master/assets/license/COPYING-rdfa.xml"
346
343
  target={constants.targetBlank}>RDFa</a>
347
344
  |
348
345
  <a
349
- rel={constants.rel}
346
+ href="/assets/license/COPYING.odt"
350
347
  download
351
- href="https://raw.githubusercontent.com/netwk-pro/netwk-pro-legal/refs/heads/master/assets/license/COPYING.odt"
352
348
  target={constants.targetBlank}>ODT</a>
353
349
  </p>
354
350
 
@@ -114,10 +114,7 @@ This file is part of Network Pro.
114
114
  |
115
115
  <a href={tandcLink} target={constants.targetSelf}>Docs</a>
116
116
  |
117
- <a
118
- rel={constants.rel}
119
- href="https://raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets/consulting-terms.pdf"
120
- target={constants.targetBlank}>
117
+ <a href="/assets/consulting-terms.pdf" target={constants.targetBlank}>
121
118
  PDF <span class="fas fa-file-arrow-down"></span>
122
119
  </a>
123
120
  </sup>
@@ -463,8 +463,8 @@ footer .container {
463
463
  }
464
464
 
465
465
  .pgp-image {
466
- width: 125px;
467
- height: 125px;
466
+ width: 150px;
467
+ height: 150px;
468
468
  }
469
469
 
470
470
  .spacer {
@@ -474,3 +474,26 @@ footer .container {
474
474
  .separator {
475
475
  margin: 0 0.5rem;
476
476
  }
477
+
478
+ .emoji {
479
+ margin-right: 8px;
480
+ }
481
+
482
+ .headline {
483
+ display: block; /* Ensure it is on its own line */
484
+ font-weight: bold; /* Keep the first item bold */
485
+ font-style: italic; /* Only make the first item italic */
486
+ margin-bottom: 4px; /* Add space between headline and the rest */
487
+ }
488
+
489
+ .label {
490
+ font-weight: bold; /* Keep the label bold */
491
+ font-family: inherit; /* Ensure it uses the same font-family as normal text */
492
+ }
493
+
494
+ .description {
495
+ display: inline; /* Keep description inline */
496
+ font-weight: normal; /* Ensure the description is normal (not bold) */
497
+ font-family: inherit; /* Ensure it uses the same font-family as normal text */
498
+ font-style: normal; /* Remove italic for the description */
499
+ }
@@ -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:#191919;background-color:#ffc627}a:visited,a:visited:hover{color:#7f6227}.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}.visited{color:#7f6227}.center-nav{text-align:center;padding:5px;font-size:.875rem;line-height:1.125rem}.block{resize:none;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-size:.75rem;line-height:1.125rem}.fingerprint{white-space:pre-line;font-weight:700;display:block}.pgp-image{width:125px;height:125px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}
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:#191919;background-color:#ffc627}a:visited,a:visited:hover{color:#7f6227}.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}.visited{color:#7f6227}.center-nav{text-align:center;padding:5px;font-size:.875rem;line-height:1.125rem}.block{resize:none;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-size:.75rem;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}
@@ -0,0 +1,13 @@
1
+ BEGIN:VCARD
2
+ VERSION:3.0
3
+ FN:Scott Lopez
4
+ N:Lopez;Scott
5
+ TEL;TYPE=WORK,PREF=1:(623) 252-4350
6
+ EMAIL;TYPE=HOME:github@sl.neteng.cc
7
+ EMAIL;TYPE=WORK:support@neteng.pro
8
+ EMAIL;TYPE=Secure:business@s.neteng.pro
9
+ ADR;TYPE=WORK:;;Peoria\, AZ 85382\nUS
10
+ ORG:Network Pro Strategies
11
+ TITLE:Security Consultant
12
+ URL:https://netwk.pro
13
+ END:VCARD
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "fe.linksheet.nightly",
3
+ "url": "https://github.com/LinkSheet/nightly",
4
+ "author": "1fexd",
5
+ "name": "LinkSheet Nightly",
6
+ "preferredApkIndex": 0,
7
+ "additionalSettings": "{\"includePrereleases\":true,\"fallbackToOlderReleases\":true,\"filterReleaseTitlesByRegEx\":\"\",\"filterReleaseNotesByRegEx\":\"\",\"verifyLatestTag\":false,\"dontSortReleasesList\":false,\"useLatestAssetDateAsReleaseDate\":false,\"trackOnly\":false,\"versionExtractionRegEx\":\"\",\"matchGroupToUse\":\"\",\"versionDetection\":false,\"releaseDateAsVersion\":false,\"useVersionCodeAsOSVersion\":false,\"apkFilterRegEx\":\"LinkSheet.Nightly\",\"invertAPKFilter\":true,\"autoApkFilterByArch\":true,\"appName\":\"LinkSheet Nightly\",\"shizukuPretendToBeGooglePlay\":false,\"exemptFromBackgroundUpdates\":false,\"skipUpdateNotifications\":false,\"about\":\"Restore link control on Android 12+\",\"appAuthor\":\"1fexd\"}"
8
+ }