@networkpro/web 1.19.0 → 1.21.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/.github/workflows/build-and-publish.yml +5 -4
- package/.github/workflows/lighthouse.yml +1 -1
- package/.github/workflows/meta-check.yml +1 -1
- package/.github/workflows/playwright.yml +1 -1
- package/.github/workflows/publish-test.yml +5 -4
- package/.github/workflows/templates/publish.template.yml +5 -4
- package/CHANGELOG.md +107 -1
- package/cspell.json +4 -0
- package/package.json +20 -20
- package/scripts/auditScripts.js +1 -1
- package/scripts/bundleCss.js +1 -1
- package/scripts/checkEnv.js +1 -1
- package/scripts/checkNode.js +1 -1
- package/scripts/checkVersions.js +1 -1
- package/scripts/generateTest.js +1 -1
- package/scripts/openReport.js +1 -1
- package/src/app.html +3 -6
- package/src/hooks.server.js +10 -7
- package/src/lib/components/ServiceSummaryTable.svelte +113 -0
- package/src/lib/components/index.js +2 -1
- package/src/lib/components/layout/HeaderDefault.svelte +3 -1
- package/src/lib/components/layout/HeaderHome.svelte +6 -5
- package/src/lib/images.js +1 -1
- package/src/lib/index.js +2 -2
- package/src/lib/meta.js +14 -9
- package/src/lib/pages/AboutContent.svelte +26 -10
- package/src/lib/pages/HomeContent.svelte +13 -1
- package/src/lib/pages/LicenseContent.svelte +3 -3
- package/src/lib/pages/PrivacyContent.svelte +31 -1
- package/src/lib/pages/ServicesContent.svelte +545 -0
- package/src/lib/pages/index.js +2 -1
- package/src/lib/registerServiceWorker.js +7 -5
- package/src/lib/stores/posthog.js +46 -25
- package/src/lib/styles/css/default.css +88 -0
- package/src/lib/styles/global.min.css +1 -3
- package/src/lib/types/appConstants.js +1 -1
- package/src/lib/types/fossTypes.js +1 -1
- package/src/lib/unregisterServiceWorker.js +10 -2
- package/src/lib/utils/getUTMParams.js +1 -1
- package/src/lib/utils/initAnalytics.js +75 -0
- package/src/lib/utils/purify.js +1 -1
- package/src/lib/utils/redirect.js +1 -1
- package/src/lib/utils/utm.js +2 -2
- package/src/routes/+layout.js +1 -1
- package/src/routes/+layout.svelte +6 -37
- package/src/routes/consultation/+page.svelte +1 -1
- package/src/routes/services/+page.server.js +18 -0
- package/src/routes/services/+page.svelte +65 -0
- package/src/routes/status/+page.server.js +1 -1
- package/src/service-worker.js +3 -3
- package/static/bin/contact.vcf +1 -2
- package/static/disableSw.js +1 -1
- package/static/manifest.json +1 -1
- package/static/sitemap.xml +17 -5
- package/tests/e2e/app.spec.js +1 -1
- package/tests/e2e/mobile.spec.js +1 -1
- package/tests/e2e/shared/helpers.js +1 -1
- package/tests/meta/meta.test.js +1 -1
- package/tests/unit/client/lib/PWAInstallButton.test.js +1 -1
- package/tests/unit/client/lib/utils/redirect.test.js +1 -1
- package/tests/unit/server/internal/auditCoverage.test.js +1 -1
- package/tests/unit/server/lib/utils/purify.test.js +1 -1
- package/tests/unit/server/meta.test.js +1 -1
- package/vercel.json +12 -0
|
@@ -42,39 +42,50 @@ let ph = null;
|
|
|
42
42
|
*/
|
|
43
43
|
export async function initPostHog() {
|
|
44
44
|
if (initialized || typeof window === 'undefined') return;
|
|
45
|
+
const isDev = import.meta.env.MODE === 'development';
|
|
46
|
+
if (isDev) {
|
|
47
|
+
console.info('[PostHog] Skipping init in development mode.');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
45
51
|
initialized = true;
|
|
46
52
|
|
|
47
53
|
const { enabled } = get(trackingPreferences);
|
|
48
54
|
trackingEnabled.set(enabled);
|
|
49
|
-
showReminder.set(get(remindUserToReconsent)); //
|
|
55
|
+
showReminder.set(get(remindUserToReconsent)); // use derived store instead
|
|
50
56
|
|
|
51
57
|
if (!enabled) {
|
|
52
58
|
console.log('[PostHog] Tracking is disabled — skipping init.');
|
|
53
59
|
return;
|
|
54
60
|
}
|
|
55
61
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
try {
|
|
63
|
+
const posthogModule = await import('posthog-js');
|
|
64
|
+
ph = posthogModule.default;
|
|
65
|
+
|
|
66
|
+
// cspell:disable-next-line
|
|
67
|
+
ph.init('phc_Qshfo6AXzh4pS7aPigfqyeo4qj1qlyh7gDuHDeVMSR0', {
|
|
68
|
+
api_host: '/relay-MSR0/',
|
|
69
|
+
ui_host: 'https://us.posthog.com',
|
|
70
|
+
autocapture: true,
|
|
71
|
+
capture_pageview: false,
|
|
72
|
+
person_profiles: 'identified_only',
|
|
73
|
+
loaded: (phInstance) => {
|
|
74
|
+
if (!enabled) {
|
|
75
|
+
console.log(
|
|
76
|
+
'[PostHog] ⛔ User opted out — calling opt_out_capturing()',
|
|
77
|
+
);
|
|
78
|
+
phInstance.opt_out_capturing();
|
|
79
|
+
} else {
|
|
80
|
+
console.log('[PostHog] ✅ Tracking enabled');
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
ph.capture('$pageview');
|
|
86
|
+
} catch (err) {
|
|
87
|
+
console.warn('[PostHog] Failed to initialize:', err);
|
|
88
|
+
}
|
|
78
89
|
}
|
|
79
90
|
|
|
80
91
|
/**
|
|
@@ -83,8 +94,13 @@ export async function initPostHog() {
|
|
|
83
94
|
* @param {Record<string, any>} [properties={}] - Optional event properties
|
|
84
95
|
*/
|
|
85
96
|
export function capture(event, properties = {}) {
|
|
86
|
-
|
|
97
|
+
const isDev = import.meta.env.MODE === 'development';
|
|
98
|
+
if (isDev || ph === null || !get(trackingEnabled)) return;
|
|
99
|
+
|
|
100
|
+
try {
|
|
87
101
|
ph.capture(event, properties);
|
|
102
|
+
} catch (err) {
|
|
103
|
+
console.warn(`[PostHog] capture(${event}) failed:`, err);
|
|
88
104
|
}
|
|
89
105
|
}
|
|
90
106
|
|
|
@@ -94,8 +110,13 @@ export function capture(event, properties = {}) {
|
|
|
94
110
|
* @param {Record<string, any>} [properties={}] - Optional user traits
|
|
95
111
|
*/
|
|
96
112
|
export function identify(id, properties = {}) {
|
|
97
|
-
|
|
113
|
+
const isDev = import.meta.env.MODE === 'development';
|
|
114
|
+
if (isDev || ph === null || !get(trackingEnabled)) return;
|
|
115
|
+
|
|
116
|
+
try {
|
|
98
117
|
ph.identify(id, properties);
|
|
118
|
+
} catch (err) {
|
|
119
|
+
console.warn(`[PostHog] identify(${id}) failed:`, err);
|
|
99
120
|
}
|
|
100
121
|
}
|
|
101
122
|
|
|
@@ -316,6 +316,80 @@ footer .container {
|
|
|
316
316
|
}
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
+
#service-summary {
|
|
320
|
+
color: #e6e6e6;
|
|
321
|
+
margin-bottom: 2.5rem;
|
|
322
|
+
margin-top: 2rem;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
.service-table {
|
|
326
|
+
width: 100%;
|
|
327
|
+
font-size: 0.95rem;
|
|
328
|
+
color: #e6e6e6;
|
|
329
|
+
background-color: #191919;
|
|
330
|
+
border-collapse: collapse;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
.service-table th,
|
|
334
|
+
.service-table td {
|
|
335
|
+
padding: 0.75rem 1rem;
|
|
336
|
+
text-align: left;
|
|
337
|
+
border-bottom: 1px solid #333;
|
|
338
|
+
vertical-align: top;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.service-table th {
|
|
342
|
+
font-size: 0.85rem;
|
|
343
|
+
font-weight: 600;
|
|
344
|
+
color: #ffc627;
|
|
345
|
+
background-color: #222;
|
|
346
|
+
text-transform: uppercase;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.service-table a {
|
|
350
|
+
font-weight: 500;
|
|
351
|
+
color: #ffc627;
|
|
352
|
+
text-decoration: none;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
.service-table a:hover {
|
|
356
|
+
text-decoration: underline;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* Default row hover with gold glow */
|
|
360
|
+
.service-table tr:hover {
|
|
361
|
+
box-shadow: 0 0 10px 2px rgba(255, 198, 39, 0.25);
|
|
362
|
+
background-color: #222;
|
|
363
|
+
transition:
|
|
364
|
+
background-color 0.3s ease,
|
|
365
|
+
box-shadow 0.3s ease;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/* Selected (active) row — gold border, no glow unless hovered */
|
|
369
|
+
.service-table tr.selected {
|
|
370
|
+
background-color: #222;
|
|
371
|
+
transition:
|
|
372
|
+
background-color 0.3s ease,
|
|
373
|
+
border-left-color 0.3s ease;
|
|
374
|
+
border-left: 4px solid #ffc627;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/* Add subtle glow when hovering over the active row */
|
|
378
|
+
.service-table tr.selected:hover {
|
|
379
|
+
box-shadow: 0 0 12px 3px rgba(255, 198, 39, 0.35);
|
|
380
|
+
background-color: #252525;
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
@media (max-width: 768px) {
|
|
384
|
+
.service-table {
|
|
385
|
+
font-size: 0.9rem;
|
|
386
|
+
}
|
|
387
|
+
.service-table th,
|
|
388
|
+
.service-table td {
|
|
389
|
+
padding: 0.5rem;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
|
|
319
393
|
/* ==========================================================================
|
|
320
394
|
Custom CSS
|
|
321
395
|
========================================================================== */
|
|
@@ -621,3 +695,17 @@ footer .container {
|
|
|
621
695
|
margin-left: 3px;
|
|
622
696
|
vertical-align: text-bottom;
|
|
623
697
|
}
|
|
698
|
+
|
|
699
|
+
#toc ul {
|
|
700
|
+
list-style-type: disc;
|
|
701
|
+
padding-left: 1.5rem;
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
#toc a {
|
|
705
|
+
color: var(--color-primary, #ffc627);
|
|
706
|
+
text-decoration: none;
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
#toc a:hover {
|
|
710
|
+
text-decoration: underline;
|
|
711
|
+
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
/*! ==========================================================================
|
|
2
|
-
src/lib/styles/css/global.css
|
|
3
|
-
|
|
4
2
|
Copyright © 2025 Network Pro Strategies (Network Pro™)
|
|
5
3
|
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
6
4
|
This file is part of Network Pro.
|
|
7
5
|
========================================================================== */
|
|
8
|
-
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}}.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}
|
|
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}
|
|
@@ -8,12 +8,20 @@ This file is part of Network Pro.
|
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Allows for manual toggling of the service worker
|
|
11
|
+
* DEV USE ONLY
|
|
12
|
+
* @internal
|
|
11
13
|
*/
|
|
12
14
|
export function unregisterServiceWorker() {
|
|
13
15
|
if ('serviceWorker' in navigator) {
|
|
14
16
|
navigator.serviceWorker.getRegistrations().then((registrations) => {
|
|
15
|
-
registrations.
|
|
16
|
-
|
|
17
|
+
if (registrations.length === 0) {
|
|
18
|
+
console.log('🧼 No service workers to unregister.');
|
|
19
|
+
} else {
|
|
20
|
+
registrations.forEach((reg) => {
|
|
21
|
+
console.log(`🧹 Unregistering SW: ${reg.scope}`);
|
|
22
|
+
reg.unregister();
|
|
23
|
+
});
|
|
24
|
+
}
|
|
17
25
|
});
|
|
18
26
|
}
|
|
19
27
|
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
src/lib/utils/initAnalytics.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
|
+
* @file initAnalytics.js
|
|
11
|
+
* @description Helper utility for initializing analytics.
|
|
12
|
+
*
|
|
13
|
+
* @module src/lib/utils
|
|
14
|
+
* @author Scott Lopez
|
|
15
|
+
* @updated 2025-10-17
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { browser } from '$app/environment';
|
|
19
|
+
import { afterNavigate } from '$app/navigation';
|
|
20
|
+
import { appleTouchIcon, faviconSvg, logoPng, logoWbp } from '$lib';
|
|
21
|
+
import { registerServiceWorker } from '$lib/registerServiceWorker.js';
|
|
22
|
+
import { capture, initPostHog } from '$lib/stores/posthog';
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Initializes analytics and telemetry (e.g., PostHog tracking, asset preload).
|
|
26
|
+
* Should be called once per app mount (e.g., from +layout.svelte).
|
|
27
|
+
*
|
|
28
|
+
* @returns {() => void} Cleanup function to unregister global event listeners
|
|
29
|
+
*/
|
|
30
|
+
export function initAnalytics() {
|
|
31
|
+
if (!browser) return () => {};
|
|
32
|
+
|
|
33
|
+
console.log('[APP] initAnalytics() running');
|
|
34
|
+
|
|
35
|
+
registerServiceWorker();
|
|
36
|
+
initPostHog();
|
|
37
|
+
|
|
38
|
+
afterNavigate(() => {
|
|
39
|
+
capture('$pageview');
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// Track $pageleave
|
|
43
|
+
let hasFiredLeave = false;
|
|
44
|
+
const sendPageLeave = () => {
|
|
45
|
+
if (hasFiredLeave) return;
|
|
46
|
+
hasFiredLeave = true;
|
|
47
|
+
capture('$pageleave');
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
window.addEventListener('pagehide', sendPageLeave);
|
|
51
|
+
window.addEventListener('beforeunload', sendPageLeave);
|
|
52
|
+
|
|
53
|
+
// Debug toggle logic
|
|
54
|
+
const isDev = import.meta.env.MODE === 'development';
|
|
55
|
+
const urlParams = new URLSearchParams(window.location.search);
|
|
56
|
+
const debug = urlParams.get('debug') === 'true';
|
|
57
|
+
|
|
58
|
+
if (isDev || debug) {
|
|
59
|
+
console.log('ENV MODE =', import.meta.env.MODE);
|
|
60
|
+
console.log('isDev =', isDev);
|
|
61
|
+
console.log('debug param =', debug);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Preload logo assets
|
|
65
|
+
[logoPng, logoWbp, faviconSvg, appleTouchIcon].forEach((src) => {
|
|
66
|
+
const img = new Image();
|
|
67
|
+
img.src = src;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Clean up listeners when component is destroyed
|
|
71
|
+
return () => {
|
|
72
|
+
window.removeEventListener('pagehide', sendPageLeave);
|
|
73
|
+
window.removeEventListener('beforeunload', sendPageLeave);
|
|
74
|
+
};
|
|
75
|
+
}
|
package/src/lib/utils/purify.js
CHANGED
|
@@ -11,7 +11,7 @@ This file is part of Network Pro.
|
|
|
11
11
|
* @description Universal DOMPurify instance for SSR + client with safe build support.
|
|
12
12
|
* Secures untrusted HTML before injecting it into the DOM.
|
|
13
13
|
* @module src/lib/utils/
|
|
14
|
-
* @author
|
|
14
|
+
* @author Scott Lopez
|
|
15
15
|
* @updated 2025-06-01
|
|
16
16
|
*/
|
|
17
17
|
|
package/src/lib/utils/utm.js
CHANGED
|
@@ -10,8 +10,8 @@ This file is part of Network Pro.
|
|
|
10
10
|
* @file utm.js
|
|
11
11
|
* @description Appends standardized UTM parameters to a given URL.
|
|
12
12
|
* @module src/lib/utils/
|
|
13
|
-
* @author
|
|
14
|
-
* @updated 2025-
|
|
13
|
+
* @author Scott Lopez
|
|
14
|
+
* @updated 2025-10-10
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import { browser } from '$app/environment';
|
package/src/routes/+layout.js
CHANGED
|
@@ -21,7 +21,7 @@ import { meta as routeMeta } from '$lib/meta.js'; // Import meta from $lib/meta.
|
|
|
21
21
|
const fallbackMeta = {
|
|
22
22
|
title: 'Security, Networking, Privacy — Network Pro™',
|
|
23
23
|
description:
|
|
24
|
-
'Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro
|
|
24
|
+
'Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro Strategies',
|
|
25
25
|
};
|
|
26
26
|
|
|
27
27
|
export const prerender = 'auto';
|
|
@@ -10,15 +10,11 @@ This file is part of Network Pro.
|
|
|
10
10
|
export let data;
|
|
11
11
|
|
|
12
12
|
import { onMount } from 'svelte';
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { registerServiceWorker } from '$lib/registerServiceWorker.js';
|
|
16
|
-
import { browser } from '$app/environment';
|
|
17
|
-
import { logoPng, logoWbp, faviconSvg, appleTouchIcon } from '$lib';
|
|
13
|
+
import { initAnalytics } from '$lib/utils/initAnalytics';
|
|
14
|
+
import { showReminder } from '$lib/stores/posthog';
|
|
18
15
|
import { ContainerSection, PWAInstallButton } from '$lib/components';
|
|
19
16
|
import { Footer, HeaderDefault, HeaderHome } from '$lib/components/layout';
|
|
20
|
-
|
|
21
|
-
//import PWAInstallButton from '$lib/components/PWAInstallButton.svelte';
|
|
17
|
+
import { appleTouchIcon, faviconSvg, logoPng, logoWbp } from '$lib';
|
|
22
18
|
|
|
23
19
|
import '$lib/styles/global.min.css';
|
|
24
20
|
import '$lib/styles/fa-global.css';
|
|
@@ -26,35 +22,8 @@ This file is part of Network Pro.
|
|
|
26
22
|
$: shouldShowReminder = $showReminder;
|
|
27
23
|
|
|
28
24
|
onMount(() => {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
registerServiceWorker();
|
|
32
|
-
initPostHog();
|
|
33
|
-
|
|
34
|
-
// Register navigation tracking only on client
|
|
35
|
-
afterNavigate(() => {
|
|
36
|
-
capture('$pageview');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
if (browser) {
|
|
40
|
-
const isDev = import.meta.env.MODE === 'development';
|
|
41
|
-
|
|
42
|
-
// Check for ?debug=true in URL (no persistence)
|
|
43
|
-
const urlParams = new URLSearchParams(window.location.search);
|
|
44
|
-
const debug = urlParams.get('debug') === 'true';
|
|
45
|
-
|
|
46
|
-
if (isDev || debug) {
|
|
47
|
-
console.log('ENV MODE =', import.meta.env.MODE);
|
|
48
|
-
console.log('isDev =', isDev);
|
|
49
|
-
console.log('debug param =', debug);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Preload logo assets
|
|
53
|
-
[logoPng, logoWbp, appleTouchIcon].forEach((src) => {
|
|
54
|
-
const img = new Image();
|
|
55
|
-
img.src = src;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
25
|
+
const cleanup = initAnalytics();
|
|
26
|
+
return cleanup;
|
|
58
27
|
});
|
|
59
28
|
|
|
60
29
|
// fallback values if data.meta not set
|
|
@@ -62,7 +31,7 @@ This file is part of Network Pro.
|
|
|
62
31
|
data?.meta?.title || 'Security, Networking, Privacy — Network Pro™';
|
|
63
32
|
const metaDescription =
|
|
64
33
|
data?.meta?.description ||
|
|
65
|
-
'Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro
|
|
34
|
+
'Locking Down Networks, Unlocking Confidence™ | Security, Networking, Privacy — Network Pro Strategies';
|
|
66
35
|
</script>
|
|
67
36
|
|
|
68
37
|
<svelte:head>
|
|
@@ -7,7 +7,7 @@ This file is part of Network Pro.
|
|
|
7
7
|
========================================================================== -->
|
|
8
8
|
|
|
9
9
|
<script>
|
|
10
|
-
import RedirectPage from '$lib/components
|
|
10
|
+
import { RedirectPage } from '$lib/components';
|
|
11
11
|
import { appendUTM } from '$lib/utils/utm.js';
|
|
12
12
|
import { getUTMParams } from '$lib/utils/getUTMParams.js';
|
|
13
13
|
import { trackingEnabled } from '$lib/stores/trackingPreferences';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
src/routes/services/+page.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
|
+
import { defaultMeta, meta } from '$lib/meta.js';
|
|
10
|
+
|
|
11
|
+
export const prerender = false;
|
|
12
|
+
|
|
13
|
+
/** @type {import('./$types').PageServerLoad} */
|
|
14
|
+
export function load() {
|
|
15
|
+
return {
|
|
16
|
+
meta: meta['/services'] || defaultMeta,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/routes/services/+page.svelte
|
|
3
|
+
|
|
4
|
+
Copyright © 2025 Network Pro Strategies (Network Pro™)
|
|
5
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
6
|
+
This file is part of Network Pro.
|
|
7
|
+
========================================================================== -->
|
|
8
|
+
|
|
9
|
+
<script>
|
|
10
|
+
import {
|
|
11
|
+
Badges,
|
|
12
|
+
FullWidthSection,
|
|
13
|
+
LegalNav,
|
|
14
|
+
SocialMedia,
|
|
15
|
+
MetaTags,
|
|
16
|
+
} from '$lib/components';
|
|
17
|
+
import { ServicesContent } from '$lib/pages';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @type {string}
|
|
21
|
+
* Style class for the div element.
|
|
22
|
+
*/
|
|
23
|
+
const spaceStyle = 'spacer';
|
|
24
|
+
|
|
25
|
+
export let data;
|
|
26
|
+
</script>
|
|
27
|
+
|
|
28
|
+
<MetaTags title={data.meta.title} description={data.meta.description} />
|
|
29
|
+
|
|
30
|
+
<link rel="canonical" href="https://netwk.pro/services" />
|
|
31
|
+
|
|
32
|
+
<section id="services">
|
|
33
|
+
<FullWidthSection>
|
|
34
|
+
<!-- BEGIN PRIVACY POLICY -->
|
|
35
|
+
<section id="main-content">
|
|
36
|
+
<ServicesContent />
|
|
37
|
+
</section>
|
|
38
|
+
<!-- END PRIVACY POLICY -->
|
|
39
|
+
|
|
40
|
+
<div class={spaceStyle}></div>
|
|
41
|
+
|
|
42
|
+
<!-- BEGIN SOCIAL MEDIA -->
|
|
43
|
+
<section id="social-media">
|
|
44
|
+
<SocialMedia />
|
|
45
|
+
</section>
|
|
46
|
+
<!-- END SOCIAL MEDIA -->
|
|
47
|
+
|
|
48
|
+
<hr />
|
|
49
|
+
|
|
50
|
+
<div class={spaceStyle}></div>
|
|
51
|
+
|
|
52
|
+
<!-- BEGIN LEGAL -->
|
|
53
|
+
<section id="legal-nav">
|
|
54
|
+
<LegalNav />
|
|
55
|
+
</section>
|
|
56
|
+
<!-- END LEGAL -->
|
|
57
|
+
|
|
58
|
+
<div class={spaceStyle}></div>
|
|
59
|
+
|
|
60
|
+
<!-- BEGIN BADGES -->
|
|
61
|
+
<section id="badges">
|
|
62
|
+
<Badges />
|
|
63
|
+
</section>
|
|
64
|
+
</FullWidthSection>
|
|
65
|
+
</section>
|
package/src/service-worker.js
CHANGED
|
@@ -28,7 +28,7 @@ const CACHE = `cache-${version}`;
|
|
|
28
28
|
const excludedAssets = [];
|
|
29
29
|
|
|
30
30
|
const IGNORE_PATHS = new Set([
|
|
31
|
-
'/.well-known/security.txt.
|
|
31
|
+
'/.well-known/security.txt.sig',
|
|
32
32
|
'/img/banner-1280x640.png',
|
|
33
33
|
'/img/logo-transparent.png',
|
|
34
34
|
'/img/logo.png',
|
|
@@ -39,8 +39,6 @@ const IGNORE_PATHS = new Set([
|
|
|
39
39
|
'/pgp/github@sl.neteng.cc.asc',
|
|
40
40
|
'/pgp/security@s.neteng.pro.asc',
|
|
41
41
|
'/pgp/support@neteng.pro.asc',
|
|
42
|
-
'/pgp/vcard.png',
|
|
43
|
-
'/pgp/vcard.webp',
|
|
44
42
|
'/screenshots/desktop-foss.png',
|
|
45
43
|
'/webfonts/fa-brands-400.ttf',
|
|
46
44
|
'/webfonts/fa-solid-900.ttf',
|
|
@@ -96,6 +94,8 @@ const REQUIRED_ASSETS = [
|
|
|
96
94
|
'/pgp/pgp-security.webp',
|
|
97
95
|
'/pgp/pgp-support.png',
|
|
98
96
|
'/pgp/pgp-support.webp',
|
|
97
|
+
'/pgp/vcard.png',
|
|
98
|
+
'/pgp/vcard.webp',
|
|
99
99
|
'/manifest.json',
|
|
100
100
|
'/offline.html',
|
|
101
101
|
'/offline.min.css',
|
package/static/bin/contact.vcf
CHANGED
|
@@ -3,11 +3,10 @@ VERSION:3.0
|
|
|
3
3
|
FN:Scott Lopez
|
|
4
4
|
N:Lopez;Scott
|
|
5
5
|
TEL;TYPE=WORK,PREF=1:(623) 252-4350
|
|
6
|
-
EMAIL;TYPE=HOME:github@sl.neteng.cc
|
|
7
6
|
EMAIL;TYPE=WORK:support@neteng.pro
|
|
8
7
|
EMAIL;TYPE=Secure:business@s.neteng.pro
|
|
9
8
|
ADR;TYPE=WORK:;;Peoria\, AZ 85382\nUS
|
|
10
9
|
ORG:Network Pro Strategies
|
|
11
|
-
TITLE:
|
|
10
|
+
TITLE:Network Engineer
|
|
12
11
|
URL:https://netwk.pro
|
|
13
12
|
END:VCARD
|
package/static/disableSw.js
CHANGED
|
@@ -10,7 +10,7 @@ This file is part of Network Pro.
|
|
|
10
10
|
* @file disableSw.js
|
|
11
11
|
* @description Allows for Service Worker to be disabled for debugging by appending ?nosw to the path.
|
|
12
12
|
* @module static
|
|
13
|
-
* @author
|
|
13
|
+
* @author Scott Lopez
|
|
14
14
|
* @updated 2025-10-05
|
|
15
15
|
*/
|
|
16
16
|
|