@networkpro/web 1.6.3 → 1.7.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.
- package/CODE_OF_CONDUCT.md +2 -2
- package/LICENSE.md +20 -9
- package/README.md +21 -19
- package/_redirects +1 -0
- package/cspell.json +2 -0
- package/package.json +5 -6
- package/playwright.config.js +1 -0
- package/scripts/bundleCss.js +2 -2
- package/src/app.html +18 -1
- package/src/hooks.server.js +42 -45
- package/src/lib/components/FullWidthSection.svelte +19 -4
- package/src/lib/components/LegalNav.svelte +31 -29
- package/src/lib/components/PostHog.svelte +20 -8
- package/src/lib/components/layout/Footer.svelte +1 -1
- package/src/lib/components/layout/HeaderDefault.svelte +2 -2
- package/src/lib/components/layout/HeaderHome.svelte +2 -2
- package/src/lib/images.js +3 -2
- package/src/lib/img/logo-web.png +0 -0
- package/src/lib/img/logo-web.webp +0 -0
- package/src/lib/index.js +2 -1
- package/src/lib/meta.js +6 -1
- package/src/lib/pages/AboutContent.svelte +4 -5
- package/src/lib/pages/HomeContent.svelte +1 -1
- package/src/lib/pages/LicenseContent.svelte +19 -20
- package/src/lib/pages/PrivacyContent.svelte +149 -6
- package/src/lib/pages/PrivacyDashboard.svelte +240 -0
- package/src/lib/pages/TermsConditionsContent.svelte +1 -1
- package/src/lib/pages/TermsUseContent.svelte +3 -4
- package/src/lib/styles/css/default.css +32 -11
- package/src/lib/styles/css/normalize.css +2 -2
- package/src/lib/styles/css/style.css +2 -2
- package/src/lib/styles/global.min.css +2 -6
- package/src/lib/utils/privacy.js +38 -0
- package/src/lib/utils/trackingCookies.js +40 -0
- package/src/lib/utils/trackingStatus.js +46 -0
- package/src/lib/utils/utm.js +8 -1
- package/src/routes/+layout.svelte +25 -12
- package/src/routes/about/+page.svelte +1 -7
- package/src/routes/foss-spotlight/+page.svelte +1 -7
- package/src/routes/license/+page.svelte +2 -8
- package/src/routes/privacy/+page.server.js +18 -0
- package/src/routes/{privacy-policy → privacy}/+page.svelte +5 -11
- package/src/routes/{privacy-policy → privacy-dashboard}/+page.server.js +2 -2
- package/src/routes/privacy-dashboard/+page.svelte +69 -0
- package/src/routes/terms-conditions/+page.svelte +2 -8
- package/src/routes/terms-of-use/+page.svelte +2 -8
- package/src/service-worker.js +31 -6
- package/static/sitemap.xml +10 -22
- package/tests/e2e/app.spec.js +21 -63
package/src/lib/meta.js
CHANGED
|
@@ -26,7 +26,7 @@ const meta = {
|
|
|
26
26
|
title: "About Us — Network Pro™",
|
|
27
27
|
description: "About Us | Security, Networking, Privacy — Network Pro™",
|
|
28
28
|
},
|
|
29
|
-
"/privacy
|
|
29
|
+
"/privacy": {
|
|
30
30
|
title: "Privacy Policy — Network Pro™",
|
|
31
31
|
description:
|
|
32
32
|
"Privacy Policy | Security, Networking, Privacy — Network Pro™",
|
|
@@ -51,6 +51,11 @@ const meta = {
|
|
|
51
51
|
description:
|
|
52
52
|
"FOSS Spotlight | Security, Networking, Privacy — Network Pro™",
|
|
53
53
|
},
|
|
54
|
+
"/privacy-dashboard": {
|
|
55
|
+
title: "Privacy Dashboard — Network Pro™",
|
|
56
|
+
description:
|
|
57
|
+
"Privacy Dashboard | Security, Networking, Privacy — Network Pro™",
|
|
58
|
+
},
|
|
54
59
|
// Excludes redirect-only routes like /contact, /consultation, /privacy-rights
|
|
55
60
|
};
|
|
56
61
|
|
|
@@ -56,7 +56,7 @@ This file is part of Network Pro.
|
|
|
56
56
|
text: "CC-BY-4.0 OR GPL-3.0-or-later",
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
|
-
label: "
|
|
59
|
+
label: "Docs",
|
|
60
60
|
href: "https://docs.netwk.pro",
|
|
61
61
|
target: "_self",
|
|
62
62
|
},
|
|
@@ -103,9 +103,8 @@ This file is part of Network Pro.
|
|
|
103
103
|
<section id="top">
|
|
104
104
|
<span class="small-text">
|
|
105
105
|
<a {rel} href={navLinks[0].href} target={navLinks[0].target}>
|
|
106
|
-
{navLinks[0].label}
|
|
107
|
-
</
|
|
108
|
-
: <code>{navLinks[0].text}</code>
|
|
106
|
+
{navLinks[0].label}</a
|
|
107
|
+
>: <code>{navLinks[0].text}</code>
|
|
109
108
|
</span>
|
|
110
109
|
</section>
|
|
111
110
|
|
|
@@ -193,7 +192,7 @@ This file is part of Network Pro.
|
|
|
193
192
|
<div class="spacer"></div>
|
|
194
193
|
|
|
195
194
|
<p>
|
|
196
|
-
<a {rel} href="https://
|
|
195
|
+
<a {rel} href="https://netwk.pro/contact" target="_blank">Let's connect</a>
|
|
197
196
|
to discuss how we can help secure and strengthen your business today.
|
|
198
197
|
</p>
|
|
199
198
|
|
|
@@ -51,9 +51,9 @@ This file is part of Network Pro.
|
|
|
51
51
|
{ id: "third-party", text: "Third-Party Code and Licenses" },
|
|
52
52
|
{ id: "prohibited-uses", text: "Prohibited Uses" },
|
|
53
53
|
{ id: "disclaimer", text: "Modifications and Liability Disclaimer" },
|
|
54
|
-
{ id: "contact", text: "Contact" },
|
|
55
|
-
{ id: "revisions", text: "Revisions" },
|
|
56
54
|
{ id: "authoritative", text: "Authoritative Version Clause" },
|
|
55
|
+
{ id: "revisions", text: "Revisions" },
|
|
56
|
+
{ id: "contact", text: "Contact" },
|
|
57
57
|
];
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -62,7 +62,7 @@ This file is part of Network Pro.
|
|
|
62
62
|
*/
|
|
63
63
|
const constants = {
|
|
64
64
|
company: "Network Pro Strategies",
|
|
65
|
-
effectiveDate: "May
|
|
65
|
+
effectiveDate: "May 28, 2025",
|
|
66
66
|
classSmall: "small-text",
|
|
67
67
|
rel: "noopener noreferrer",
|
|
68
68
|
hrefTop: "#top",
|
|
@@ -79,8 +79,7 @@ This file is part of Network Pro.
|
|
|
79
79
|
href="https://spdx.dev/learn/handling-license-info"
|
|
80
80
|
target={constants.targetBlank}>
|
|
81
81
|
SPDX License Identifier
|
|
82
|
-
</a>
|
|
83
|
-
: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
82
|
+
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
84
83
|
</span>
|
|
85
84
|
</section>
|
|
86
85
|
|
|
@@ -114,7 +113,7 @@ This file is part of Network Pro.
|
|
|
114
113
|
<strong>Formats Available:</strong> <span class="visited"
|
|
115
114
|
>HTML</span>
|
|
116
115
|
|
|
|
117
|
-
<a href={legalLink} target={constants.targetSelf}>
|
|
116
|
+
<a href={legalLink} target={constants.targetSelf}>Docs</a>
|
|
118
117
|
</sup>
|
|
119
118
|
</p>
|
|
120
119
|
</section>
|
|
@@ -473,20 +472,6 @@ This file is part of Network Pro.
|
|
|
473
472
|
—including, without limitation, any claims or disputes brought by third parties,
|
|
474
473
|
whether in contract, tort, or otherwise.
|
|
475
474
|
</p>
|
|
476
|
-
{:else if link.id === "contact"}
|
|
477
|
-
<p>
|
|
478
|
-
The Company can be contacted via our
|
|
479
|
-
<a rel={constants.rel} href={contactLink} target={constants.targetBlank}
|
|
480
|
-
>contact form</a>
|
|
481
|
-
or by email at:<br />
|
|
482
|
-
📧 <code>contact (at) s.neteng.pro</code>
|
|
483
|
-
</p>
|
|
484
|
-
{:else if link.id === "revisions"}
|
|
485
|
-
<p>
|
|
486
|
-
This legal page may be updated to comply with legal or operational
|
|
487
|
-
changes. The current effective date is listed at the top of this
|
|
488
|
-
document.
|
|
489
|
-
</p>
|
|
490
475
|
{:else if link.id === "authoritative"}
|
|
491
476
|
<p>
|
|
492
477
|
In the event of any discrepancy between different versions, formats, or
|
|
@@ -505,6 +490,20 @@ This file is part of Network Pro.
|
|
|
505
490
|
of the Company's materials, services, or Licensed Material constitutes
|
|
506
491
|
acceptance of the most current version then in effect.
|
|
507
492
|
</p>
|
|
493
|
+
{:else if link.id === "revisions"}
|
|
494
|
+
<p>
|
|
495
|
+
This legal page may be updated to comply with legal or operational
|
|
496
|
+
changes. The current effective date is listed at the top of this
|
|
497
|
+
document.
|
|
498
|
+
</p>
|
|
499
|
+
{:else if link.id === "contact"}
|
|
500
|
+
<p>
|
|
501
|
+
The Company can be contacted via our
|
|
502
|
+
<a rel={constants.rel} href={contactLink} target={constants.targetBlank}
|
|
503
|
+
>contact form</a>
|
|
504
|
+
or by email at:<br />
|
|
505
|
+
📧 <code>contact (at) s.neteng.pro</code>
|
|
506
|
+
</p>
|
|
508
507
|
{/if}
|
|
509
508
|
|
|
510
509
|
<span class={constants.classSmall}>
|
|
@@ -6,10 +6,17 @@ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
|
6
6
|
This file is part of Network Pro.
|
|
7
7
|
========================================================================== -->
|
|
8
8
|
|
|
9
|
-
<!-- cspell:ignore prights -->
|
|
9
|
+
<!-- cspell:ignore prights prefs pdash -->
|
|
10
10
|
|
|
11
11
|
<script>
|
|
12
12
|
import { base } from "$app/paths";
|
|
13
|
+
import { onMount } from "svelte";
|
|
14
|
+
import { getTrackingPreferences } from "$lib/utils/trackingStatus.js";
|
|
15
|
+
/** @type {(type: 'enable' | 'disable') => void} */
|
|
16
|
+
import {
|
|
17
|
+
setTrackingPreference,
|
|
18
|
+
clearTrackingPreferences,
|
|
19
|
+
} from "$lib/utils/trackingCookies.js";
|
|
13
20
|
|
|
14
21
|
// Log the base path to verify its value
|
|
15
22
|
//console.log("Base path:", base);
|
|
@@ -17,16 +24,20 @@ This file is part of Network Pro.
|
|
|
17
24
|
/**
|
|
18
25
|
* URL to the Privacy Rights Request Form redirect route, using the base path
|
|
19
26
|
* URL to the Contact Form redirect route, using the base path
|
|
27
|
+
* URL to the Privacy Dashboard using the base path
|
|
20
28
|
* @type {string}
|
|
21
29
|
*/
|
|
22
30
|
const prightsLink = `${base}/privacy-rights`;
|
|
23
31
|
const contactLink = `${base}/contact`;
|
|
32
|
+
const pdashLink = `${base}/privacy-dashboard`;
|
|
24
33
|
|
|
25
34
|
/**
|
|
26
35
|
* URL to the privacy policy in Markdown format
|
|
36
|
+
* External URL to the GPC website
|
|
27
37
|
* @type {string}
|
|
28
38
|
*/
|
|
29
39
|
const privacyLink = "https://docs.netwk.pro/privacy";
|
|
40
|
+
const gpcLink = "https://globalprivacycontrol.org/";
|
|
30
41
|
|
|
31
42
|
/**
|
|
32
43
|
* Table of Contents Links
|
|
@@ -35,6 +46,7 @@ This file is part of Network Pro.
|
|
|
35
46
|
const tocLinks = [
|
|
36
47
|
{ id: "intro", text: "Introduction" },
|
|
37
48
|
{ id: "collect", text: "Information We Collect" },
|
|
49
|
+
{ id: "tracking", text: "Web Analytics and Tracking" },
|
|
38
50
|
{ id: "payment", text: "Payment Information" },
|
|
39
51
|
{ id: "use", text: "Use of Information" },
|
|
40
52
|
{ id: "sharing", text: "Data Sharing" },
|
|
@@ -55,7 +67,7 @@ This file is part of Network Pro.
|
|
|
55
67
|
email: "support (at) neteng.pro",
|
|
56
68
|
secure: "contact (at) s.neteng.pro",
|
|
57
69
|
phone: "(623) 252-4350",
|
|
58
|
-
effectiveDate: "May
|
|
70
|
+
effectiveDate: "May 28, 2025",
|
|
59
71
|
};
|
|
60
72
|
|
|
61
73
|
/**
|
|
@@ -77,6 +89,48 @@ This file is part of Network Pro.
|
|
|
77
89
|
targetSelf: "_self",
|
|
78
90
|
targetBlank: "_blank",
|
|
79
91
|
};
|
|
92
|
+
|
|
93
|
+
let optedOut = false;
|
|
94
|
+
let optedIn = false;
|
|
95
|
+
let trackingStatus = "";
|
|
96
|
+
|
|
97
|
+
onMount(() => {
|
|
98
|
+
const prefs = getTrackingPreferences();
|
|
99
|
+
optedOut = prefs.optedOut;
|
|
100
|
+
optedIn = prefs.optedIn;
|
|
101
|
+
trackingStatus = prefs.status;
|
|
102
|
+
console.log("[Tracking] Status:", trackingStatus);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Toggle tracking opt-out.
|
|
107
|
+
* @param {boolean} value
|
|
108
|
+
*/
|
|
109
|
+
function toggleTracking(value) {
|
|
110
|
+
optedOut = value;
|
|
111
|
+
if (optedOut) {
|
|
112
|
+
console.log("[Tracking] User opted out");
|
|
113
|
+
setTrackingPreference("disable");
|
|
114
|
+
} else {
|
|
115
|
+
console.log("[Tracking] User cleared opt-out");
|
|
116
|
+
clearTrackingPreferences();
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Toggle tracking opt-in.
|
|
122
|
+
* @param {boolean} value
|
|
123
|
+
*/
|
|
124
|
+
function toggleOptIn(value) {
|
|
125
|
+
optedIn = value;
|
|
126
|
+
if (optedIn) {
|
|
127
|
+
console.log("[Tracking] User opted in");
|
|
128
|
+
setTrackingPreference("enable");
|
|
129
|
+
} else {
|
|
130
|
+
console.log("[Tracking] User cleared opt-in");
|
|
131
|
+
clearTrackingPreferences();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
80
134
|
</script>
|
|
81
135
|
|
|
82
136
|
<!-- BEGIN TITLE -->
|
|
@@ -87,8 +141,7 @@ This file is part of Network Pro.
|
|
|
87
141
|
href="https://spdx.dev/learn/handling-license-info"
|
|
88
142
|
target={constants.targetBlank}>
|
|
89
143
|
SPDX License Identifier
|
|
90
|
-
</a>
|
|
91
|
-
: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
144
|
+
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
92
145
|
</span>
|
|
93
146
|
</section>
|
|
94
147
|
|
|
@@ -122,7 +175,7 @@ This file is part of Network Pro.
|
|
|
122
175
|
<strong>Formats Available:</strong> <span class="visited"
|
|
123
176
|
>HTML</span>
|
|
124
177
|
|
|
|
125
|
-
<a href={privacyLink} target={constants.targetSelf}>
|
|
178
|
+
<a href={privacyLink} target={constants.targetSelf}>Docs</a>
|
|
126
179
|
</sup>
|
|
127
180
|
</p>
|
|
128
181
|
</section>
|
|
@@ -161,6 +214,95 @@ This file is part of Network Pro.
|
|
|
161
214
|
<li
|
|
162
215
|
><strong>Client-Submitted Content</strong> related to our services</li>
|
|
163
216
|
</ul>
|
|
217
|
+
{:else if link.id === "tracking"}
|
|
218
|
+
<p>
|
|
219
|
+
To better understand visitor behavior and optimize website
|
|
220
|
+
functionality, we use <strong>PostHog Cloud</strong>, a hosted version
|
|
221
|
+
of the open-source PostHog analytics platform. This tool helps us
|
|
222
|
+
evaluate site performance and user engagement through the collection of
|
|
223
|
+
non-personally identifiable technical data.
|
|
224
|
+
</p>
|
|
225
|
+
<p> PostHog Cloud may collect and process information such as: </p>
|
|
226
|
+
<ul>
|
|
227
|
+
<li>Pages visited and navigation behavior</li>
|
|
228
|
+
<li>Device type, browser version, and operating system</li>
|
|
229
|
+
<li
|
|
230
|
+
>Time spent on pages and interaction events (e.g., clicks, scrolls)</li>
|
|
231
|
+
<li>Referral URLs and outbound link activity</li>
|
|
232
|
+
<li>General geolocation (approximate, based on IP address)</li>
|
|
233
|
+
</ul>
|
|
234
|
+
<p>
|
|
235
|
+
We configure PostHog to prioritize user privacy. <strong
|
|
236
|
+
>Analytics tracking is automatically disabled when a user's browser
|
|
237
|
+
sends a “Do Not Track” (DNT) or <a
|
|
238
|
+
rel={constants.rel}
|
|
239
|
+
href={gpcLink}
|
|
240
|
+
target={constants.targetBlank}
|
|
241
|
+
>“Global Privacy Control” (GPC / Sec-GPC)</a> signal.</strong> No further
|
|
242
|
+
action is required—your browser settings are honored by default.
|
|
243
|
+
</p>
|
|
244
|
+
<p>
|
|
245
|
+
You can view your current tracking status below, along with manual
|
|
246
|
+
opt-out and opt-in settings stored as browser cookies. These settings
|
|
247
|
+
override any Do Not Track (DNT) or Global Privacy Control (GPC) signals. <strong
|
|
248
|
+
>If you opt out, analytics tracking via PostHog is disabled entirely
|
|
249
|
+
until you change your preference.</strong> Your selection will persist
|
|
250
|
+
until manually updated.
|
|
251
|
+
</p>
|
|
252
|
+
<p class="emphasis">
|
|
253
|
+
For convenient access, you can manage these settings through our <a
|
|
254
|
+
href={pdashLink}
|
|
255
|
+
target={constants.targetSelf}>Privacy Dashboard</a
|
|
256
|
+
>.
|
|
257
|
+
</p>
|
|
258
|
+
|
|
259
|
+
<div class="spacer"></div>
|
|
260
|
+
|
|
261
|
+
<h3>Tracking Preferences</h3>
|
|
262
|
+
<p id="tracking-status" aria-live="polite">
|
|
263
|
+
<strong>Tracking Status:</strong>
|
|
264
|
+
{trackingStatus}
|
|
265
|
+
</p>
|
|
266
|
+
|
|
267
|
+
<!-- Opt-out checkbox -->
|
|
268
|
+
<label>
|
|
269
|
+
<input
|
|
270
|
+
type="checkbox"
|
|
271
|
+
checked={optedOut}
|
|
272
|
+
disabled={optedIn}
|
|
273
|
+
aria-describedby="tracking-status"
|
|
274
|
+
on:change={(e) =>
|
|
275
|
+
toggleTracking(
|
|
276
|
+
/** @type {HTMLInputElement} */ (e.target).checked,
|
|
277
|
+
)} />
|
|
278
|
+
<strong> Disable analytics tracking (opt-out)</strong>
|
|
279
|
+
</label>
|
|
280
|
+
|
|
281
|
+
<br />
|
|
282
|
+
|
|
283
|
+
<!-- Opt-in checkbox -->
|
|
284
|
+
<label>
|
|
285
|
+
<input
|
|
286
|
+
type="checkbox"
|
|
287
|
+
checked={optedIn}
|
|
288
|
+
disabled={optedOut}
|
|
289
|
+
aria-describedby="tracking-status"
|
|
290
|
+
on:change={(e) =>
|
|
291
|
+
toggleOptIn(/** @type {HTMLInputElement} */ (e.target).checked)} />
|
|
292
|
+
<strong> Enable analytics tracking (opt-in)</strong>
|
|
293
|
+
</label>
|
|
294
|
+
|
|
295
|
+
<div class="spacer"></div>
|
|
296
|
+
|
|
297
|
+
<p>
|
|
298
|
+
PostHog Cloud is a third-party service, but we deploy it in a
|
|
299
|
+
privacy-conscious manner that avoids intrusive profiling and aligns with
|
|
300
|
+
data protection best practices. For more information, please refer to <a
|
|
301
|
+
rel={constants.rel}
|
|
302
|
+
href="https://posthog.com/privacy"
|
|
303
|
+
target={constants.targetBlank}>PostHog's Privacy Policy</a
|
|
304
|
+
>.
|
|
305
|
+
</p>
|
|
164
306
|
{:else if link.id === "payment"}
|
|
165
307
|
<p>
|
|
166
308
|
When processing payments, we may collect credit card details and billing
|
|
@@ -212,7 +354,8 @@ This file is part of Network Pro.
|
|
|
212
354
|
information.
|
|
213
355
|
</p>
|
|
214
356
|
{:else if link.id === "rights"}
|
|
215
|
-
<
|
|
357
|
+
<h3>Your Rights and Choices</h3>
|
|
358
|
+
<p> Under applicable state and federal law, you may have rights to: </p>
|
|
216
359
|
<ul>
|
|
217
360
|
<li
|
|
218
361
|
><strong>Access, update, or delete</strong> your personal information,
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/pages/PrivacyDashboard.svelte
|
|
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
|
+
<script>
|
|
10
|
+
import { base } from "$app/paths";
|
|
11
|
+
import { onMount } from "svelte";
|
|
12
|
+
import { getTrackingPreferences } from "$lib/utils/trackingStatus.js";
|
|
13
|
+
/** @type {(type: 'enable' | 'disable') => void} */
|
|
14
|
+
import {
|
|
15
|
+
setTrackingPreference,
|
|
16
|
+
clearTrackingPreferences,
|
|
17
|
+
} from "$lib/utils/trackingCookies.js";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @type {string}
|
|
21
|
+
* Style class for the div element.
|
|
22
|
+
*/
|
|
23
|
+
const spaceStyle = "spacer";
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* URL to the full Privacy Policy using the base path
|
|
27
|
+
* @type {string}
|
|
28
|
+
*/
|
|
29
|
+
const privacyPolicy = `${base}/privacy`;
|
|
30
|
+
const prightsLink = `${base}/privacy-rights`;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Constants used throughout the component for consistent styling and behavior
|
|
34
|
+
* @type {{
|
|
35
|
+
* classSmall: string,
|
|
36
|
+
* rel: string,
|
|
37
|
+
* backTop: string,
|
|
38
|
+
* hrefTop: string,
|
|
39
|
+
* targetSelf: string,
|
|
40
|
+
* targetBlank: string
|
|
41
|
+
* }}
|
|
42
|
+
*/
|
|
43
|
+
const constants = {
|
|
44
|
+
classSmall: "small-text",
|
|
45
|
+
rel: "noopener noreferrer",
|
|
46
|
+
backTop: "Back to top",
|
|
47
|
+
hrefTop: "#top",
|
|
48
|
+
targetSelf: "_self",
|
|
49
|
+
targetBlank: "_blank",
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
let optedOut = false;
|
|
53
|
+
let optedIn = false;
|
|
54
|
+
let trackingStatus = "";
|
|
55
|
+
|
|
56
|
+
onMount(() => {
|
|
57
|
+
const prefs = getTrackingPreferences();
|
|
58
|
+
optedOut = prefs.optedOut;
|
|
59
|
+
optedIn = prefs.optedIn;
|
|
60
|
+
trackingStatus = prefs.status;
|
|
61
|
+
console.log("[Tracking] Status:", trackingStatus);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Toggle tracking opt-out.
|
|
66
|
+
* @param {boolean} value
|
|
67
|
+
*/
|
|
68
|
+
function toggleTracking(value) {
|
|
69
|
+
optedOut = value;
|
|
70
|
+
if (optedOut) {
|
|
71
|
+
console.log("[Tracking] User opted out");
|
|
72
|
+
setTrackingPreference("disable");
|
|
73
|
+
} else {
|
|
74
|
+
console.log("[Tracking] User cleared opt-out");
|
|
75
|
+
clearTrackingPreferences();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Toggle tracking opt-in.
|
|
81
|
+
* @param {boolean} value
|
|
82
|
+
*/
|
|
83
|
+
function toggleOptIn(value) {
|
|
84
|
+
optedIn = value;
|
|
85
|
+
if (optedIn) {
|
|
86
|
+
console.log("[Tracking] User opted in");
|
|
87
|
+
setTrackingPreference("enable");
|
|
88
|
+
} else {
|
|
89
|
+
console.log("[Tracking] User cleared opt-in");
|
|
90
|
+
clearTrackingPreferences();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
</script>
|
|
94
|
+
|
|
95
|
+
<section id="top">
|
|
96
|
+
<span class={constants.classSmall}>
|
|
97
|
+
<a
|
|
98
|
+
rel={constants.rel}
|
|
99
|
+
href="https://spdx.dev/learn/handling-license-info"
|
|
100
|
+
target={constants.targetBlank}>
|
|
101
|
+
SPDX License Identifier
|
|
102
|
+
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
103
|
+
</span>
|
|
104
|
+
</section>
|
|
105
|
+
|
|
106
|
+
<h1>Privacy Dashboard</h1>
|
|
107
|
+
|
|
108
|
+
<div class={spaceStyle}></div>
|
|
109
|
+
|
|
110
|
+
<h2>Take Control of Your Data</h2>
|
|
111
|
+
|
|
112
|
+
<nav class="tracking-nav">
|
|
113
|
+
<ul>
|
|
114
|
+
<li
|
|
115
|
+
><a href="#tracking" target={constants.targetSelf}>Tracking Preferences</a
|
|
116
|
+
></li>
|
|
117
|
+
<li
|
|
118
|
+
><a href="#rights" target={constants.targetSelf}
|
|
119
|
+
>Your Rights and Choices</a
|
|
120
|
+
></li>
|
|
121
|
+
</ul>
|
|
122
|
+
</nav>
|
|
123
|
+
|
|
124
|
+
<p class="bquote">
|
|
125
|
+
For full details, please see our <a href={privacyPolicy} target="_self"
|
|
126
|
+
>Privacy Policy</a
|
|
127
|
+
>.
|
|
128
|
+
</p>
|
|
129
|
+
|
|
130
|
+
<div class={spaceStyle}></div>
|
|
131
|
+
|
|
132
|
+
<hr />
|
|
133
|
+
|
|
134
|
+
<div class={spaceStyle}></div>
|
|
135
|
+
|
|
136
|
+
<section id="tracking">
|
|
137
|
+
<h3>Tracking Preferences</h3>
|
|
138
|
+
|
|
139
|
+
<p>
|
|
140
|
+
<strong
|
|
141
|
+
>Analytics tracking is automatically disabled when a user's browser sends
|
|
142
|
+
a “Do Not Track” (DNT) or <a
|
|
143
|
+
rel={constants.rel}
|
|
144
|
+
href="https://globalprivacycontrol.org/"
|
|
145
|
+
target={constants.targetBlank}
|
|
146
|
+
>“Global Privacy Control” (GPC / Sec-GPC)</a> signal.</strong>
|
|
147
|
+
No further action is required—your browser settings are honored by default.
|
|
148
|
+
</p>
|
|
149
|
+
|
|
150
|
+
<p>
|
|
151
|
+
You can view your current tracking status below, along with manual opt-out
|
|
152
|
+
and opt-in settings stored as browser cookies. These settings override any
|
|
153
|
+
Do Not Track (DNT) or Global Privacy Control (GPC) signals. <strong
|
|
154
|
+
>If you opt out, analytics tracking via PostHog is disabled entirely until
|
|
155
|
+
you change your preference.</strong> Your selection will persist until manually
|
|
156
|
+
updated.
|
|
157
|
+
</p>
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
<p id="tracking-status" aria-live="polite">
|
|
162
|
+
<strong>Tracking Status:</strong>
|
|
163
|
+
{trackingStatus}
|
|
164
|
+
</p>
|
|
165
|
+
|
|
166
|
+
<!-- Opt-out checkbox -->
|
|
167
|
+
<label>
|
|
168
|
+
<input
|
|
169
|
+
type="checkbox"
|
|
170
|
+
checked={optedOut}
|
|
171
|
+
disabled={optedIn}
|
|
172
|
+
aria-describedby="tracking-status"
|
|
173
|
+
on:change={(e) =>
|
|
174
|
+
toggleTracking(/** @type {HTMLInputElement} */ (e.target).checked)} />
|
|
175
|
+
<strong> Disable analytics tracking (opt-out)</strong>
|
|
176
|
+
</label>
|
|
177
|
+
|
|
178
|
+
<br />
|
|
179
|
+
|
|
180
|
+
<!-- Opt-in checkbox -->
|
|
181
|
+
<label>
|
|
182
|
+
<input
|
|
183
|
+
type="checkbox"
|
|
184
|
+
checked={optedIn}
|
|
185
|
+
disabled={optedOut}
|
|
186
|
+
aria-describedby="tracking-status"
|
|
187
|
+
on:change={(e) =>
|
|
188
|
+
toggleOptIn(/** @type {HTMLInputElement} */ (e.target).checked)} />
|
|
189
|
+
<strong> Enable analytics tracking (opt-in)</strong>
|
|
190
|
+
</label>
|
|
191
|
+
|
|
192
|
+
<div class={spaceStyle}></div>
|
|
193
|
+
|
|
194
|
+
<p>
|
|
195
|
+
Analytics are used to understand how the site is used. No personally
|
|
196
|
+
identifiable information is tracked.
|
|
197
|
+
</p>
|
|
198
|
+
</section>
|
|
199
|
+
|
|
200
|
+
<span class={constants.classSmall}>
|
|
201
|
+
<a href={constants.hrefTop} target={constants.targetSelf}
|
|
202
|
+
>{constants.backTop}</a>
|
|
203
|
+
</span>
|
|
204
|
+
|
|
205
|
+
<div class={spaceStyle}></div>
|
|
206
|
+
|
|
207
|
+
<hr class="hr-styled" />
|
|
208
|
+
|
|
209
|
+
<div class={spaceStyle}></div>
|
|
210
|
+
|
|
211
|
+
<section id="rights">
|
|
212
|
+
<h3>Your Rights and Choices</h3>
|
|
213
|
+
|
|
214
|
+
<p> Under applicable state and federal law, you may have rights to: </p>
|
|
215
|
+
|
|
216
|
+
<ul>
|
|
217
|
+
<li
|
|
218
|
+
><strong>Access, update, or delete</strong> your personal information, subject
|
|
219
|
+
to legal and contractual limitations.</li>
|
|
220
|
+
<li
|
|
221
|
+
><strong>Restrict or object to processing</strong> under certain conditions,
|
|
222
|
+
as permitted by law.</li>
|
|
223
|
+
<li><strong>Opt out of direct marketing</strong></li>
|
|
224
|
+
</ul>
|
|
225
|
+
|
|
226
|
+
<p>
|
|
227
|
+
To exercise these rights, please use our <a
|
|
228
|
+
rel={constants.rel}
|
|
229
|
+
href={prightsLink}
|
|
230
|
+
target={constants.targetBlank}>Privacy Rights Request Form</a>
|
|
231
|
+
or email us at <code>contact (at) s.neteng.pro</code>.
|
|
232
|
+
</p>
|
|
233
|
+
</section>
|
|
234
|
+
|
|
235
|
+
<span class={constants.classSmall}>
|
|
236
|
+
<a href={constants.hrefTop} target={constants.targetSelf}
|
|
237
|
+
>{constants.backTop}</a>
|
|
238
|
+
</span>
|
|
239
|
+
|
|
240
|
+
<!-- cspell:ignore prefs prights -->
|
|
@@ -112,7 +112,7 @@ This file is part of Network Pro.
|
|
|
112
112
|
<strong>Formats Available:</strong> <span class="visited"
|
|
113
113
|
>HTML</span>
|
|
114
114
|
|
|
|
115
|
-
<a href={tandcLink} target={constants.targetSelf}>
|
|
115
|
+
<a href={tandcLink} target={constants.targetSelf}>Docs</a>
|
|
116
116
|
|
|
|
117
117
|
<a
|
|
118
118
|
rel={constants.rel}
|
|
@@ -24,7 +24,7 @@ This file is part of Network Pro.
|
|
|
24
24
|
* URL to Privacy Policy page, using the base path
|
|
25
25
|
* @type {string}
|
|
26
26
|
*/
|
|
27
|
-
const privacyLink = `${base}/privacy
|
|
27
|
+
const privacyLink = `${base}/privacy`;
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
30
|
* URL to License page, using the base path
|
|
@@ -78,8 +78,7 @@ This file is part of Network Pro.
|
|
|
78
78
|
href="https://spdx.dev/learn/handling-license-info"
|
|
79
79
|
target={constants.targetBlank}>
|
|
80
80
|
SPDX License Identifier
|
|
81
|
-
</a>
|
|
82
|
-
: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
81
|
+
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
83
82
|
</span>
|
|
84
83
|
</section>
|
|
85
84
|
|
|
@@ -122,7 +121,7 @@ This file is part of Network Pro.
|
|
|
122
121
|
>HTML</span>
|
|
123
122
|
|
|
|
124
123
|
<a rel={constants.rel} href={termsLink} target={constants.targetSelf}
|
|
125
|
-
>
|
|
124
|
+
>Docs</a>
|
|
126
125
|
</sup>
|
|
127
126
|
</p>
|
|
128
127
|
</section>
|