@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.
@@ -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 { getTrackingPreferences } from "$lib/utils/trackingStatus.js";
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
- // Log the base path to verify its value
21
- //console.log("Base path:", base);
21
+ console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
22
22
 
23
- console.log(CONSTANTS.APP_NAME);
23
+ /** @type {typeof CONSTANTS.COMPANY_INFO} */
24
+ const COMPANY_INFO = CONSTANTS.COMPANY_INFO;
24
25
 
25
- /**
26
- * URL to the Privacy Rights Request Form redirect route, using the base path
27
- * URL to the Contact Form redirect route, using the base path
28
- * URL to the Privacy Dashboard using the base path
29
- * @type {string}
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
- * Constants used throughout the component for consistent styling and behavior
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
- onMount(() => {
90
- const prefs = getTrackingPreferences();
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 = prefs.status;
94
- console.log("[Tracking] Status:", trackingStatus);
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
- * Toggle tracking opt-out.
99
- * @param {boolean} value
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
- * Toggle tracking opt-in.
114
- * @param {boolean} value
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={constants.classSmall}>
141
+ <span class={classSmall}>
131
142
  <a
132
- rel={constants.rel}
143
+ rel={PAGE.REL}
133
144
  href="https://spdx.dev/learn/handling-license-info"
134
- target={constants.targetBlank}>
145
+ target={PAGE.BLANK}>
135
146
  SPDX License Identifier
136
147
  </a>: &nbsp;<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>{CONSTANTS.COMPANY}</strong><br />
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> &nbsp;<span class="visited"
168
179
  >HTML</span>
169
180
  |
170
- <a href={privacyLink} target={constants.targetSelf}>Docs</a>
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={constants.rel}
202
+ rel={PAGE.REL}
192
203
  href="https://www.azleg.gov/arstitle"
193
- target={constants.targetBlank}>
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 Do Not Track (DNT) or <a
236
- rel={constants.rel}
246
+ sends a "Do Not Track" (DNT) or <a
247
+ rel={PAGE.REL}
237
248
  href={gpcLink}
238
- target={constants.targetBlank}
239
- >“Global Privacy Control” (GPC / Sec-GPC)</a> signal.</strong> No further
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={constants.targetSelf}>Privacy Dashboard</a
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
- <p id="tracking-status" aria-live="polite">
261
- <strong>Tracking Status:</strong>
262
- {trackingStatus}
263
- </p>
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={constants.rel}
316
+ rel={PAGE.REL}
300
317
  href="https://posthog.com/privacy"
301
- target={constants.targetBlank}>PostHog's Privacy Policy</a
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={constants.rel}
399
+ rel={PAGE.REL}
383
400
  href="https://oag.ca.gov/privacy/ccpa"
384
- target={constants.targetBlank}
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={constants.rel}
404
+ rel={PAGE.REL}
389
405
  href="https://gdpr.eu/what-is-gdpr/"
390
- target={constants.targetBlank}
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={constants.targetBlank}>Privacy Rights Request Form</a
414
+ target={PAGE.BLANK}>Privacy Rights Request Form</a
399
415
  >. Alternatively, you can email us at
400
- <strong>{CONSTANTS.PRIVACY_EMAIL}</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
- >For questions, please utilize our <a
423
- rel={constants.rel}
437
+ <p>
438
+ For questions, please utilize our <a
439
+ rel={PAGE.REL}
424
440
  href={contactLink}
425
- target={constants.targetSelf}>Contact Form</a> or contact us directly:</p>
441
+ target={PAGE.BLANK}>Contact Form</a> or contact us directly:
442
+ </p>
426
443
  <p>
427
- <strong>{CONSTANTS.COMPANY}</strong><br />
428
- 📧 General Inquiries: {CONSTANTS.CONTACT_EMAIL}<br />
429
- 🔐 Secure Email: {CONSTANTS.SECURE_EMAIL}<br />
430
- 📞 Phone: {CONSTANTS.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={constants.classSmall}>
436
- <a href={constants.hrefTop}>{constants.backTop}</a>
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 { getTrackingPreferences } from "$lib/utils/trackingStatus.js";
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
- // Log the base path to verify its value
21
- //console.log("Base path:", base);
21
+ console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
22
22
 
23
- console.log(CONSTANTS.APP_NAME);
23
+ /** @type {typeof CONSTANTS.CONTACT} */
24
+ const CONTACT = CONSTANTS.CONTACT;
24
25
 
25
- const { PRIVACY_EMAIL } = CONSTANTS;
26
+ /** @type {typeof CONSTANTS.PAGE} */
27
+ const PAGE = CONSTANTS.PAGE;
26
28
 
27
- /**
28
- * @type {string}
29
- * Style class for the div element.
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
- * Constants used throughout the component for consistent styling and behavior
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
- onMount(() => {
65
- const prefs = getTrackingPreferences();
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 = prefs.status;
69
- console.log("[Tracking] Status:", trackingStatus);
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
- * Toggle tracking opt-out.
74
- * @param {boolean} value
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
- * Toggle tracking opt-in.
89
- * @param {boolean} value
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={constants.classSmall}>
111
+ <span class={classSmall}>
105
112
  <a
106
- rel={constants.rel}
113
+ rel={PAGE.REL}
107
114
  href="https://spdx.dev/learn/handling-license-info"
108
- target={constants.targetBlank}>
115
+ target={PAGE.BLANK}>
109
116
  SPDX License Identifier
110
117
  </a>: &nbsp;<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
- ><a href="#tracking" target={constants.targetSelf}>Tracking Preferences</a
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="_self"
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 Do Not Track (DNT) or <a
151
- rel={constants.rel}
152
+ a "Do Not Track" (DNT) or <a
153
+ rel={PAGE.REL}
152
154
  href="https://globalprivacycontrol.org/"
153
- target={constants.targetBlank}
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
  &nbsp;
168
169
 
169
- <p id="tracking-status" aria-live="polite">
170
- <strong>Tracking Status:</strong>
171
- {trackingStatus}
172
- </p>
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={constants.classSmall}>
209
- <a href={constants.hrefTop} target={constants.targetSelf}
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={constants.rel}
253
+ rel={PAGE.REL}
247
254
  href="https://oag.ca.gov/privacy/ccpa"
248
- target={constants.targetBlank}>California Consumer Privacy Act (CCPA)</a
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={constants.targetBlank}>Privacy Rights Request Form</a
265
+ target={PAGE.BLANK}>Privacy Rights Request Form</a
261
266
  >. Alternatively, you can email us at
262
- <strong>{PRIVACY_EMAIL}</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={constants.classSmall}>
268
- <a href={constants.hrefTop} target={constants.targetSelf}
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 { COMPANY } = CONSTANTS;
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 rel={constants.rel} href="https://spdx.dev/learn/handling-license-info">
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>: &nbsp;<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>{COMPANY}<br />Effective Date:</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={constants.targetSelf}> Website Terms of Use </a>.
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> &nbsp;<span class="visited"
116
111
  >HTML</span>
117
112
  |
118
- <a href={tandcLink} target={constants.targetSelf}>Docs</a>
113
+ <a href={tandcLink} target={PAGE.SELF}>Docs</a>
119
114
  |
120
- <a href="/assets/consulting-terms.pdf" target={constants.targetBlank}>
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 {COMPANY} ("Company," "we," "us," or "our"), you ("Client")
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={constants.hrefTop}>Back to top</a></span>
235
+ ><a href={NAV.HREFTOP}>{NAV.BACKTOP}</a></span>
241
236
  </section>
242
237
  {/each}
243
238
  <!-- END TERMS AND CONDITIONS -->