@networkpro/web 1.21.0 → 1.22.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.
Files changed (43) hide show
  1. package/.editorconfig +1 -3
  2. package/.env.template +0 -2
  3. package/.gitattributes +0 -2
  4. package/.markdownlint.mjs +1 -1
  5. package/.prettierignore +0 -2
  6. package/.stylelintignore +0 -2
  7. package/CHANGELOG.md +89 -1
  8. package/package.json +8 -8
  9. package/src/app.html +1 -12
  10. package/src/lib/components/Logo.svelte +2 -7
  11. package/src/lib/components/layout/HeaderDefault.svelte +2 -3
  12. package/src/lib/data/fossData.js +8 -0
  13. package/src/lib/data/pgpKeys.js +82 -0
  14. package/src/lib/images.js +46 -17
  15. package/src/lib/index.js +8 -2
  16. package/src/lib/pages/AboutContent.svelte +97 -100
  17. package/src/lib/pages/HomeContent.svelte +11 -8
  18. package/src/lib/pages/PGPContent.svelte +19 -40
  19. package/src/lib/pages/ServicesContent.svelte +5 -2
  20. package/src/lib/styles/css/default.css +1 -1
  21. package/src/lib/styles/global.min.css +1 -1
  22. package/src/lib/types/appConstants.js +6 -3
  23. package/src/routes/relay-[slug]/[...catchall]/+server.js +68 -0
  24. package/src/service-worker.js +3 -11
  25. package/static/icon-about.png +0 -0
  26. package/static/manifest.json +17 -4
  27. package/static/pgp/support@netwk.pro.asc +77 -0
  28. package/static/sitemap.xml +5 -5
  29. package/stylelint.config.js +0 -6
  30. package/src/lib/img/qr/pgp-github.png +0 -0
  31. package/src/lib/img/qr/pgp-github.webp +0 -0
  32. package/static/pgp/pgp-contact.png +0 -0
  33. package/static/pgp/pgp-contact.webp +0 -0
  34. package/static/pgp/pgp-github.png +0 -0
  35. package/static/pgp/pgp-github.webp +0 -0
  36. package/static/pgp/pgp-security.png +0 -0
  37. package/static/pgp/pgp-security.webp +0 -0
  38. package/static/pgp/pgp-support.png +0 -0
  39. package/static/pgp/pgp-support.webp +0 -0
  40. package/static/pgp/support@neteng.pro.asc +0 -47
  41. package/static/pgp/vcard.png +0 -0
  42. package/static/pgp/vcard.webp +0 -0
  43. /package/{static → src/lib}/img/powered-by-proton.svg +0 -0
@@ -7,16 +7,8 @@ This file is part of Network Pro.
7
7
  ========================================================================== -->
8
8
 
9
9
  <script>
10
- import {
11
- pgpContactPng,
12
- pgpContactWbp,
13
- pgpSupportPng,
14
- pgpSupportWbp,
15
- vcfPng,
16
- vcfWbp,
17
- } from '$lib';
10
+ import { CONSTANTS, getQR, PGP_KEYS } from '$lib';
18
11
  import { base } from '$app/paths';
19
- import { CONSTANTS } from '$lib';
20
12
 
21
13
  // Log the base path to verify its value
22
14
  //console.log("Base path:", base);
@@ -24,6 +16,9 @@ This file is part of Network Pro.
24
16
  //console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
25
17
 
26
18
  const { COMPANY_INFO, CONTACT, PAGE } = CONSTANTS;
19
+ const pgpKeys = PGP_KEYS.filter(
20
+ (k) => k.id === 'pgp-support' || k.id === 'pgp-contact',
21
+ );
27
22
 
28
23
  /**
29
24
  * URL to the Contact Form route, using the base path
@@ -37,6 +32,12 @@ This file is part of Network Pro.
37
32
  */
38
33
  const consultLink = `${base}/consultation`;
39
34
 
35
+ /**
36
+ * URL to the Services route, using the base path
37
+ * @type {string}
38
+ */
39
+ const servLink = `${base}/services`;
40
+
40
41
  /**
41
42
  * URL to the PGP route, using the base path
42
43
  * @type {string}
@@ -74,60 +75,35 @@ This file is part of Network Pro.
74
75
  {
75
76
  label: 'SPDX License Identifier',
76
77
  href: 'https://spdx.dev/learn/handling-license-info',
77
- target: '_blank',
78
+ target: PAGE.BLANK,
78
79
  text: 'CC-BY-4.0 OR GPL-3.0-or-later',
79
80
  },
80
81
  {
81
82
  label: 'Docs',
82
83
  href: 'https://docs.netwk.pro',
83
- target: '_self',
84
- },
85
- ];
86
-
87
- /**
88
- * PGP key information for contact emails
89
- * @type {Array<{
90
- * label: string,
91
- * qrSrc: string,
92
- * qrWbp: string,
93
- * keySearch: string,
94
- * fingerprint: string[]
95
- * }>}
96
- */
97
- const pgpKeys = [
98
- {
99
- label: 'support@neteng.pro',
100
- qrSrc: pgpSupportPng,
101
- qrWbp: pgpSupportWbp,
102
- keySearch: 'https://keys.openpgp.org/search?q=support%40neteng.pro',
103
- fingerprint: ['6590B992E2E3EFF12738', '7BCE2AF093E9DEC61BA0'],
104
- },
105
- {
106
- label: 'contact@s.neteng.pro',
107
- qrSrc: pgpContactPng,
108
- qrWbp: pgpContactWbp,
109
- keySearch: 'https://keys.openpgp.org/search?q=contact%40s.neteng.pro',
110
- fingerprint: ['DF118BAA6C2D9DCDEBDC', '2DDCF99373499495F957'],
84
+ target: PAGE.SELF,
111
85
  },
112
86
  ];
