@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.
- package/.editorconfig +1 -3
- package/.env.template +0 -2
- package/.gitattributes +0 -2
- package/.markdownlint.mjs +1 -1
- package/.prettierignore +0 -2
- package/.stylelintignore +0 -2
- package/CHANGELOG.md +89 -1
- package/package.json +8 -8
- package/src/app.html +1 -12
- package/src/lib/components/Logo.svelte +2 -7
- package/src/lib/components/layout/HeaderDefault.svelte +2 -3
- package/src/lib/data/fossData.js +8 -0
- package/src/lib/data/pgpKeys.js +82 -0
- package/src/lib/images.js +46 -17
- package/src/lib/index.js +8 -2
- package/src/lib/pages/AboutContent.svelte +97 -100
- package/src/lib/pages/HomeContent.svelte +11 -8
- package/src/lib/pages/PGPContent.svelte +19 -40
- package/src/lib/pages/ServicesContent.svelte +5 -2
- package/src/lib/styles/css/default.css +1 -1
- package/src/lib/styles/global.min.css +1 -1
- package/src/lib/types/appConstants.js +6 -3
- package/src/routes/relay-[slug]/[...catchall]/+server.js +68 -0
- package/src/service-worker.js +3 -11
- package/static/icon-about.png +0 -0
- package/static/manifest.json +17 -4
- package/static/pgp/support@netwk.pro.asc +77 -0
- package/static/sitemap.xml +5 -5
- package/stylelint.config.js +0 -6
- package/src/lib/img/qr/pgp-github.png +0 -0
- package/src/lib/img/qr/pgp-github.webp +0 -0
- package/static/pgp/pgp-contact.png +0 -0
- package/static/pgp/pgp-contact.webp +0 -0
- package/static/pgp/pgp-github.png +0 -0
- package/static/pgp/pgp-github.webp +0 -0
- package/static/pgp/pgp-security.png +0 -0
- package/static/pgp/pgp-security.webp +0 -0
- package/static/pgp/pgp-support.png +0 -0
- package/static/pgp/pgp-support.webp +0 -0
- package/static/pgp/support@neteng.pro.asc +0 -47
- package/static/pgp/vcard.png +0 -0
- package/static/pgp/vcard.webp +0 -0
- /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:
|
|
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:
|
|
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}
|
|
118
|
-
* @property {string}
|
|
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
|
-
|
|
127
|
-
|
|
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
|
-
|
|
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}™ provides
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
190
|
+
Additionally, {COMPANY_INFO.APP_NAME}™ 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:
|
|
257
|
-
|
|
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 (
|
|
261
|
+
<!-- Row 0 (Support) -->
|
|
279
262
|
<tr>
|
|
280
263
|
<td class="pgp-col1">
|
|
281
264
|
<picture>
|
|
282
|
-
<source srcset={pgpKeys[0].
|
|
265
|
+
<source srcset={pgpKeys[0].webp} type="image/webp" />
|
|
283
266
|
<img
|
|
284
267
|
{decoding}
|
|
285
268
|
{loading}
|
|
286
|
-
src={pgpKeys[0].
|
|
269
|
+
src={pgpKeys[0].png}
|
|
287
270
|
class="pgp-image"
|
|
288
|
-
alt={`
|
|
271
|
+
alt={`QR code for ${pgpKeys[0].email}`} />
|
|
289
272
|
</picture>
|
|
290
273
|
</td>
|
|
291
274
|
<td class="pgp-col2">
|
|
292
|
-
<
|
|
293
|
-
<strong
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
><a
|
|
298
|
-
href={contactAssets.supportAsc}
|
|
299
|
-
type="application/pgp-keys"
|
|
300
|
-
download
|
|
301
|
-
target={PAGE.BLANK}
|
|
302
|
-
>asc <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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
281
|
+
<p>
|
|
282
|
+
<a
|
|
283
|
+
href={pgpKeys[0].file}
|
|
284
|
+
type="application/pgp-keys"
|
|
285
|
+
download
|
|
286
|
+
target={PAGE.BLANK}>
|
|
287
|
+
asc <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 (
|
|
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
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
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 <span class="fas fa-file-arrow-down"></span>
|
|
318
|
+
</a>
|
|
329
319
|
</p>
|
|
330
|
-
<p
|
|
331
|
-
>Fingerprint
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
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].
|
|
332
|
+
<source srcset={pgpKeys[1].webp} type="image/webp" />
|
|
340
333
|
<img
|
|
341
334
|
{decoding}
|
|
342
335
|
{loading}
|
|
343
|
-
src={pgpKeys[1].
|
|
336
|
+
src={pgpKeys[1].png}
|
|
344
337
|
class="pgp-image"
|
|
345
|
-
alt={`
|
|
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
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
|
50
|
-
cybersecurity, and digital privacy consulting that meets today's
|
|
51
|
-
demands. Our remote-first approach combines technical depth with
|
|
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
|
|
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.
|
|
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.
|
|
83
|
+
<a href={`mailto:${CONTACT.SECURE_LINK}`} target={PAGE.BLANK}
|
|
84
|
+
>{CONTACT.SECURE_LINK}</a>
|
|
82
85
|
</p>
|
|
83
86
|
|
|
84
87
|
|
|
@@ -7,43 +7,16 @@ This file is part of Network Pro.
|
|
|
7
7
|
========================================================================== -->
|
|
8
8
|
|
|
9
9
|
<script>
|
|
10
|
-
import
|
|
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=
|
|
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.
|
|
69
|
+
<section class="pgp-entry" aria-labelledby={`pgp-${key.id}`}>
|
|
97
70
|
<div class="pgp-text">
|
|
98
|
-
<h2 id={`pgp-${key.
|
|
71
|
+
<h2 id={`pgp-${key.id}`}>{key.name}</h2>
|
|
99
72
|
<h3>
|
|
100
73
|
<
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
|
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:
|
|
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>
|
|
@@ -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}
|
|
28
|
-
* @property {string}
|
|
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
|
+
}
|
package/src/service-worker.js
CHANGED
|
@@ -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
|