@networkpro/web 1.11.0 → 1.12.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.
package/CHANGELOG.md ADDED
@@ -0,0 +1,79 @@
1
+ # Changelog
2
+
3
+ <!-- markdownlint-disable MD024 -->
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ This project attempts to follow [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), though versioning and formatting may vary.
8
+
9
+ ---
10
+
11
+ ## [Unreleased]
12
+
13
+ ---
14
+
15
+ ## [1.12.3] - 2025-06-04
16
+
17
+ ### Added
18
+
19
+ - `static/docs/pgp.md`, `pgp-win.md`, and `pgp-email.md` added for reference.
20
+ These files have been temporarily stored until they can be migrated to the wiki.
21
+
22
+ ### Changed
23
+
24
+ - Added the new Markdown files in `static/docs` to the `service-worker.js` cache ignore list.
25
+
26
+ ---
27
+
28
+ ## [1.12.2] – 2025-06-04
29
+
30
+ ### Changed
31
+
32
+ - `LicenseContent` component updated to reflect the correct "Effective Date."
33
+
34
+ ---
35
+
36
+ ## [1.12.1] – 2025-06-04
37
+
38
+ ### Added
39
+
40
+ - Standardized issue templates and contact links in `.github/ISSUE_TEMPLATE/config.yml` for consistent triage experience across repositories.
41
+ - Shared health files (`SUPPORT.md`, `CONTRIBUTING.md`, `SECURITY.md`) retained in `.github` for fallback visibility.
42
+ - Centralized issue submission and triage via main repository (`netwk-pro.github.io`) for all public projects.
43
+
44
+ ### Changed
45
+
46
+ - Updated `.github` structure to delegate issue creation to the main repository only, simplifying user flow and internal tracking.
47
+ - Reorganized public repositories to override the default `.github` issue config selectively as needed.
48
+
49
+ ### Removed
50
+
51
+ - Removed unused local issue templates from `.github` to prevent template duplication in dependent repositories.
52
+
53
+ ---
54
+
55
+ ## [1.12.0] – 2025-06-04
56
+
57
+ ### Added
58
+
59
+ - Initial scaffolding for tracking preferences store using SvelteKit writable stores.
60
+ - `PrivacyDashboard` and `PrivacyContent` components updated to bind to the reactive tracking store.
61
+ - Derived store for automatic re-consent prompts (`remindUserToReconsent`).
62
+ - Consent cookie logic added for first-time and returning users.
63
+ - First iteration of PostHog integration.
64
+ - `sr-only` utility class added to `global.min.css` for accessibility improvements.
65
+ - Support disclaimer added to Legal, Copyright,
66
+ and Licensing section.
67
+ - Privacy dashboard UI elements and opt-in interface.
68
+
69
+ ### Changed
70
+
71
+ - Migrated tracking preference logic from `utils/privacy.js` and `utils/trackingCookies.js` to a store-based architecture.
72
+ - Updated `posthog.js` to consume new `trackingPreferences` store.
73
+ - Improved inline documentation for Netlify `adapter-edge` settings.
74
+
75
+ ### Removed
76
+
77
+ - Deprecated `shouldTrackUser()` logic and legacy cookie checks.
78
+
79
+ ---
@@ -0,0 +1,63 @@
1
+ # Changelog
2
+
3
+ <!-- markdownlint-disable -->
4
+
5
+ All notable changes to this project will be documented in this file.
6
+
7
+ This project adheres to [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and uses [Semantic Versioning](https://semver.org/).
8
+
9
+ ---
10
+
11
+ ## [Unreleased]
12
+
13
+ ### Added
14
+
15
+ - _(Describe new features or significant additions)_
16
+
17
+ ### Changed
18
+
19
+ - _(Describe updates or breaking changes to existing behavior)_
20
+
21
+ ### Deprecated
22
+
23
+ - _(Note anything slated for removal in the future)_
24
+
25
+ ### Removed
26
+
27
+ - _(List features, APIs, or code that has been removed)_
28
+
29
+ ### Fixed
30
+
31
+ - _(Detail bug fixes or patches)_
32
+
33
+ ### Security
34
+
35
+ - _(Note any vulnerabilities addressed)_
36
+
37
+ ---
38
+
39
+ ## [x.y.z] – YYYY-MM-DD
40
+
41
+ ### Added
42
+
43
+ - ...
44
+
45
+ ### Changed
46
+
47
+ - ...
48
+
49
+ ### Deprecated
50
+
51
+ - ...
52
+
53
+ ### Removed
54
+
55
+ - ...
56
+
57
+ ### Fixed
58
+
59
+ - ...
60
+
61
+ ### Security
62
+
63
+ - ...
package/LICENSE.md CHANGED
@@ -38,9 +38,10 @@ This document is provided for convenience only. In the event of any discrepancy,
38
38
  9. [Third-Party Code and Licenses](#third-party)
39
39
  10. [Prohibited Uses](#prohibited-uses)
40
40
  11. [Modifications and Liability Disclaimer](#disclaimer)
41
- 12. [Authoritative Version Clause](#version)
42
- 13. [Revisions](#revisions)
43
- 14. [Contact](#contact)
41
+ 12. [Support Disclaimer](#support)
42
+ 13. [Authoritative Version Clause](#version)
43
+ 14. [Revisions](#revisions)
44
+ 15. [Contact](#contact)
44
45
 
45
46
  ---
46
47
 
@@ -192,9 +193,19 @@ Modifications, redistribution, or any use of the Licensed Material are performed
192
193
 
193
194
  <sub>[Back to top](#top)</sub>
194
195
 
196
+ <a name="support"></a>
197
+
198
+ ## 12. Support Disclaimer
199
+
200
+ All support provided—whether through email, GitHub, community forums, or other channels—is offered “as-is” and **does not constitute any warranty, express or implied**. The Company, its affiliates, owners, operators, and contributors make no guarantees regarding response time, resolution, availability, or fitness for any particular purpose.
201
+
202
+ Bug fixes, security patches, or other support actions—whether provided voluntarily or in response to reported issues—do not imply any ongoing obligation, representation of completeness, or the creation of a warranty. All assistance is provided at the sole discretion of the Company and may be modified, reduced, or discontinued at any time without notice.
203
+
204
+ <sub>[Back to top](#top)</sub>
205
+
195
206
  <a name="version"></a>
196
207
 
197
- ## 12. Authoritative Version Clause
208
+ ## 13. Authoritative Version Clause
198
209
 
199
210
  In the event of any discrepancy between different versions, formats, or distributions of any legal document issued by the Company&mdash;including but not limited to license terms, policies, notices, or agreements&mdash;the version published on the Company's primary website at [https://netwk.pro](https://netwk.pro) shall be deemed the official and controlling version.
200
211
 
@@ -204,7 +215,7 @@ It is your responsibility to review the most current version of any applicable l
204
215
 
205
216
  <a name="revisions"></a>
206
217
 
207
- ## 13. Revisions
218
+ ## 14. Revisions
208
219
 
209
220
  This legal page may be updated to comply with legal or operational changes. The current effective date is listed at the top of this document.
210
221
 
@@ -214,8 +225,8 @@ This legal page may be updated to comply with legal or operational changes. The
214
225
 
215
226
  ## 14. Contact
216
227
 
217
- The Company may be contacted via our [contact form](https://netwk.pro/contact) or by email at:
218
- 📧 `contact (at) s.neteng.pro`
228
+ The Company may be contacted via our [Contact Form](https://netwk.pro/contact) or by email at:
229
+ 📧 `support (at) neteng.pro`
219
230
 
220
231
  <sub>[Back to top](#top)</sub>
221
232
 
@@ -235,7 +246,7 @@ The Company may be contacted via our [contact form](https://netwk.pro/contact) o
235
246
  Copyright &copy; 2025
236
247
  **[Network Pro Strategies](https://netwk.pro/)** (Network Pro&trade;)
237
248
 
238
- Network Pro&trade;, the shield logo, and the "Locking Down Networks&trade;" slogan are [trademarks](#trademark) of Network Pro Strategies.
249
+ Network Pro&trade;, the shield logo, and the "Locking Down Networks...&trade;" slogan are [trademarks](#trademark) of Network Pro Strategies.
239
250
 
240
251
  Licensed under **[CC BY 4.0](#cc-by)** and the **[GNU GPL](#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.
241
252
 
package/cspell.json CHANGED
@@ -8,6 +8,7 @@
8
8
  "autorun",
9
9
  "BACKTOP",
10
10
  "beforeinstallprompt",
11
+ "Betterbird",
11
12
  "bootentry",
12
13
  "ccby",
13
14
  "CCPA",
@@ -22,12 +23,17 @@
22
23
  "homescreen",
23
24
  "HREFTOP",
24
25
  "Izzy",
26
+ "Keybase",
27
+ "keypair",
28
+ "keyserver",
29
+ "Kleopatra",
25
30
  "lhci",
26
31
  "lifecycles",
27
32
  "lighthouseci",
28
33
  "lighthouserc",
29
34
  "lightningcss",
30
35
  "linksheet",
36
+ "Mailvelope",
31
37
  "Maricopa",
32
38
  "mdsvex",
33
39
  "navigations",
@@ -43,8 +49,10 @@
43
49
  "npmjs",
44
50
  "ntfy",
45
51
  "obtainium",
52
+ "openpgp",
46
53
  "posthog",
47
54
  "prefs",
55
+ "publickey",
48
56
  "reconsent",
49
57
  "SIEM",
50
58
  "SPDY",
@@ -59,7 +67,8 @@
59
67
  "vcard",
60
68
  "vite",
61
69
  "vitest",
62
- "webfonts"
70
+ "webfonts",
71
+ "Webmail"
63
72
  ],
64
73
  "ignorePaths": [
65
74
  ".gitignore",
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@networkpro/web",
3
3
  "private": false,
4
- "version": "1.11.0",
4
+ "version": "1.12.3",
5
5
  "description": "Locking Down Networks, Unlocking Confidence | Security, Networking, Privacy — Network Pro Strategies",
6
6
  "keywords": [
7
7
  "advisory",
@@ -77,7 +77,7 @@
77
77
  },
78
78
  "dependencies": {
79
79
  "dompurify": "^3.2.6",
80
- "posthog-js": "^1.249.2",
80
+ "posthog-js": "^1.249.3",
81
81
  "semver": "^7.7.2",
82
82
  "svelte": "5.33.14"
83
83
  },
@@ -18,7 +18,7 @@ This file is part of Network Pro.
18
18
 
19
19
  console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
20
20
 
21
- const { COMPANY_INFO, CONTACT, PAGE, NAV } = CONSTANTS;
21
+ const { COMPANY_INFO, CONTACT, PAGE, LINKS, NAV } = CONSTANTS;
22
22
 
23
23
  /**
24
24
  * URLs using the base path
@@ -56,6 +56,7 @@ This file is part of Network Pro.
56
56
  { id: "third-party", text: "Third-Party Code and Licenses" },
57
57
  { id: "prohibited-uses", text: "Prohibited Uses" },
58
58
  { id: "disclaimer", text: "Modifications and Liability Disclaimer" },
59
+ { id: "support", text: "Support Disclaimer" },
59
60
  { id: "authoritative", text: "Authoritative Version Clause" },
60
61
  { id: "revisions", text: "Revisions" },
61
62
  { id: "contact", text: "Contact" },
@@ -66,7 +67,7 @@ This file is part of Network Pro.
66
67
  * @type {{ effectiveDate: string, classSmall: string }}
67
68
  */
68
69
  const constants = {
69
- effectiveDate: "May 28, 2025",
70
+ effectiveDate: "June 4, 2025",
70
71
  classSmall: "small-text",
71
72
  };
72
73
  </script>
@@ -447,6 +448,24 @@ This file is part of Network Pro.
447
448
  —including, without limitation, any claims or disputes brought by third parties,
448
449
  whether in contract, tort, or otherwise.
449
450
  </p>
451
+ {:else if link.id === "support"}
452
+ <p>
453
+ All support provided—whether through email, GitHub, community forums, or
454
+ other channels—is offered “as-is” and <strong
455
+ >does not constitute any warranty, express or implied</strong
456
+ >. The Company, its affiliates, owners, operators, and contributors make
457
+ no guarantees regarding response time, resolution, availability, or
458
+ fitness for any particular purpose.
459
+ </p>
460
+
461
+ <p>
462
+ Bug fixes, security patches, or other support actions—whether provided
463
+ voluntarily or in response to reported issues—do not imply any ongoing
464
+ obligation, representation of completeness, or the creation of a
465
+ warranty. All assistance is provided at the sole discretion of the
466
+ Company and may be modified, reduced, or discontinued at any time
467
+ without notice.
468
+ </p>
450
469
  {:else if link.id === "authoritative"}
451
470
  <p>
452
471
  In the event of any discrepancy between different versions, formats, or
@@ -455,7 +474,7 @@ This file is part of Network Pro.
455
474
  version published on the Company's primary website at <a
456
475
  rel={PAGE.REL}
457
476
  href={homeLink}
458
- target={PAGE.SELF}>https://netwk.pro</a>
477
+ target={PAGE.SELF}>{LINKS.HOME}</a>
459
478
  shall be deemed the official and controlling version.
460
479
  </p>
461
480
 
@@ -9,28 +9,15 @@ This file is part of Network Pro.
9
9
  <script>
10
10
  import { base } from "$app/paths";
11
11
  import { onMount } from "svelte";
12
- import { trackingStatus } from "$lib/stores/trackingStatus.js";
13
12
  import {
14
- /** @type {(type: 'enable' | 'disable') => void} */
15
- setTrackingPreference,
16
- /** @type {() => void} */
17
- clearTrackingPreferences,
18
- } from "$lib/utils/trackingCookies.js";
13
+ trackingPreferences,
14
+ setOptIn,
15
+ setOptOut,
16
+ clearPrefs,
17
+ } from "$lib/stores/trackingPreferences.js";
19
18
  import { CONSTANTS } from "$lib";
20
19
 
21
- console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
22
-
23
- /** @type {typeof CONSTANTS.COMPANY_INFO} */
24
- const COMPANY_INFO = CONSTANTS.COMPANY_INFO;
25
-
26
- /** @type {typeof CONSTANTS.CONTACT} */
27
- const CONTACT = CONSTANTS.CONTACT;
28
-
29
- /** @type {typeof CONSTANTS.PAGE} */
30
- const PAGE = CONSTANTS.PAGE;
31
-
32
- /** @type {typeof CONSTANTS.NAV} */
33
- const NAV = CONSTANTS.NAV;
20
+ const { COMPANY_INFO, CONTACT, PAGE, NAV } = CONSTANTS;
34
21
 
35
22
  /** @type {string} */
36
23
  const prightsLink = `${base}/privacy-rights`;
@@ -47,7 +34,10 @@ This file is part of Network Pro.
47
34
  /** @type {string} */
48
35
  const gpcLink = "https://globalprivacycontrol.org/";
49
36
 
50
- /** @type {{ id: string, text: string }[]} */
37
+ /**
38
+ * Table of Contents sections and their headings.
39
+ * @type {{ id: string, text: string }[]}
40
+ */
51
41
  const tocLinks = [
52
42
  { id: "intro", text: "Introduction" },
53
43
  { id: "collect", text: "Information We Collect" },
@@ -70,70 +60,48 @@ This file is part of Network Pro.
70
60
  const classSmall = "small-text";
71
61
 
72
62
  /** @type {boolean} */
73
- let optedOut = false;
63
+ let optedOut;
74
64
 
75
65
  /** @type {boolean} */
76
- let optedIn = false;
66
+ let optedIn;
77
67
 
78
- /**
79
- * Refreshes tracking preferences state and updates the reactive store.
80
- * This function uses dynamic import to avoid SSR evaluation of browser-only code.
81
- *
82
- * @returns {Promise<void>}
83
- */
84
- async function refreshTrackingStatus() {
85
- /** @type {typeof import("$lib/utils/trackingStatus.js")} */
86
- const tracking = await import("$lib/utils/trackingStatus.js");
87
-
88
- const prefs = tracking.getTrackingPreferences();
89
- optedOut = prefs.optedOut;
90
- optedIn = prefs.optedIn;
91
- trackingStatus.set(prefs.status);
92
- }
68
+ /** @type {string} */
69
+ let trackingStatus;
93
70
 
94
- /**
95
- * Runs tracking preference detection on client mount.
96
- */
97
- onMount(() => {
98
- refreshTrackingStatus();
99
- console.log("[Tracking] Status:", $trackingStatus);
100
- });
71
+ // Reactive assignments from the store
72
+ $: ({ optedOut, optedIn, status: trackingStatus } = $trackingPreferences);
101
73
 
102
74
  /**
103
- * Toggles user tracking opt-out setting and updates cookies + store.
104
- *
105
- * @param {boolean} value - Whether the user is opting out
106
- * @returns {void}
75
+ * Toggle tracking opt-out setting.
76
+ * @param {boolean} value
107
77
  */
108
78
  function toggleTracking(value) {
109
- optedOut = value;
110
- if (optedOut) {
79
+ if (value) {
111
80
  console.log("[Tracking] User opted out");
112
- setTrackingPreference("disable");
81
+ setOptOut();
113
82
  } else {
114
83
  console.log("[Tracking] User cleared opt-out");
115
- clearTrackingPreferences();
84
+ clearPrefs();
116
85
  }
117
- refreshTrackingStatus();
118
86
  }
119
87
 
120
88
  /**
121
- * Toggles user tracking opt-in setting and updates cookies + store.
122
- *
123
- * @param {boolean} value - Whether the user is opting in
124
- * @returns {void}
89
+ * Toggle tracking opt-in setting.
90
+ * @param {boolean} value
125
91
  */
126
92
  function toggleOptIn(value) {
127
- optedIn = value;
128
- if (optedIn) {
93
+ if (value) {
129
94
  console.log("[Tracking] User opted in");
130
- setTrackingPreference("enable");
95
+ setOptIn();
131
96
  } else {
132
97
  console.log("[Tracking] User cleared opt-in");
133
- clearTrackingPreferences();
98
+ clearPrefs();
134
99
  }
135
- refreshTrackingStatus();
136
100
  }
101
+
102
+ onMount(() => {
103
+ console.log("[Tracking] Store initialized:", $trackingPreferences.status);
104
+ });
137
105
  </script>
138
106
 
139
107
  <!-- BEGIN TITLE -->
@@ -267,45 +235,51 @@ This file is part of Network Pro.
267
235
  <div class="spacer"></div>
268
236
 
269
237
  <h3>Tracking Preferences</h3>
270
- {#if $trackingStatus !== "⏳ Checking tracking preferences..."}
238
+
239
+ {#if trackingStatus && trackingStatus !== "⏳ Checking tracking preferences..."}
271
240
  <p id="tracking-status" aria-live="polite">
272
241
  <strong>Tracking Status:</strong>
273
- {$trackingStatus}
242
+ {trackingStatus}
274
243
  </p>
275
244
  {:else}
276
245
  <p id="tracking-status" aria-live="polite">
277
- <strong>Tracking Status:</strong>
278
- <em>Loading…</em>
246
+ <strong>Tracking Status:</strong> <em>Loading…</em>
279
247
  </p>
280
248
  {/if}
281
249
 
282
- <!-- Opt-out checkbox -->
283
- <label>
284
- <input
285
- type="checkbox"
286
- checked={optedOut}
287
- disabled={optedIn}
288
- aria-describedby="tracking-status"
289
- on:change={(e) =>
290
- toggleTracking(
291
- /** @type {HTMLInputElement} */ (e.target).checked,
292
- )} />
293
- <strong>&nbsp;Disable analytics tracking (opt-out)</strong>
294
- </label>
295
-
296
- <br />
297
-
298
- <!-- Opt-in checkbox -->
299
- <label>
300
- <input
301
- type="checkbox"
302
- checked={optedIn}
303
- disabled={optedOut}
304
- aria-describedby="tracking-status"
305
- on:change={(e) =>
306
- toggleOptIn(/** @type {HTMLInputElement} */ (e.target).checked)} />
307
- <strong>&nbsp;Enable analytics tracking (opt-in)</strong>
308
- </label>
250
+ <fieldset>
251
+ <legend class="sr-only">Tracking Preference Controls</legend>
252
+
253
+ <!-- Opt-out checkbox -->
254
+ <label>
255
+ <input
256
+ type="checkbox"
257
+ checked={optedOut}
258
+ disabled={optedIn}
259
+ aria-describedby="tracking-status"
260
+ on:change={(e) =>
261
+ toggleTracking(
262
+ /** @type {HTMLInputElement} */ (e.target).checked,
263
+ )} />
264
+ <strong>&nbsp;Disable analytics tracking (opt-out)</strong>
265
+ </label>
266
+
267
+ <br />
268
+
269
+ <!-- Opt-in checkbox -->
270
+ <label>
271
+ <input
272
+ type="checkbox"
273
+ checked={optedIn}
274
+ disabled={optedOut}
275
+ aria-describedby="tracking-status"
276
+ on:change={(e) =>
277
+ toggleOptIn(
278
+ /** @type {HTMLInputElement} */ (e.target).checked,
279
+ )} />
280
+ <strong>&nbsp;Enable analytics tracking (opt-in)</strong>
281
+ </label>
282
+ </fieldset>
309
283
 
310
284
  <div class="spacer"></div>
311
285