113
87
 
114
88
  /**
115
89
  * @typedef {Object} ContactAssets
116
- * @property {string} vcf
117
- * @property {string} qrSrc
118
- * @property {string} qrWbp
119
- * @property {string} supportAsc
120
- * @property {string} contactAsc
90
+ * @property {string} vcf - Path to the downloadable vCard file.
91
+ * @property {string} [png] - PNG version of the vCard QR code.
92
+ * @property {string} [webp] - WebP version of the vCard QR code.
93
+ * @property {string} supportAsc - Path to the general support PGP key.
94
+ * @property {string} contactAsc - Path to the secure contact PGP key.
121
95
  */
122
96
 
123
97
  /** @type {ContactAssets} */
124
98
  const contactAssets = {
125
99
  vcf: '/bin/contact.vcf',
126
- qrSrc: vcfPng,
127
- qrWbp: vcfWbp,
128
- supportAsc: '/pgp/support@neteng.pro.asc',
100
+ ...getQR('vcard'),
101
+ supportAsc: '/pgp/support@netwk.pro.asc',
129
102
  contactAsc: '/pgp/contact@s.neteng.pro.asc',
130
103
  };
104
+
105
+ $: supportFp = pgpKeys[0]?.fingerprint?.split(' ') ?? [];
106
+ $: contactFp = pgpKeys[1]?.fingerprint?.split(' ') ?? [];
131
107
  </script>
132
108
 
133
109
  <!-- BEGIN TITLE -->
@@ -148,7 +124,7 @@ This file is part of Network Pro.
148
124
  </p>
149
125
  </section>
150
126
 
151
- &nbsp;
127
+ <div class="spacer"></div>
152
128
 
153
129
  <section id="subhead">
154
130
  <h2>Security That Respects You</h2>
@@ -211,10 +187,11 @@ This file is part of Network Pro.
211
187
  <div class="spacer"></div>
212
188
 
213
189
  <p>
214
- Additionally, {COMPANY_INFO.APP_NAME}&trade; provides on-site services in the
215
- Greater Phoenix Metro Area (Maricopa County, AZ). Our on-site services are
216
- available to both businesses and consumers. In addition to consulting, we
217
- offer the following services:
190
+ Additionally, {COMPANY_INFO.APP_NAME}&trade; provides
191
+ <a href={servLink} target={PAGE.SELF}>on-site services</a>
192
+ in the Greater Phoenix Metro Area (Maricopa County, AZ). Our
193
+ <a href={servLink} target={PAGE.SELF}>on-site services</a> are available to both
194
+ consumers and businesses. In addition to consulting, we offer the following services:
218
195
  </p>
219
196
 
220
197
  <ul>
@@ -253,8 +230,14 @@ This file is part of Network Pro.
253
230
  <p>
254
231
  <strong>{COMPANY_INFO.NAME}</strong><br />
255
232
  📞 Phone: {CONTACT.PHONE}<br />
256
- 📧 General Inquiries: {CONTACT.EMAIL}<br />
257
- 🔐 Secure Email: {CONTACT.SECURE}
233
+ 📧 General Inquiries:
234
+ <a href={`mailto:${CONTACT.EMAIL_LINK}`} target={PAGE.BLANK}>
235
+ {CONTACT.EMAIL_LINK}
236
+ </a><br />
237
+ 🔐 Secure Email:
238
+ <a href={`mailto:${CONTACT.SECURE_LINK}`} target={PAGE.BLANK}>
239
+ {CONTACT.SECURE_LINK}
240
+ </a>
258
241
  </p>
259
242
 
260
243
  <div class="spacer"></div>
@@ -275,74 +258,84 @@ This file is part of Network Pro.
275
258
  <div class="pgp-wrap">
276
259
  <table class="pgp">
277
260
  <tbody>
278
- <!-- Row 0 (First row) remains unchanged -->
261
+ <!-- Row 0 (Support) -->
279
262
  <tr>
280
263
  <td class="pgp-col1">
281
264
  <picture>
282
- <source srcset={pgpKeys[0].qrWbp} type="image/webp" />
265
+ <source srcset={pgpKeys[0].webp} type="image/webp" />
283
266
  <img
284
267
  {decoding}
285
268
  {loading}
286
- src={pgpKeys[0].qrSrc}
269
+ src={pgpKeys[0].png}
287
270
  class="pgp-image"
288
- alt={`PGP Key - ${pgpKeys[0].label}`} />
271
+ alt={`QR code for ${pgpKeys[0].email}`} />
289
272
  </picture>
290
273
  </td>
291
274
  <td class="pgp-col2">
292
- <a rel={PAGE.REL} href={pgpKeys[0].keySearch} target={PAGE.BLANK}>
293
- <strong>{pgpKeys[0].label}</strong>
294
- </a>
295
- <p
296
- ><strong
297
- ><a
298
- href={contactAssets.supportAsc}
299
- type="application/pgp-keys"
300
- download
301
- target={PAGE.BLANK}
302
- >asc &nbsp;<span class="fas fa-file-arrow-down"></span></a
303
- ></strong>
275
+ <p>
276
+ <strong
277
+ ><a rel={PAGE.REL} href={pgpKeys[0].opgp} target={PAGE.BLANK}>
278
+ {pgpKeys[0].email}
279
+ </a></strong>
304
280
  </p>
