@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 +79 -0
- package/CHANGELOG.template.md +63 -0
- package/LICENSE.md +19 -8
- package/cspell.json +10 -1
- package/package.json +2 -2
- package/src/lib/pages/LicenseContent.svelte +22 -3
- package/src/lib/pages/PrivacyContent.svelte +67 -93
- package/src/lib/pages/PrivacyDashboard.svelte +66 -89
- package/src/lib/stores/posthog.js +8 -8
- package/src/lib/stores/trackingPreferences.js +222 -0
- package/src/lib/styles/css/default.css +12 -0
- package/src/lib/styles/global.min.css +1 -1
- package/src/routes/+layout.svelte +0 -2
- package/src/service-worker.js +4 -0
- package/static/docs/pgp-email.md +152 -0
- package/static/docs/pgp-win.md +67 -0
- package/static/docs/pgp.md +71 -0
- package/static/docs/tracking.md +63 -0
- package/static/img/fb-banner.png +0 -0
- package/svelte.config.js +1 -1
- package/CODE_OF_CONDUCT.md +0 -173
- package/src/lib/stores/trackingStatus.js +0 -30
- package/src/lib/utils/privacy.js +0 -81
- package/src/lib/utils/trackingCookies.js +0 -70
- package/src/lib/utils/trackingStatus.js +0 -61
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. [
|
|
42
|
-
13. [
|
|
43
|
-
14. [
|
|
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
|
-
##
|
|
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—including but not limited to license terms, policies, notices, or agreements—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
|
-
##
|
|
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 [
|
|
218
|
-
📧 `
|
|
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 © 2025
|
|
236
247
|
**[Network Pro Strategies](https://netwk.pro/)** (Network Pro™)
|
|
237
248
|
|
|
238
|
-
Network Pro™, the shield logo, and the "Locking Down Networks
|
|
249
|
+
Network Pro™, the shield logo, and the "Locking Down Networks...™" 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.
|
|
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.
|
|
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: "
|
|
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}>
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
} from "$lib/
|
|
13
|
+
trackingPreferences,
|
|
14
|
+
setOptIn,
|
|
15
|
+
setOptOut,
|
|
16
|
+
clearPrefs,
|
|
17
|
+
} from "$lib/stores/trackingPreferences.js";
|
|
19
18
|
import { CONSTANTS } from "$lib";
|
|
20
19
|
|
|
21
|
-
|
|
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
|
-
/**
|
|
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
|
|
63
|
+
let optedOut;
|
|
74
64
|
|
|
75
65
|
/** @type {boolean} */
|
|
76
|
-
let optedIn
|
|
66
|
+
let optedIn;
|
|
77
67
|
|
|
78
|
-
/**
|
|
79
|
-
|
|
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
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
110
|
-
if (optedOut) {
|
|
79
|
+
if (value) {
|
|
111
80
|
console.log("[Tracking] User opted out");
|
|
112
|
-
|
|
81
|
+
setOptOut();
|
|
113
82
|
} else {
|
|
114
83
|
console.log("[Tracking] User cleared opt-out");
|
|
115
|
-
|
|
84
|
+
clearPrefs();
|
|
116
85
|
}
|
|
117
|
-
refreshTrackingStatus();
|
|
118
86
|
}
|
|
119
87
|
|
|
120
88
|
/**
|
|
121
|
-
*
|
|
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
|
-
|
|
128
|
-
if (optedIn) {
|
|
93
|
+
if (value) {
|
|
129
94
|
console.log("[Tracking] User opted in");
|
|
130
|
-
|
|
95
|
+
setOptIn();
|
|
131
96
|
} else {
|
|
132
97
|
console.log("[Tracking] User cleared opt-in");
|
|
133
|
-
|
|
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
|
-
|
|
238
|
+
|
|
239
|
+
{#if trackingStatus && trackingStatus !== "⏳ Checking tracking preferences..."}
|
|
271
240
|
<p id="tracking-status" aria-live="polite">
|
|
272
241
|
<strong>Tracking Status:</strong>
|
|
273
|
-
{
|
|
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
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
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> 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> Enable analytics tracking (opt-in)</strong>
|
|
281
|
+
</label>
|
|
282
|
+
</fieldset>
|
|
309
283
|
|
|
310
284
|
<div class="spacer"></div>
|
|
311
285
|
|