@networkpro/web 1.10.0 → 1.11.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/cspell.json +5 -0
- package/jsconfig.json +1 -15
- package/jsconfig.template.jsonc +32 -0
- package/netlify.toml +0 -1
- package/package.json +9 -9
- package/src/app.html +1 -1
- package/src/hooks.server.js +13 -0
- package/src/lib/components/Badges.svelte +6 -2
- package/src/lib/components/LegalNav.svelte +6 -1
- package/src/lib/components/MetaTags.svelte +8 -2
- package/src/lib/components/foss/FossItemContent.svelte +8 -6
- package/src/lib/components/layout/Footer.svelte +26 -46
- package/src/lib/index.js +27 -19
- package/src/lib/pages/AboutContent.svelte +17 -29
- package/src/lib/pages/FossContent.svelte +8 -13
- package/src/lib/pages/HomeContent.svelte +13 -25
- package/src/lib/pages/LicenseContent.svelte +69 -90
- package/src/lib/pages/PrivacyContent.svelte +102 -85
- package/src/lib/pages/PrivacyDashboard.svelte +79 -75
- package/src/lib/pages/TermsConditionsContent.svelte +13 -18
- package/src/lib/pages/TermsUseContent.svelte +17 -23
- package/src/lib/stores/posthog.js +115 -0
- package/src/lib/stores/trackingStatus.js +30 -0
- package/src/lib/types/appConstants.js +60 -0
- package/src/lib/types/fossTypes.js +17 -0
- package/src/lib/utils/privacy.js +47 -4
- package/src/lib/utils/trackingCookies.js +40 -10
- package/src/lib/utils/trackingStatus.js +18 -3
- package/src/routes/+layout.js +0 -2
- package/src/routes/+layout.svelte +36 -40
- package/static/offline.min.css +2 -3
- package/svelte.config.js +5 -2
- package/vite.config.js +2 -4
- package/src/lib/components/PostHog.svelte +0 -36
|
@@ -9,41 +9,45 @@ 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 {
|
|
13
|
-
/** @type {(type: 'enable' | 'disable') => void} */
|
|
12
|
+
import { trackingStatus } from "$lib/stores/trackingStatus.js";
|
|
14
13
|
import {
|
|
14
|
+
/** @type {(type: 'enable' | 'disable') => void} */
|
|
15
15
|
setTrackingPreference,
|
|
16
|
+
/** @type {() => void} */
|
|
16
17
|
clearTrackingPreferences,
|
|
17
18
|
} from "$lib/utils/trackingCookies.js";
|
|
18
19
|
import { CONSTANTS } from "$lib";
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
//console.log("Base path:", base);
|
|
21
|
+
console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
/** @type {typeof CONSTANTS.COMPANY_INFO} */
|
|
24
|
+
const COMPANY_INFO = CONSTANTS.COMPANY_INFO;
|
|
24
25
|
|
|
25
|
-
/**
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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;
|
|
34
|
+
|
|
35
|
+
/** @type {string} */
|
|
31
36
|
const prightsLink = `${base}/privacy-rights`;
|
|
37
|
+
|
|
38
|
+
/** @type {string} */
|
|
32
39
|
const contactLink = `${base}/contact`;
|
|
40
|
+
|
|
41
|
+
/** @type {string} */
|
|
33
42
|
const pdashLink = `${base}/privacy-dashboard`;
|
|
34
43
|
|
|
35
|
-
/**
|
|
36
|
-
* URL to the privacy policy in Markdown format
|
|
37
|
-
* External URL to the GPC website
|
|
38
|
-
* @type {string}
|
|
39
|
-
*/
|
|
44
|
+
/** @type {string} */
|
|
40
45
|
const privacyLink = "https://docs.netwk.pro/privacy";
|
|
46
|
+
|
|
47
|
+
/** @type {string} */
|
|
41
48
|
const gpcLink = "https://globalprivacycontrol.org/";
|
|
42
49
|
|
|
43
|
-
/**
|
|
44
|
-
* Table of Contents Links
|
|
45
|
-
* @type {{ id: string, text: string }[]}
|
|
46
|
-
*/
|
|
50
|
+
/** @type {{ id: string, text: string }[]} */
|
|
47
51
|
const tocLinks = [
|
|
48
52
|
{ id: "intro", text: "Introduction" },
|
|
49
53
|
{ id: "collect", text: "Information We Collect" },
|
|
@@ -62,41 +66,44 @@ This file is part of Network Pro.
|
|
|
62
66
|
/** @type {string} */
|
|
63
67
|
const effectiveDate = "June 2, 2025";
|
|
64
68
|
|
|
65
|
-
/**
|
|
66
|
-
|
|
67
|
-
* @type {{
|
|
68
|
-
* classSmall: string,
|
|
69
|
-
* rel: string,
|
|
70
|
-
* backTop: string,
|
|
71
|
-
* hrefTop: string,
|
|
72
|
-
* targetSelf: string,
|
|
73
|
-
* targetBlank: string
|
|
74
|
-
* }}
|
|
75
|
-
*/
|
|
76
|
-
const constants = {
|
|
77
|
-
classSmall: "small-text",
|
|
78
|
-
rel: "noopener noreferrer",
|
|
79
|
-
backTop: "Back to top",
|
|
80
|
-
hrefTop: "#top",
|
|
81
|
-
targetSelf: "_self",
|
|
82
|
-
targetBlank: "_blank",
|
|
83
|
-
};
|
|
69
|
+
/** @type {string} */
|
|
70
|
+
const classSmall = "small-text";
|
|
84
71
|
|
|
72
|
+
/** @type {boolean} */
|
|
85
73
|
let optedOut = false;
|
|
74
|
+
|
|
75
|
+
/** @type {boolean} */
|
|
86
76
|
let optedIn = false;
|
|
87
|
-
let trackingStatus = "";
|
|
88
77
|
|
|
89
|
-
|
|
90
|
-
|
|
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();
|
|
91
89
|
optedOut = prefs.optedOut;
|
|
92
90
|
optedIn = prefs.optedIn;
|
|
93
|
-
trackingStatus
|
|
94
|
-
|
|
91
|
+
trackingStatus.set(prefs.status);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Runs tracking preference detection on client mount.
|
|
96
|
+
*/
|
|
97
|
+
onMount(() => {
|
|
98
|
+
refreshTrackingStatus();
|
|
99
|
+
console.log("[Tracking] Status:", $trackingStatus);
|
|
95
100
|
});
|
|
96
101
|
|
|
97
102
|
/**
|
|
98
|
-
*
|
|
99
|
-
*
|
|
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}
|
|
100
107
|
*/
|
|
101
108
|
function toggleTracking(value) {
|
|
102
109
|
optedOut = value;
|
|
@@ -107,11 +114,14 @@ This file is part of Network Pro.
|
|
|
107
114
|
console.log("[Tracking] User cleared opt-out");
|
|
108
115
|
clearTrackingPreferences();
|
|
109
116
|
}
|
|
117
|
+
refreshTrackingStatus();
|
|
110
118
|
}
|
|
111
119
|
|
|
112
120
|
/**
|
|
113
|
-
*
|
|
114
|
-
*
|
|
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}
|
|
115
125
|
*/
|
|
116
126
|
function toggleOptIn(value) {
|
|
117
127
|
optedIn = value;
|
|
@@ -122,16 +132,17 @@ This file is part of Network Pro.
|
|
|
122
132
|
console.log("[Tracking] User cleared opt-in");
|
|
123
133
|
clearTrackingPreferences();
|
|
124
134
|
}
|
|
135
|
+
refreshTrackingStatus();
|
|
125
136
|
}
|
|
126
137
|
</script>
|
|
127
138
|
|
|
128
139
|
<!-- BEGIN TITLE -->
|
|
129
140
|
<section id="top">
|
|
130
|
-
<span class={
|
|
141
|
+
<span class={classSmall}>
|
|
131
142
|
<a
|
|
132
|
-
rel={
|
|
143
|
+
rel={PAGE.REL}
|
|
133
144
|
href="https://spdx.dev/learn/handling-license-info"
|
|
134
|
-
target={
|
|
145
|
+
target={PAGE.BLANK}>
|
|
135
146
|
SPDX License Identifier
|
|
136
147
|
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
137
148
|
</span>
|
|
@@ -140,7 +151,7 @@ This file is part of Network Pro.
|
|
|
140
151
|
<section id="page-title">
|
|
141
152
|
<h1>Privacy Policy</h1>
|
|
142
153
|
<p>
|
|
143
|
-
<strong>{
|
|
154
|
+
<strong>{COMPANY_INFO.NAME}</strong><br />
|
|
144
155
|
<strong>Effective Date:</strong>
|
|
145
156
|
{effectiveDate}
|
|
146
157
|
</p>
|
|
@@ -167,7 +178,7 @@ This file is part of Network Pro.
|
|
|
167
178
|
<strong>Formats Available:</strong> <span class="visited"
|
|
168
179
|
>HTML</span>
|
|
169
180
|
|
|
|
170
|
-
<a href={privacyLink} target={
|
|
181
|
+
<a href={privacyLink} target={PAGE.SELF}>Docs</a>
|
|
171
182
|
</sup>
|
|
172
183
|
</p>
|
|
173
184
|
</section>
|
|
@@ -188,9 +199,9 @@ This file is part of Network Pro.
|
|
|
188
199
|
4 of the
|
|
189
200
|
<strong>
|
|
190
201
|
<a
|
|
191
|
-
rel={
|
|
202
|
+
rel={PAGE.REL}
|
|
192
203
|
href="https://www.azleg.gov/arstitle"
|
|
193
|
-
target={
|
|
204
|
+
target={PAGE.BLANK}>
|
|
194
205
|
Arizona Revised Statutes
|
|
195
206
|
</a>
|
|
196
207
|
</strong> (A.R.S. §§ 18-551, 18-552).
|
|
@@ -232,12 +243,11 @@ This file is part of Network Pro.
|
|
|
232
243
|
<p>
|
|
233
244
|
We configure PostHog to prioritize user privacy. <strong
|
|
234
245
|
>Analytics tracking is automatically disabled when a user's browser
|
|
235
|
-
sends a
|
|
236
|
-
rel={
|
|
246
|
+
sends a "Do Not Track" (DNT) or <a
|
|
247
|
+
rel={PAGE.REL}
|
|
237
248
|
href={gpcLink}
|
|
238
|
-
target={
|
|
239
|
-
|
|
240
|
-
action is required—your browser settings are honored by default.
|
|
249
|
+
target={PAGE.BLANK}>"Global Privacy Control" (GPC / Sec-GPC)</a> signal.</strong>
|
|
250
|
+
No further action is required—your browser settings are honored by default.
|
|
241
251
|
</p>
|
|
242
252
|
<p>
|
|
243
253
|
You can view your current tracking status below, along with manual
|
|
@@ -250,17 +260,24 @@ This file is part of Network Pro.
|
|
|
250
260
|
<p class="emphasis">
|
|
251
261
|
For convenient access, you can manage these settings through our <a
|
|
252
262
|
href={pdashLink}
|
|
253
|
-
target={
|
|
263
|
+
target={PAGE.SELF}>Privacy Dashboard</a
|
|
254
264
|
>.
|
|
255
265
|
</p>
|
|
256
266
|
|
|
257
267
|
<div class="spacer"></div>
|
|
258
268
|
|
|
259
269
|
<h3>Tracking Preferences</h3>
|
|
260
|
-
|
|
261
|
-
<
|
|
262
|
-
|
|
263
|
-
|
|
270
|
+
{#if $trackingStatus !== "⏳ Checking tracking preferences..."}
|
|
271
|
+
<p id="tracking-status" aria-live="polite">
|
|
272
|
+
<strong>Tracking Status:</strong>
|
|
273
|
+
{$trackingStatus}
|
|
274
|
+
</p>
|
|
275
|
+
{:else}
|
|
276
|
+
<p id="tracking-status" aria-live="polite">
|
|
277
|
+
<strong>Tracking Status:</strong>
|
|
278
|
+
<em>Loading…</em>
|
|
279
|
+
</p>
|
|
280
|
+
{/if}
|
|
264
281
|
|
|
265
282
|
<!-- Opt-out checkbox -->
|
|
266
283
|
<label>
|
|
@@ -296,9 +313,9 @@ This file is part of Network Pro.
|
|
|
296
313
|
PostHog Cloud is a third-party service, but we deploy it in a
|
|
297
314
|
privacy-conscious manner that avoids intrusive profiling and aligns with
|
|
298
315
|
data protection best practices. For more information, please refer to <a
|
|
299
|
-
rel={
|
|
316
|
+
rel={PAGE.REL}
|
|
300
317
|
href="https://posthog.com/privacy"
|
|
301
|
-
target={
|
|
318
|
+
target={PAGE.BLANK}>PostHog's Privacy Policy</a
|
|
302
319
|
>.
|
|
303
320
|
</p>
|
|
304
321
|
{:else if link.id === "payment"}
|
|
@@ -379,25 +396,24 @@ This file is part of Network Pro.
|
|
|
379
396
|
<p>
|
|
380
397
|
Although these rights are specifically granted to residents of
|
|
381
398
|
California and the European Union under laws such as the <a
|
|
382
|
-
rel={
|
|
399
|
+
rel={PAGE.REL}
|
|
383
400
|
href="https://oag.ca.gov/privacy/ccpa"
|
|
384
|
-
target={
|
|
385
|
-
>California Consumer Privacy Act (CCPA)</a
|
|
401
|
+
target={PAGE.BLANK}>California Consumer Privacy Act (CCPA)</a
|
|
386
402
|
>, the California Privacy Rights Act (CPRA), and the
|
|
387
403
|
<a
|
|
388
|
-
rel={
|
|
404
|
+
rel={PAGE.REL}
|
|
389
405
|
href="https://gdpr.eu/what-is-gdpr/"
|
|
390
|
-
target={
|
|
391
|
-
>EU General Data Protection Regulation (GDPR)</a
|
|
406
|
+
target={PAGE.BLANK}>EU General Data Protection Regulation (GDPR)</a
|
|
392
407
|
>, we voluntarily extend these rights to all users, regardless of
|
|
393
408
|
residency.
|
|
394
409
|
</p>
|
|
395
410
|
<p>
|
|
396
411
|
To exercise any of these rights, you may submit a request through our <a
|
|
412
|
+
rel={PAGE.REL}
|
|
397
413
|
href={prightsLink}
|
|
398
|
-
target={
|
|
414
|
+
target={PAGE.BLANK}>Privacy Rights Request Form</a
|
|
399
415
|
>. Alternatively, you can email us at
|
|
400
|
-
<strong>{
|
|
416
|
+
<strong>{CONTACT.PRIVACY}</strong>
|
|
401
417
|
with the subject line: "<strong>Privacy Rights Preferences</strong>".
|
|
402
418
|
</p>
|
|
403
419
|
{:else if link.id === "third-party"}
|
|
@@ -418,22 +434,23 @@ This file is part of Network Pro.
|
|
|
418
434
|
posting.
|
|
419
435
|
</p>
|
|
420
436
|
{:else if link.id === "contact"}
|
|
421
|
-
<p
|
|
422
|
-
|
|
423
|
-
rel={
|
|
437
|
+
<p>
|
|
438
|
+
For questions, please utilize our <a
|
|
439
|
+
rel={PAGE.REL}
|
|
424
440
|
href={contactLink}
|
|
425
|
-
target={
|
|
441
|
+
target={PAGE.BLANK}>Contact Form</a> or contact us directly:
|
|
442
|
+
</p>
|
|
426
443
|
<p>
|
|
427
|
-
<strong>{
|
|
428
|
-
📧 General Inquiries: {
|
|
429
|
-
🔐 Secure Email: {
|
|
430
|
-
📞 Phone: {
|
|
444
|
+
<strong>{COMPANY_INFO.NAME}</strong><br />
|
|
445
|
+
📧 General Inquiries: {CONTACT.EMAIL}<br />
|
|
446
|
+
🔐 Secure Email: {CONTACT.SECURE}<br />
|
|
447
|
+
📞 Phone: {CONTACT.PHONE}
|
|
431
448
|
</p>
|
|
432
449
|
{/if}
|
|
433
450
|
|
|
434
451
|
<!-- Back to Top Link -->
|
|
435
|
-
<span class={
|
|
436
|
-
<a href={
|
|
452
|
+
<span class={classSmall}>
|
|
453
|
+
<a href={NAV.HREFTOP}>{NAV.BACKTOP}</a>
|
|
437
454
|
</span>
|
|
438
455
|
</section>
|
|
439
456
|
{/each}
|
|
@@ -9,69 +9,72 @@ 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 {
|
|
13
|
-
/** @type {(type: 'enable' | 'disable') => void} */
|
|
12
|
+
import { trackingStatus } from "$lib/stores/trackingStatus.js";
|
|
14
13
|
import {
|
|
14
|
+
/** @type {(type: 'enable' | 'disable') => void} */
|
|
15
15
|
setTrackingPreference,
|
|
16
|
+
/** @type {() => void} */
|
|
16
17
|
clearTrackingPreferences,
|
|
17
18
|
} from "$lib/utils/trackingCookies.js";
|
|
18
19
|
import { CONSTANTS } from "$lib";
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
//console.log("Base path:", base);
|
|
21
|
+
console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
/** @type {typeof CONSTANTS.CONTACT} */
|
|
24
|
+
const CONTACT = CONSTANTS.CONTACT;
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
/** @type {typeof CONSTANTS.PAGE} */
|
|
27
|
+
const PAGE = CONSTANTS.PAGE;
|
|
26
28
|
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
29
|
+
/** @type {typeof CONSTANTS.NAV} */
|
|
30
|
+
const NAV = CONSTANTS.NAV;
|
|
31
|
+
|
|
32
|
+
/** @type {string} */
|
|
31
33
|
const spaceStyle = "spacer";
|
|
32
34
|
|
|
33
|
-
/**
|
|
34
|
-
* URL to the full Privacy Policy using the base path
|
|
35
|
-
* @type {string}
|
|
36
|
-
*/
|
|
35
|
+
/** @type {string} */
|
|
37
36
|
const privacyPolicy = `${base}/privacy`;
|
|
37
|
+
|
|
38
|
+
/** @type {string} */
|
|
38
39
|
const prightsLink = `${base}/privacy-rights`;
|
|
39
40
|
|
|
40
|
-
/**
|
|
41
|
-
|
|
42
|
-
* @type {{
|
|
43
|
-
* classSmall: string,
|
|
44
|
-
* rel: string,
|
|
45
|
-
* backTop: string,
|
|
46
|
-
* hrefTop: string,
|
|
47
|
-
* targetSelf: string,
|
|
48
|
-
* targetBlank: string
|
|
49
|
-
* }}
|
|
50
|
-
*/
|
|
51
|
-
const constants = {
|
|
52
|
-
classSmall: "small-text",
|
|
53
|
-
rel: "noopener noreferrer",
|
|
54
|
-
backTop: "Back to top",
|
|
55
|
-
hrefTop: "#top",
|
|
56
|
-
targetSelf: "_self",
|
|
57
|
-
targetBlank: "_blank",
|
|
58
|
-
};
|
|
41
|
+
/** @type {string} */
|
|
42
|
+
const classSmall = "small-text";
|
|
59
43
|
|
|
44
|
+
/** @type {boolean} */
|
|
60
45
|
let optedOut = false;
|
|
46
|
+
|
|
47
|
+
/** @type {boolean} */
|
|
61
48
|
let optedIn = false;
|
|
62
|
-
let trackingStatus = "";
|
|
63
49
|
|
|
64
|
-
|
|
65
|
-
|
|
50
|
+
/**
|
|
51
|
+
* Refreshes tracking preferences state and updates the reactive store.
|
|
52
|
+
* Uses dynamic import to prevent SSR from loading browser-only dependencies.
|
|
53
|
+
*
|
|
54
|
+
* @returns {Promise<void>}
|
|
55
|
+
*/
|
|
56
|
+
async function refreshTrackingStatus() {
|
|
57
|
+
/** @type {typeof import("$lib/utils/trackingStatus.js")} */
|
|
58
|
+
const tracking = await import("$lib/utils/trackingStatus.js");
|
|
59
|
+
|
|
60
|
+
const prefs = tracking.getTrackingPreferences();
|
|
66
61
|
optedOut = prefs.optedOut;
|
|
67
62
|
optedIn = prefs.optedIn;
|
|
68
|
-
trackingStatus
|
|
69
|
-
|
|
63
|
+
trackingStatus.set(prefs.status);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Initializes tracking state on component mount (runs only in browser).
|
|
68
|
+
*/
|
|
69
|
+
onMount(() => {
|
|
70
|
+
refreshTrackingStatus();
|
|
70
71
|
});
|
|
71
72
|
|
|
72
73
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
74
|
+
* Toggles opt-out tracking state, updates cookie and tracking store.
|
|
75
|
+
*
|
|
76
|
+
* @param {boolean} value - Whether the user is opting out
|
|
77
|
+
* @returns {void}
|
|
75
78
|
*/
|
|
76
79
|
function toggleTracking(value) {
|
|
77
80
|
optedOut = value;
|
|
@@ -82,11 +85,14 @@ This file is part of Network Pro.
|
|
|
82
85
|
console.log("[Tracking] User cleared opt-out");
|
|
83
86
|
clearTrackingPreferences();
|
|
84
87
|
}
|
|
88
|
+
refreshTrackingStatus();
|
|
85
89
|
}
|
|
86
90
|
|
|
87
91
|
/**
|
|
88
|
-
*
|
|
89
|
-
*
|
|
92
|
+
* Toggles opt-in tracking state, updates cookie and tracking store.
|
|
93
|
+
*
|
|
94
|
+
* @param {boolean} value - Whether the user is opting in
|
|
95
|
+
* @returns {void}
|
|
90
96
|
*/
|
|
91
97
|
function toggleOptIn(value) {
|
|
92
98
|
optedIn = value;
|
|
@@ -97,15 +103,16 @@ This file is part of Network Pro.
|
|
|
97
103
|
console.log("[Tracking] User cleared opt-in");
|
|
98
104
|
clearTrackingPreferences();
|
|
99
105
|
}
|
|
106
|
+
refreshTrackingStatus();
|
|
100
107
|
}
|
|
101
108
|
</script>
|
|
102
109
|
|
|
103
110
|
<section id="top">
|
|
104
|
-
<span class={
|
|
111
|
+
<span class={classSmall}>
|
|
105
112
|
<a
|
|
106
|
-
rel={
|
|
113
|
+
rel={PAGE.REL}
|
|
107
114
|
href="https://spdx.dev/learn/handling-license-info"
|
|
108
|
-
target={
|
|
115
|
+
target={PAGE.BLANK}>
|
|
109
116
|
SPDX License Identifier
|
|
110
117
|
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
111
118
|
</span>
|
|
@@ -119,18 +126,13 @@ This file is part of Network Pro.
|
|
|
119
126
|
|
|
120
127
|
<nav class="tracking-nav">
|
|
121
128
|
<ul>
|
|
122
|
-
<li
|
|
123
|
-
|
|
124
|
-
></li>
|
|
125
|
-
<li
|
|
126
|
-
><a href="#rights" target={constants.targetSelf}
|
|
127
|
-
>Your Rights and Choices</a
|
|
128
|
-
></li>
|
|
129
|
+
<li><a href="#tracking" target={PAGE.SELF}>Tracking Preferences</a></li>
|
|
130
|
+
<li><a href="#rights" target={PAGE.SELF}>Your Rights and Choices</a></li>
|
|
129
131
|
</ul>
|
|
130
132
|
</nav>
|
|
131
133
|
|
|
132
134
|
<p class="bquote">
|
|
133
|
-
For full details, please see our <a href={privacyPolicy} target=
|
|
135
|
+
For full details, please see our <a href={privacyPolicy} target={PAGE.SELF}
|
|
134
136
|
>Privacy Policy</a
|
|
135
137
|
>.
|
|
136
138
|
</p>
|
|
@@ -147,11 +149,10 @@ This file is part of Network Pro.
|
|
|
147
149
|
<p>
|
|
148
150
|
<strong
|
|
149
151
|
>Analytics tracking is automatically disabled when a user's browser sends
|
|
150
|
-
a
|
|
151
|
-
rel={
|
|
152
|
+
a "Do Not Track" (DNT) or <a
|
|
153
|
+
rel={PAGE.REL}
|
|
152
154
|
href="https://globalprivacycontrol.org/"
|
|
153
|
-
target={
|
|
154
|
-
>“Global Privacy Control” (GPC / Sec-GPC)</a> signal.</strong>
|
|
155
|
+
target={PAGE.BLANK}>"Global Privacy Control" (GPC / Sec-GPC)</a> signal.</strong>
|
|
155
156
|
No further action is required—your browser settings are honored by default.
|
|
156
157
|
</p>
|
|
157
158
|
|
|
@@ -166,10 +167,17 @@ This file is part of Network Pro.
|
|
|
166
167
|
|
|
167
168
|
|
|
168
169
|
|
|
169
|
-
|
|
170
|
-
<
|
|
171
|
-
|
|
172
|
-
|
|
170
|
+
{#if $trackingStatus !== "⏳ Checking tracking preferences..."}
|
|
171
|
+
<p id="tracking-status" aria-live="polite">
|
|
172
|
+
<strong>Tracking Status:</strong>
|
|
173
|
+
{$trackingStatus}
|
|
174
|
+
</p>
|
|
175
|
+
{:else}
|
|
176
|
+
<p id="tracking-status" aria-live="polite">
|
|
177
|
+
<strong>Tracking Status:</strong>
|
|
178
|
+
<em>Loading…</em>
|
|
179
|
+
</p>
|
|
180
|
+
{/if}
|
|
173
181
|
|
|
174
182
|
<!-- Opt-out checkbox -->
|
|
175
183
|
<label>
|
|
@@ -205,9 +213,8 @@ This file is part of Network Pro.
|
|
|
205
213
|
</p>
|
|
206
214
|
</section>
|
|
207
215
|
|
|
208
|
-
<span class={
|
|
209
|
-
<a href={
|
|
210
|
-
>{constants.backTop}</a>
|
|
216
|
+
<span class={classSmall}>
|
|
217
|
+
<a href={NAV.HREFTOP} target={PAGE.SELF}>{NAV.BACKTOP}</a>
|
|
211
218
|
</span>
|
|
212
219
|
|
|
213
220
|
<div class={spaceStyle}></div>
|
|
@@ -243,30 +250,27 @@ This file is part of Network Pro.
|
|
|
243
250
|
<p>
|
|
244
251
|
Although these rights are specifically granted to residents of California
|
|
245
252
|
and the European Union under laws such as the <a
|
|
246
|
-
rel={
|
|
253
|
+
rel={PAGE.REL}
|
|
247
254
|
href="https://oag.ca.gov/privacy/ccpa"
|
|
248
|
-
target={
|
|
255
|
+
target={PAGE.BLANK}>California Consumer Privacy Act (CCPA)</a
|
|
249
256
|
>, the California Privacy Rights Act (CPRA), and the
|
|
250
|
-
<a
|
|
251
|
-
rel={constants.rel}
|
|
252
|
-
href="https://gdpr.eu/what-is-gdpr/"
|
|
253
|
-
target={constants.targetBlank}
|
|
257
|
+
<a rel={PAGE.REL} href="https://gdpr.eu/what-is-gdpr/" target={PAGE.BLANK}
|
|
254
258
|
>EU General Data Protection Regulation (GDPR)</a
|
|
255
259
|
>, we voluntarily extend these rights to all users, regardless of residency.
|
|
256
260
|
</p>
|
|
257
261
|
<p>
|
|
258
262
|
To exercise any of these rights, you may submit a request through our <a
|
|
263
|
+
rel={PAGE.REL}
|
|
259
264
|
href={prightsLink}
|
|
260
|
-
target={
|
|
265
|
+
target={PAGE.BLANK}>Privacy Rights Request Form</a
|
|
261
266
|
>. Alternatively, you can email us at
|
|
262
|
-
<strong>{
|
|
267
|
+
<strong>{CONTACT.PRIVACY}</strong>
|
|
263
268
|
with the subject line: "<strong>Privacy Rights Preferences</strong>".
|
|
264
269
|
</p>
|
|
265
270
|
</section>
|
|
266
271
|
|
|
267
|
-
<span class={
|
|
268
|
-
<a href={
|
|
269
|
-
>{constants.backTop}</a>
|
|
272
|
+
<span class={classSmall}>
|
|
273
|
+
<a href={NAV.HREFTOP} target={PAGE.SELF}>{NAV.BACKTOP}</a>
|
|
270
274
|
</span>
|
|
271
275
|
|
|
272
276
|
<!-- cspell:ignore prefs prights -->
|
|
@@ -15,9 +15,9 @@ This file is part of Network Pro.
|
|
|
15
15
|
// Log the base path to verify its value
|
|
16
16
|
//console.log("Base path:", base);
|
|
17
17
|
|
|
18
|
-
console.log(CONSTANTS.APP_NAME);
|
|
18
|
+
console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
|
|
19
19
|
|
|
20
|
-
const {
|
|
20
|
+
const { COMPANY_INFO, PAGE, NAV } = CONSTANTS;
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* URL to Terms of Use page, using the base path
|
|
@@ -35,20 +35,12 @@ This file is part of Network Pro.
|
|
|
35
35
|
* Common constants used throughout the component
|
|
36
36
|
* @type {{
|
|
37
37
|
* effectiveDate: string,
|
|
38
|
-
* rel: string,
|
|
39
|
-
* targetBlank: string,
|
|
40
|
-
* targetSelf: string,
|
|
41
38
|
* classSmall: string,
|
|
42
|
-
* hrefTop: string
|
|
43
39
|
* }}
|
|
44
40
|
*/
|
|
45
41
|
const constants = {
|
|
46
42
|
effectiveDate: "May 8, 2025",
|
|
47
|
-
rel: "noopener noreferrer",
|
|
48
|
-
targetBlank: "_blank",
|
|
49
|
-
targetSelf: "_self",
|
|
50
43
|
classSmall: "small-text",
|
|
51
|
-
hrefTop: "#top",
|
|
52
44
|
};
|
|
53
45
|
|
|
54
46
|
/**
|
|
@@ -73,7 +65,10 @@ This file is part of Network Pro.
|
|
|
73
65
|
<!-- BEGIN TITLE -->
|
|
74
66
|
<section id="top">
|
|
75
67
|
<span class={constants.classSmall}>
|
|
76
|
-
<a
|
|
68
|
+
<a
|
|
69
|
+
rel={PAGE.REL}
|
|
70
|
+
href="https://spdx.dev/learn/handling-license-info"
|
|
71
|
+
target={PAGE.BLANK}>
|
|
77
72
|
SPDX License Identifier
|
|
78
73
|
</a>: <code>CC-BY-4.0 OR GPL-3.0-or-later</code>
|
|
79
74
|
</span>
|
|
@@ -82,7 +77,7 @@ This file is part of Network Pro.
|
|
|
82
77
|
<section id="page-title">
|
|
83
78
|
<h1>Consulting Terms and Conditions</h1>
|
|
84
79
|
<p>
|
|
85
|
-
<strong>{
|
|
80
|
+
<strong>{COMPANY_INFO.NAME}<br />Effective Date:</strong>
|
|
86
81
|
{constants.effectiveDate}
|
|
87
82
|
</p>
|
|
88
83
|
</section>
|
|
@@ -104,7 +99,7 @@ This file is part of Network Pro.
|
|
|
104
99
|
These Terms and Conditions apply exclusively to the provision of our
|
|
105
100
|
consulting and implementation services. For all other uses of our website and
|
|
106
101
|
associated platforms, please refer to the applicable
|
|
107
|
-
<a href={termsLink} target={
|
|
102
|
+
<a href={termsLink} target={PAGE.SELF}> Website Terms of Use </a>.
|
|
108
103
|
</p>
|
|
109
104
|
|
|
110
105
|
<hr />
|
|
@@ -115,9 +110,9 @@ This file is part of Network Pro.
|
|
|
115
110
|
<strong>Formats Available:</strong> <span class="visited"
|
|
116
111
|
>HTML</span>
|
|
117
112
|
|
|
|
118
|
-
<a href={tandcLink} target={
|
|
113
|
+
<a href={tandcLink} target={PAGE.SELF}>Docs</a>
|
|
119
114
|
|
|
|
120
|
-
<a href="/assets/consulting-terms.pdf" target={
|
|
115
|
+
<a href="/assets/consulting-terms.pdf" target={PAGE.BLANK}>
|
|
121
116
|
PDF <span class="fas fa-file-arrow-down"></span>
|
|
122
117
|
</a>
|
|
123
118
|
</sup>
|
|
@@ -132,8 +127,8 @@ This file is part of Network Pro.
|
|
|
132
127
|
<p>
|
|
133
128
|
By engaging with the information security, network security,
|
|
134
129
|
cybersecurity, and digital privacy consulting and implementation
|
|
135
|
-
services provided by {
|
|
136
|
-
agree to be bound by these Terms and Conditions ("Terms").
|
|
130
|
+
services provided by {COMPANY_INFO.NAME} ("Company," "we," "us," or "our"),
|
|
131
|
+
you ("Client") agree to be bound by these Terms and Conditions ("Terms").
|
|
137
132
|
<strong>
|
|
138
133
|
These Terms govern all engagements except where explicitly superseded
|
|
139
134
|
by a separate written agreement or Statement of Work (SOW).
|
|
@@ -237,7 +232,7 @@ This file is part of Network Pro.
|
|
|
237
232
|
{/if}
|
|
238
233
|
|
|
239
234
|
<span class={constants.classSmall}
|
|
240
|
-
><a href={
|
|
235
|
+
><a href={NAV.HREFTOP}>{NAV.BACKTOP}</a></span>
|
|
241
236
|
</section>
|
|
242
237
|
{/each}
|
|
243
238
|
<!-- END TERMS AND CONDITIONS -->
|