305
- <p
306
- >Fingerprint:<br />
307
- <span class="fingerprint">
308
- {pgpKeys[0].fingerprint.join('\n')}
309
- </span>
281
+ <p>
282
+ <a
283
+ href={pgpKeys[0].file}
284
+ type="application/pgp-keys"
285
+ download
286
+ target={PAGE.BLANK}>
287
+ asc &nbsp;<span class="fas fa-file-arrow-down"></span>
288
+ </a>
289
+ </p>
290
+ <p>
291
+ <strong>Fingerprint:</strong><br />
292
+ {#if supportFp.length}
293
+ <span class="fingerprint">
294
+ {supportFp.slice(0, supportFp.length / 2).join(' ')}<br />
295
+ {supportFp.slice(supportFp.length / 2).join(' ')}
296
+ </span>
297
+ {/if}
310
298
  </p>
311
299
  </td>
312
300
  </tr>
313
301
 
314
- <!-- Row 1 (Second row) has its columns swapped -->
302
+ <!-- Row 1 (Secure Contact) -->
315
303
  <tr>
316
304
  <td class="pgp-col1">
317
- <a rel={PAGE.REL} href={pgpKeys[1].keySearch} target={PAGE.BLANK}>
318
- <strong>{pgpKeys[1].label}</strong>
319
- </a>
320
305
  <p>
321
306
  <strong
322
- ><a
323
- href={contactAssets.contactAsc}
324
- type="application/pgp-keys"
325
- download
326
- target={PAGE.BLANK}
327
- >asc &nbsp;<span class="fas fa-file-arrow-down"></span></a
328
- ></strong>
307
+ ><a rel={PAGE.REL} href={pgpKeys[1].opgp} target={PAGE.BLANK}>
308
+ {pgpKeys[1].email}
309
+ </a></strong>
310
+ </p>
311
+ <p>
312
+ <a
313
+ href={pgpKeys[1].file}
314
+ type="application/pgp-keys"
315
+ download
316
+ target={PAGE.BLANK}>
317
+ asc &nbsp;<span class="fas fa-file-arrow-down"></span>
318
+ </a>
329
319
  </p>
330
- <p
331
- >Fingerprint:<br />
332
- <span class="fingerprint">
333
- {pgpKeys[1].fingerprint.join('\n')}
334
- </span>
320
+ <p>
321
+ <strong>Fingerprint:</strong><br />
322
+ {#if contactFp.length}
323
+ <span class="fingerprint">
324
+ {contactFp.slice(0, contactFp.length / 2).join(' ')}<br />
325
+ {contactFp.slice(contactFp.length / 2).join(' ')}
326
+ </span>
327
+ {/if}
335
328
  </p>
336
329
  </td>
337
330
  <td class="pgp-col2">
338
331
  <picture>
339
- <source srcset={pgpKeys[1].qrWbp} type="image/webp" />
332
+ <source srcset={pgpKeys[1].webp} type="image/webp" />
340
333
  <img
341
334
  {decoding}
342
335
  {loading}
343
- src={pgpKeys[1].qrSrc}
336
+ src={pgpKeys[1].png}
344
337
  class="pgp-image"
345
- alt={`PGP Key - ${pgpKeys[1].label}`} />
338
+ alt={`QR code for ${pgpKeys[1].email}`} />
346
339
  </picture>
347
340
  </td>
348
341
  </tr>
@@ -351,13 +344,17 @@ This file is part of Network Pro.
351
344
  <tr>
352
345
  <td class="pgp-col1">
353
346
  <picture>
354
- <source srcset={contactAssets.qrWbp} type="image/webp" />
355
- <img
356
- {decoding}
357
- {loading}
358
- src={contactAssets.qrSrc}
359
- class="pgp-image"
360
- alt="vCard" />
347
+ {#if contactAssets.webp}
348
+ <source srcset={contactAssets.webp} type="image/webp" />
349
+ {/if}
350
+ {#if contactAssets.png}
351
+ <img
352
+ {decoding}
353
+ {loading}
354
+ src={contactAssets.png}
355
+ class="pgp-image"
356
+ alt="vCard" />
357
+ {/if}
361
358
  </picture>
362
359
  </td>
363
360
  <td class="pgp-col2">
@@ -46,17 +46,17 @@ This file is part of Network Pro.
46
46
  <h3 class={classIndex}>🔒 Practical Cybersecurity. Trusted Expertise.</h3>
47
47
 
48
48
  <p class={classCenter}>
49
- At <strong>{COMPANY_INFO.NAME}</strong>, we specialize in network security,
50
- cybersecurity, and digital privacy consulting that meets today's real-world
51
- demands. Our remote-first approach combines technical depth with practical
52
- solutions—leveraging a strategic mix of open source and proprietary
49
+ At <strong>{COMPANY_INFO.NAME}</strong>, we specialize in network engineering
50
+ and security, cybersecurity, and digital privacy consulting that meets today's
51
+ real-world demands. Our remote-first approach combines technical depth with
52
+ practical solutions—leveraging a strategic mix of open source and proprietary
53
53
  technologies based on performance, scalability, and trustworthiness.
54
54
  </p>
55
55
 
56
56
  <p class={classCenter}>
57
57
  From secure network design to cloud infrastructure and perimeter defense, we
58
- help organizations build stronger, smarter security postures—without
59
- compromising flexibility or transparency.
58
+ help individuals and organizations build stronger, smarter security
59
+ postures—without compromising flexibility or transparency.
60
60
  </p>
61
61
 
62
62
  <p class={classCenter}>
@@ -76,9 +76,12 @@ This file is part of Network Pro.
76
76
  📞 <strong>Phone:</strong>
77
77
  {CONTACT.PHONE}<br />
78
78
  📧 <strong>General Inquiries:</strong>
79
- {CONTACT.EMAIL}<br />
79
+ <a href={`mailto:${CONTACT.EMAIL_LINK}`} target={PAGE.BLANK}
80
+ >{CONTACT.EMAIL_LINK}</a
81
+ ><br />
80
82
  🔐 <strong>Secure Email:</strong>
81
- {CONTACT.SECURE}
83
+ <a href={`mailto:${CONTACT.SECURE_LINK}`} target={PAGE.BLANK}
84
+ >{CONTACT.SECURE_LINK}</a>
82
85
  </p>
83
86
 
84
87
  &nbsp;
@@ -7,43 +7,16 @@ This file is part of Network Pro.
7
7
  ========================================================================== -->
8
8
 
9
9
  <script>
10
- import CodeBlock from '$lib/components/CodeBlock.svelte';
10
+ import { CONSTANTS, protonPower, getQR, PGP_KEYS as keys } from '$lib';
11
+ import { CodeBlock } from '$lib/components';
11
12
  import { base } from '$app/paths';
12
- import { CONSTANTS } from '$lib';
13
13
 
14
14
  // Log the base path to verify its value
15
15
  //console.log("Base path:", base);
16
16
 
17
17
  //console.log(CONSTANTS.COMPANY_INFO.APP_NAME);
18
18
 
19
- const { PAGE } = CONSTANTS;
20
-
21
- const keys = [
22
- {
23
- name: 'General Contact & Support',
24
- email: 'support (at) neteng.pro',
25
- fingerprint: '6590 B992 E2E3 EFF1 2738 7BCE 2AF0 93E9 DEC6 1BA0',
26
- opgp: 'https://keys.openpgp.org/search?q=support%40neteng.pro',
27
- file: '/pgp/support@neteng.pro.asc',
28
- img: 'pgp-support',
29
- },
30
- {
31
- name: 'Secure Email',
32
- email: 'contact (at) s.neteng.pro',
33
- fingerprint: 'DF11 8BAA 6C2D 9DCD EBDC 2DDC F993 7349 9495 F957',
34
- opgp: 'https://keys.openpgp.org/search?q=contact%40s.neteng.pro',
35
- file: '/pgp/contact@s.neteng.pro.asc',
36
- img: 'pgp-contact',
37
- },
38
- {
39
- name: 'Security Contact',
40
- email: 'security (at) s.neteng.pro',
41
- fingerprint: 'B7FE 1D4E 6CAB 3E71 4A9F DF6E 48CB 7290 C00D 0DA5',
42
- opgp: 'https://keys.openpgp.org/search?q=security%40s.neteng.pro',
43
- file: '/pgp/security@s.neteng.pro.asc',
44
- img: 'pgp-security',
45
- },
46
- ];
19
+ const { CONTACT, PAGE } = CONSTANTS;
47
20
 
48
21
  /**
49
22
  * Tracks which PGP key's fingerprint was last copied.
@@ -81,7 +54,7 @@ This file is part of Network Pro.
81
54
  </p>
82
55
  <p>
83
56
  <img
84
- src="/img/powered-by-proton.svg"
57
+ src={protonPower}
85
58
  alt="Powered by Proton"
86
59
  class="proton-img"
87
60
  loading="eager"
@@ -93,9 +66,9 @@ This file is part of Network Pro.
93
66
  </p>
94
67
 
95
68
  {#each keys as key, i}
96
- <section class="pgp-entry" aria-labelledby={`pgp-${key.img}`}>
69
+ <section class="pgp-entry" aria-labelledby={`pgp-${key.id}`}>
97
70
  <div class="pgp-text">
98
- <h2 id={`pgp-${key.img}`}>{key.name}</h2>
71
+ <h2 id={`pgp-${key.id}`}>{key.name}</h2>
99
72
  <h3>
100
73
  &lt;
101
74
  {#if key.opgp}
@@ -129,13 +102,19 @@ This file is part of Network Pro.
129
102
  </div>
130
103
  <div class="pgp-qr">
131
104
  <picture>
132
- <source srcset={`/pgp/${key.img}.webp`} type="image/webp" />
133
- <img
134
- src={`/pgp/${key.img}.png`}
135
- alt={`QR code for ${key.email}`}
136
- class="pgp-image"
137
- loading={i === 0 ? 'eager' : 'lazy'}
138
- decoding={i === 0 ? 'sync' : 'async'} />
105
+ {#if key.webp}
106
+ <source srcset={key.webp} type="image/webp" />
107
+ {/if}
108
+ {#if key.png}
109
+ <img
110
+ src={key.png}
111
+ alt={`QR code for ${key.email}`}
112
+ class="pgp-image"
113
+ loading={i === 0 ? 'eager' : 'lazy'}
114
+ decoding={i === 0 ? 'sync' : 'async'} />
115
+ {:else}
116
+ <p>QR image missing for {key.id}</p>
117
+ {/if}
139
118
  </picture>
140
119
  </div>
141
120
  </section>
@@ -44,7 +44,7 @@ This file is part of Network Pro.
44
44
  * @type {{ effectiveDate: string, classSmall: string }}
45
45
  */
46
46
  const constants = {
47
- effectiveDate: 'October 18, 2025',
47
+ effectiveDate: 'October 20, 2025',
48
48
  classSmall: 'small-text',
49
49
  };
50
50
  </script>
@@ -92,7 +92,10 @@ This file is part of Network Pro.
92
92
  <p>
93
93
  <strong>{COMPANY_INFO.NAME}</strong><br />
94
94
  📞 Phone: {CONTACT.PHONE}<br />
95
- 📧 General Inquiries: {CONTACT.EMAIL}<br />
95
+ 📧 General Inquiries:
96
+ <a href={`mailto:${CONTACT.EMAIL_LINK}`} target={PAGE.BLANK}
97
+ >{CONTACT.EMAIL_LINK}</a
98
+ ><br />
96
99
  </p>
97
100
 
98
101
  <div class="spacer"></div>
@@ -552,7 +552,7 @@ footer .container {
552
552
 
553
553
  .fingerprint {
554
554
  display: block;
555
- font-weight: bold;
555
+ font-family: monospace;
556
556
  white-space: pre-line; /* Ensures newlines are respected for "\n" */
557
557
  }
558
558
 
@@ -3,4 +3,4 @@ Copyright © 2025 Network Pro Strategies (Network Pro™)
3
3
  SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
4
4
  This file is part of Network Pro.
5
5
  ========================================================================== */
6
- html{-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{margin:.67em 0;font-size:2em}hr{box-sizing:content-box}pre{font-family:monospace;font-size:1em}a{background-color:#0000}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted buttontext}fieldset{padding:.35em .75em .625em}legend{color:inherit;box-sizing:border-box;white-space:normal;max-width:100%;padding:0;display:table}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details{display:block}summary{display:list-item}template{display:none}html{color:#222;scroll-behavior:smooth;font-size:1em;line-height:1.4}::-moz-selection{text-shadow:none;background:#191919}::selection{text-shadow:none;background:#191919}hr{border:0;border-top:1px solid #ccc;height:1px;margin:1em 0;padding:0;display:block;overflow:visible}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}body{color:#fafafa;background-color:#191919;margin:10px;font-family:Arial,Helvetica,sans-serif}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:focus{color:#111;background-color:#ffc627}a:visited,a:visited:hover{color:#cba557}a:visited:focus,a:visited:focus-visible{color:#111!important}.hidden,[hidden]{display:none!important}.visually-hidden{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{clip:auto;width:auto;height:auto;white-space:inherit;margin:0;position:static;overflow:visible}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}@media print{*,:before,:after{color:#000!important;box-shadow:none!important;text-shadow:none!important;background:#fff!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^=\#]:after,a[href^=javascript\:]:after{content:""}pre{white-space:pre-wrap!important}pre,blockquote{break-inside:avoid;border:1px solid #999}tr,img{break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{break-after:avoid}}.full-width-section{background-position:50%;background-size:cover;width:100%;max-width:1920px;margin:0 auto}.container{max-width:1200px;margin:0 auto;padding:0 12px}.readable{max-width:900px;margin:0 auto}header,footer{width:100%}header .container,footer .container{max-width:1200px;margin:0 auto;padding:20px 12px}.gh{border-collapse:collapse;border-spacing:0;margin:0 auto}.gh td,.gh th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.gh .gh-tcell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.gh,.gh col{width:auto!important}.gh-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.soc{border-collapse:collapse;border-spacing:0;margin:0 auto}.soc td,.soc th{border-collapse:collapse;word-break:normal;padding:8px;overflow:hidden}.soc .soc-fa{text-align:center;vertical-align:middle}@media screen and (width<=767px){.soc,.soc col{width:auto!important}.soc-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.foss{border-collapse:collapse;border-spacing:0}.foss td,.foss th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.foss .foss-cell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.foss,.foss col{width:auto!important}.foss-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}}.bnav{text-align:center;border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav td,.bnav th{text-align:center;vertical-align:middle;word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav .bnav-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav,.bnav col{width:auto!important}.bnav-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.bnav2{border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav2 td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav2 th{word-break:normal;border-style:none;padding:12px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.bnav2 .bnav2-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav2,.bnav2 col{width:auto!important}.bnav2-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.pgp{border-collapse:collapse;border-spacing:0;margin:0 auto}.pgp td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp th{word-break:normal;border:1px solid #000;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp .pgp-col1{text-align:right;vertical-align:middle;padding-right:1rem}.pgp .pgp-col2{text-align:left;vertical-align:middle;padding-left:1rem}@media screen and (width<=767px){.pgp,.pgp col{width:auto!important}.pgp-wrap{-webkit-overflow-scrolling:touch;margin:2rem 0 auto;overflow-x:auto}}#service-summary{color:#e6e6e6;margin-top:2rem;margin-bottom:2.5rem}.service-table{color:#e6e6e6;border-collapse:collapse;background-color:#191919;width:100%;font-size:.95rem}.service-table th,.service-table td{text-align:left;vertical-align:top;border-bottom:1px solid #333;padding:.75rem 1rem}.service-table th{color:#ffc627;text-transform:uppercase;background-color:#222;font-size:.85rem;font-weight:600}.service-table a{color:#ffc627;font-weight:500;text-decoration:none}.service-table a:hover{text-decoration:underline}.service-table tr:hover{background-color:#222;transition:background-color .3s,box-shadow .3s;box-shadow:0 0 10px 2px #ffc62740}.service-table tr.selected{background-color:#222;border-left:4px solid #ffc627;transition:background-color .3s,border-left-color .3s}.service-table tr.selected:hover{background-color:#252525;box-shadow:0 0 12px 3px #ffc62759}@media (width<=768px){.service-table{font-size:.9rem}.service-table th,.service-table td{padding:.5rem}}.logo{margin-left:auto;margin-right:auto;display:block}.index-title1{text-align:center;font-style:italic;font-weight:700}.index-title2{letter-spacing:-.015em;text-align:center;font-variant:small-caps;font-size:1.25rem;line-height:1.625rem}.index1{letter-spacing:-.035em;text-align:center;font-style:italic;font-weight:700;line-height:2.125rem}.index2{letter-spacing:-.035em;text-align:center;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.index3{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem}.index4{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem;text-decoration:underline}.subhead{letter-spacing:-.035em;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.bold{font-weight:700}.emphasis{font-style:italic}.uline{text-decoration:underline}.bolditalic{font-style:italic;font-weight:700}.bquote{border-left:3px solid #9e9e9e;margin-left:30px;padding-left:10px;font-style:italic}.small-text{font-size:.75rem;line-height:1.125rem}.large-text-center{text-align:center;font-size:1.25rem;line-height:1.75rem}.prewrap{white-space:pre-wrap;display:block}.hr-styled{width:75%;margin:auto}.center-text{text-align:center}.copyright{text-align:center;font-size:.75rem;line-height:1.125rem}.gold{color:#ffc627}.visited{color:#cba557}.goldseparator{color:#ffc627;margin:0 .5rem}.center-nav{text-align:center;padding:5px;font-size:1rem;line-height:1.5rem}.block{overflow-wrap:break-word;resize:none;white-space:normal;word-break:normal;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-family:monospace;font-size:.875rem;line-height:1.125rem}.full-width-section.centered{flex-direction:column;justify-content:center;min-height:80vh;display:flex}.fingerprint{white-space:pre-line;font-weight:700;display:block}.pgp-image{width:150px;height:150px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}.emoji{margin-right:8px}.headline{margin-bottom:4px;font-style:italic;font-weight:700;display:block}.label{font-family:inherit;font-weight:700}.description{font-family:inherit;font-style:normal;font-weight:400;display:inline}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pgp-entry{flex-wrap:wrap;align-items:center;gap:2rem;margin-bottom:2rem;display:flex}.pgp-text{flex:2;min-width:250px}.pgp-qr{flex:1;min-width:150px}.obtainium-direct-label{margin:.25rem 0 .75rem;font-weight:700}.obtainium-manual-label{margin-top:.75rem;font-weight:700}.obtainium-img{width:185px;height:55px;margin-bottom:.25rem}.obtainium-margin{margin-left:4px}.obtainium-fa-down{color:#ffc627;margin-left:4px}.obtainium-icon{width:50px;height:50px}.proton-img{width:168px;height:24px}.redirect-text{text-align:center;margin-top:4rem}.redirect-content{text-align:center;margin-top:2rem;font-family:system-ui,sans-serif}.loading-spinner{border:4px solid #ddd;border-top-color:#ffc627;border-radius:50%;width:48px;height:48px;margin:2rem auto;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.cc-link{text-decoration:none}.cc-img{vertical-align:text-bottom;margin-left:3px;display:inline-block;height:18px!important}#toc ul{padding-left:1.5rem;list-style-type:disc}#toc a{color:var(--color-primary,#ffc627);text-decoration:none}#toc a:hover{text-decoration:underline}
6
+ html{-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{margin:.67em 0;font-size:2em}hr{box-sizing:content-box}pre{font-family:monospace;font-size:1em}a{background-color:#0000}abbr[title]{border-bottom:none;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace;font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:100%;line-height:1.15}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button;appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted buttontext}fieldset{padding:.35em .75em .625em}legend{color:inherit;box-sizing:border-box;white-space:normal;max-width:100%;padding:0;display:table}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}details{display:block}summary{display:list-item}template{display:none}html{color:#222;scroll-behavior:smooth;font-size:1em;line-height:1.4}::-moz-selection{text-shadow:none;background:#191919}::selection{text-shadow:none;background:#191919}hr{border:0;border-top:1px solid #ccc;height:1px;margin:1em 0;padding:0;display:block;overflow:visible}audio,canvas,iframe,img,svg,video{vertical-align:middle}fieldset{border:0;margin:0;padding:0}textarea{resize:vertical}body{color:#fafafa;background-color:#191919;margin:10px;font-family:Arial,Helvetica,sans-serif}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:focus{color:#111;background-color:#ffc627}a:visited,a:visited:hover{color:#cba557}a:visited:focus,a:visited:focus-visible{color:#111!important}.hidden,[hidden]{display:none!important}.visually-hidden{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.visually-hidden.focusable:active,.visually-hidden.focusable:focus{clip:auto;width:auto;height:auto;white-space:inherit;margin:0;position:static;overflow:visible}.invisible{visibility:hidden}.clearfix:before,.clearfix:after{content:"";display:table}.clearfix:after{clear:both}@media print{*,:before,:after{color:#000!important;box-shadow:none!important;text-shadow:none!important;background:#fff!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href)")"}abbr[title]:after{content:" (" attr(title)")"}a[href^=\#]:after,a[href^=javascript\:]:after{content:""}pre{white-space:pre-wrap!important}pre,blockquote{break-inside:avoid;border:1px solid #999}tr,img{break-inside:avoid}p,h2,h3{orphans:3;widows:3}h2,h3{break-after:avoid}}.full-width-section{background-position:50%;background-size:cover;width:100%;max-width:1920px;margin:0 auto}.container{max-width:1200px;margin:0 auto;padding:0 12px}.readable{max-width:900px;margin:0 auto}header,footer{width:100%}header .container,footer .container{max-width:1200px;margin:0 auto;padding:20px 12px}.gh{border-collapse:collapse;border-spacing:0;margin:0 auto}.gh td,.gh th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.gh .gh-tcell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.gh,.gh col{width:auto!important}.gh-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.soc{border-collapse:collapse;border-spacing:0;margin:0 auto}.soc td,.soc th{border-collapse:collapse;word-break:normal;padding:8px;overflow:hidden}.soc .soc-fa{text-align:center;vertical-align:middle}@media screen and (width<=767px){.soc,.soc col{width:auto!important}.soc-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.foss{border-collapse:collapse;border-spacing:0}.foss td,.foss th{border-collapse:collapse;word-break:normal;padding:10px 5px;overflow:hidden}.foss .foss-cell{text-align:center;vertical-align:middle}@media screen and (width<=767px){.foss,.foss col{width:auto!important}.foss-wrap{-webkit-overflow-scrolling:touch;overflow-x:auto}}.bnav{text-align:center;border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav td,.bnav th{text-align:center;vertical-align:middle;word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav .bnav-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav,.bnav col{width:auto!important}.bnav-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.bnav2{border-collapse:collapse;border-spacing:0;margin:0 auto}.bnav2 td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;font-weight:700;line-height:1.125rem;overflow:hidden}.bnav2 th{word-break:normal;border-style:none;padding:12px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.bnav2 .bnav2-cell{text-align:center;vertical-align:middle;align-content:center}@media screen and (width<=767px){.bnav2,.bnav2 col{width:auto!important}.bnav2-wrap{-webkit-overflow-scrolling:touch;margin:auto 0;overflow-x:auto}}.pgp{border-collapse:collapse;border-spacing:0;margin:0 auto}.pgp td{word-break:normal;border-style:none;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp th{word-break:normal;border:1px solid #000;padding:10px;font-size:.875rem;line-height:1.125rem;overflow:hidden}.pgp .pgp-col1{text-align:right;vertical-align:middle;padding-right:1rem}.pgp .pgp-col2{text-align:left;vertical-align:middle;padding-left:1rem}@media screen and (width<=767px){.pgp,.pgp col{width:auto!important}.pgp-wrap{-webkit-overflow-scrolling:touch;margin:2rem 0 auto;overflow-x:auto}}#service-summary{color:#e6e6e6;margin-top:2rem;margin-bottom:2.5rem}.service-table{color:#e6e6e6;border-collapse:collapse;background-color:#191919;width:100%;font-size:.95rem}.service-table th,.service-table td{text-align:left;vertical-align:top;border-bottom:1px solid #333;padding:.75rem 1rem}.service-table th{color:#ffc627;text-transform:uppercase;background-color:#222;font-size:.85rem;font-weight:600}.service-table a{color:#ffc627;font-weight:500;text-decoration:none}.service-table a:hover{text-decoration:underline}.service-table tr:hover{background-color:#222;transition:background-color .3s,box-shadow .3s;box-shadow:0 0 10px 2px #ffc62740}.service-table tr.selected{background-color:#222;border-left:4px solid #ffc627;transition:background-color .3s,border-left-color .3s}.service-table tr.selected:hover{background-color:#252525;box-shadow:0 0 12px 3px #ffc62759}@media (width<=768px){.service-table{font-size:.9rem}.service-table th,.service-table td{padding:.5rem}}.logo{margin-left:auto;margin-right:auto;display:block}.index-title1{text-align:center;font-style:italic;font-weight:700}.index-title2{letter-spacing:-.015em;text-align:center;font-variant:small-caps;font-size:1.25rem;line-height:1.625rem}.index1{letter-spacing:-.035em;text-align:center;font-style:italic;font-weight:700;line-height:2.125rem}.index2{letter-spacing:-.035em;text-align:center;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.index3{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem}.index4{letter-spacing:-.035em;text-align:center;font-size:1.5rem;line-height:1.75rem;text-decoration:underline}.subhead{letter-spacing:-.035em;font-variant:small-caps;font-size:1.5rem;line-height:1.75rem}.bold{font-weight:700}.emphasis{font-style:italic}.uline{text-decoration:underline}.bolditalic{font-style:italic;font-weight:700}.bquote{border-left:3px solid #9e9e9e;margin-left:30px;padding-left:10px;font-style:italic}.small-text{font-size:.75rem;line-height:1.125rem}.large-text-center{text-align:center;font-size:1.25rem;line-height:1.75rem}.prewrap{white-space:pre-wrap;display:block}.hr-styled{width:75%;margin:auto}.center-text{text-align:center}.copyright{text-align:center;font-size:.75rem;line-height:1.125rem}.gold{color:#ffc627}.visited{color:#cba557}.goldseparator{color:#ffc627;margin:0 .5rem}.center-nav{text-align:center;padding:5px;font-size:1rem;line-height:1.5rem}.block{overflow-wrap:break-word;resize:none;white-space:normal;word-break:normal;background:0 0;border:none;border-radius:0;outline:none;width:100%;font-family:monospace;font-size:.875rem;line-height:1.125rem}.full-width-section.centered{flex-direction:column;justify-content:center;min-height:80vh;display:flex}.fingerprint{white-space:pre-line;font-family:monospace;display:block}.pgp-image{width:150px;height:150px}.spacer{margin:2rem 0}.separator{margin:0 .5rem}.emoji{margin-right:8px}.headline{margin-bottom:4px;font-style:italic;font-weight:700;display:block}.label{font-family:inherit;font-weight:700}.description{font-family:inherit;font-style:normal;font-weight:400;display:inline}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.pgp-entry{flex-wrap:wrap;align-items:center;gap:2rem;margin-bottom:2rem;display:flex}.pgp-text{flex:2;min-width:250px}.pgp-qr{flex:1;min-width:150px}.obtainium-direct-label{margin:.25rem 0 .75rem;font-weight:700}.obtainium-manual-label{margin-top:.75rem;font-weight:700}.obtainium-img{width:185px;height:55px;margin-bottom:.25rem}.obtainium-margin{margin-left:4px}.obtainium-fa-down{color:#ffc627;margin-left:4px}.obtainium-icon{width:50px;height:50px}.proton-img{width:168px;height:24px}.redirect-text{text-align:center;margin-top:4rem}.redirect-content{text-align:center;margin-top:2rem;font-family:system-ui,sans-serif}.loading-spinner{border:4px solid #ddd;border-top-color:#ffc627;border-radius:50%;width:48px;height:48px;margin:2rem auto;animation:1s linear infinite spin}@keyframes spin{to{transform:rotate(360deg)}}.cc-link{text-decoration:none}.cc-img{vertical-align:text-bottom;margin-left:3px;display:inline-block;height:18px!important}#toc ul{padding-left:1.5rem;list-style-type:disc}#toc a{color:var(--color-primary,#ffc627);text-decoration:none}#toc a:hover{text-decoration:underline}
@@ -23,9 +23,12 @@ This file is part of Network Pro.
23
23
 
24
24
  /**
25
25
  * @typedef {object} ContactInfo
26
- * @property {string} EMAIL - Primary contact email
27
- * @property {string} SECURE - Secure contact email
28
- * @property {string} PRIVACY - Privacy policy email
26
+ * @property {string} EMAIL - Primary contact email (human-readable form)
27
+ * @property {string} EMAIL_LINK - Primary contact email (clickable address)
28
+ * @property {string} SECURE - Secure contact email (human-readable form)
29
+ * @property {string} SECURE_LINK - Secure contact email (clickable address)
30
+ * @property {string} PRIVACY - Privacy contact email (human-readable form)
31
+ * @property {string} PRIVACY_LINK - Privacy contact email (clickable address)
29
32
  * @property {string} PHONE - Support phone number
30
33
  */
31
34
 
@@ -0,0 +1,68 @@
1
+ /* ==========================================================================
2
+ src/routes/relay-[slug]/[...catchall]/+server.js
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
+ /**
10
+ * Universal mock for PostHog Proxy Handler
11
+ *
12
+ * @file +server.js
13
+ * @description Mocks GET, HEAD, and OPTIONS
14
+ * @module src/routes/relay-[slug]/[...catchall]
15
+ * @author Scott Lopez
16
+ * @updated 2025-10-17
17
+ */
18
+
19
+ /** @typedef {import('@sveltejs/kit').RequestHandler} Handler */
20
+
21
+ /** @type {Handler} */
22
+ export function GET({ url }) {
23
+ const path = url.pathname;
24
+
25
+ // Match known mock paths
26
+ if (path.includes('/flags')) {
27
+ return new Response(
28
+ JSON.stringify({
29
+ feature_flags: [],
30
+ groups: {},
31
+ distinct_id: 'mock-user',
32
+ }),
33
+ {
34
+ status: 200,
35
+ headers: { 'Content-Type': 'application/json', 'X-Mock': 'true' },
36
+ },
37
+ );
38
+ }
39
+
40
+ if (path.includes('/config') || path.includes('/config.js')) {
41
+ return new Response('{}', {
42
+ status: 200,
43
+ headers: { 'Content-Type': 'application/json', 'X-Mock': 'true' },
44
+ });
45
+ }
46
+
47
+ // Log unexpected paths during tests
48
+ console.warn('[RELAY MOCK] Unhandled path:', path);
49
+
50
+ // Default 404 response
51
+ return new Response('Not Found', { status: 404 });
52
+ }
53
+
54
+ /** @type {Handler} */
55
+ export function HEAD() {
56
+ return new Response(null, { status: 200 });
57
+ }
58
+
59
+ /** @type {Handler} */
60
+ export function OPTIONS() {
61
+ return new Response(null, {
62
+ status: 204,
63
+ headers: {
64
+ Allow: 'GET, HEAD, OPTIONS',
65
+ 'Access-Control-Allow-Origin': '*',
66
+ },
67
+ });
68
+ }
@@ -30,11 +30,11 @@ const excludedAssets = [];
30
30
  const IGNORE_PATHS = new Set([
31
31
  '/.well-known/security.txt.sig',
32
32
  '/img/banner-1280x640.png',
33
+ '/img/banner-og-1200x630.png',
34
+ '/img/fb-banner.png',
33
35
  '/img/logo-transparent.png',
34
36
  '/img/logo.png',
35
37
  '/img/svelte.png',
36
- '/pgp/pgp-github.png',
37
- '/pgp/pgp-github.webp',
38
38
  '/pgp/contact@s.neteng.pro.asc',
39
39
  '/pgp/github@sl.neteng.cc.asc',
40
40
  '/pgp/security@s.neteng.pro.asc',
@@ -84,18 +84,10 @@ const REQUIRED_ASSETS = [
84
84
  '/icon-192x192.png',
85
85
  '/icon-512x512-maskable.png',
86
86
  '/icon-512x512.png',
87
+ '/icon-about.png',
87
88
  '/icon-contact.png',
88
89
  '/icon-services.png',
89
90
  '/icon-splash.png',
90
- '/img/banner-og-1200x630.png',
91
- '/pgp/pgp-contact.png',
92
- '/pgp/pgp-contact.webp',
93
- '/pgp/pgp-security.png',
94
- '/pgp/pgp-security.webp',
95
- '/pgp/pgp-support.png',
96
- '/pgp/pgp-support.webp',
97
- '/pgp/vcard.png',
98
- '/pgp/vcard.webp',
99
91
  '/manifest.json',
100
92
  '/offline.html',
101
93
  '/offline.min.css',
Binary file