@networkpro/web 0.13.1 → 1.0.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/CODE_OF_CONDUCT.md +172 -0
- package/LICENSE.md +4 -4
- package/README.md +11 -10
- package/assets/bin/contact.vcf +13 -0
- package/assets/bin/contact@s.neteng.pro.aexpk +17 -0
- package/assets/bin/contact@s.neteng.pro.asc +17 -0
- package/assets/bin/github@sl.neteng.cc.aexpk +29 -0
- package/assets/bin/github@sl.neteng.cc.asc +29 -0
- package/assets/bin/linksheet.json +8 -0
- package/assets/bin/support@neteng.pro.aexpk +47 -0
- package/assets/bin/support@neteng.pro.asc +47 -0
- package/assets/consulting-terms.pdf +0 -0
- package/eslint.config.mjs +112 -0
- package/jsconfig.json +28 -0
- package/netlify.toml +13 -0
- package/package.json +64 -61
- package/playwright.config.js +79 -0
- package/postcss.config.mjs +14 -0
- package/scripts/bundleCss.js +40 -0
- package/src/app.d.ts +15 -0
- package/src/app.html +81 -0
- package/src/demo.spec.js +14 -0
- package/src/lib/components/Badges.svelte +74 -0
- package/src/lib/components/ContainerSection.svelte +19 -0
- package/src/lib/components/FullWidthSection.svelte +13 -0
- package/src/lib/components/LegalNav.svelte +75 -0
- package/src/lib/components/Logo.svelte +110 -0
- package/src/lib/components/SocialMedia.svelte +70 -0
- package/src/lib/components/foss/FossFeatures.svelte +24 -0
- package/src/lib/components/foss/FossItemContent.svelte +153 -0
- package/src/lib/components/layout/Footer.svelte +188 -0
- package/src/lib/components/layout/HeaderDefault.svelte +86 -0
- package/src/lib/components/layout/HeaderHome.svelte +84 -0
- package/src/lib/data/fossData.js +233 -0
- package/src/lib/images.js +77 -0
- package/src/lib/img/badges/cc-by-badge.png +0 -0
- package/src/lib/img/badges/gpl-badge.svg +1 -0
- package/src/lib/img/by.svg +1 -0
- package/src/lib/img/cc.svg +1 -0
- package/src/lib/img/logo-web.png +0 -0
- package/src/lib/img/logo-web.webp +0 -0
- package/src/lib/img/obtainium.webp +0 -0
- package/src/lib/img/posts/acode.png +0 -0
- package/src/lib/img/posts/acode.webp +0 -0
- package/src/lib/img/posts/linksheet.png +0 -0
- package/src/lib/img/posts/linksheet.webp +0 -0
- package/src/lib/img/posts/pmx.png +0 -0
- package/src/lib/img/posts/pmx.webp +0 -0
- package/src/lib/img/posts/tosdr.png +0 -0
- package/src/lib/img/posts/tosdr.webp +0 -0
- package/src/lib/img/posts/urlcheck.png +0 -0
- package/src/lib/img/posts/urlcheck.webp +0 -0
- package/src/lib/index.js +43 -0
- package/src/lib/pages/AboutContent.svelte +294 -0
- package/src/lib/pages/FossContent.svelte +109 -0
- package/src/lib/pages/HomeContent.svelte +120 -0
- package/src/lib/pages/LicenseContent.svelte +486 -0
- package/src/lib/pages/PrivacyContent.svelte +249 -0
- package/src/lib/pages/TermsConditionsContent.svelte +240 -0
- package/src/lib/pages/TermsUseContent.svelte +236 -0
- package/src/lib/registerServiceWorker.js +65 -0
- package/src/lib/styles/css/brands.css +76 -0
- package/src/lib/styles/css/brands.min.css +6 -0
- package/src/lib/styles/css/default.css +454 -0
- package/src/lib/styles/css/fontawesome.min.css +9 -0
- package/src/lib/styles/css/global.css +10 -0
- package/src/lib/styles/css/normalize.css +349 -0
- package/src/lib/styles/css/offline.css +120 -0
- package/src/lib/styles/css/solid.min.css +6 -0
- package/src/lib/styles/css/style.css +310 -0
- package/src/lib/styles/fa-global.css +10 -0
- package/src/lib/styles/global.min.css +9 -0
- package/src/lib/styles/index.js +11 -0
- package/src/lib/styles/webfonts/fa-brands-400.ttf +0 -0
- package/src/lib/styles/webfonts/fa-brands-400.woff2 +0 -0
- package/src/lib/styles/webfonts/fa-solid-900.ttf +0 -0
- package/src/lib/styles/webfonts/fa-solid-900.woff2 +0 -0
- package/src/routes/+error.svelte +43 -0
- package/src/routes/+layout.js +94 -0
- package/src/routes/+layout.svelte +110 -0
- package/src/routes/+page.svelte +77 -0
- package/src/routes/about/+page.svelte +61 -0
- package/src/routes/contact/+page.server.js +24 -0
- package/src/routes/example.svx +9 -0
- package/src/routes/foss-spotlight/+page.svelte +63 -0
- package/src/routes/license/+page.svelte +63 -0
- package/src/routes/page.svelte.test.js +18 -0
- package/src/routes/privacy-policy/+page.svelte +63 -0
- package/src/routes/privacy-rights/+page.server.js +24 -0
- package/src/routes/terms-conditions/+page.svelte +63 -0
- package/src/routes/terms-of-use/+page.svelte +63 -0
- package/src/service-worker.d.ts +4 -0
- package/src/service-worker.js +90 -0
- package/static/icon-512x512-maskable.png +0 -0
- package/static/icon-contact.png +0 -0
- package/static/icon-services.png +0 -0
- package/static/img/svelte.png +0 -0
- package/static/manifest.json +64 -0
- package/static/offline.html +79 -0
- package/static/offline.min.css +7 -0
- package/{robots.txt → static/robots.txt} +0 -2
- package/static/sitemap.xml +102 -0
- package/stylelint.config.js +118 -0
- package/svelte.config.js +56 -0
- package/tests/app.spec.js +67 -0
- package/tests/mobile.spec.js +58 -0
- package/tests-examples/demo-todo-app.spec.js +504 -0
- package/tsconfig.custom.json +39 -0
- package/vite.config.js +19 -0
- package/vitest-setup-client.js +33 -0
- package/vitest.config.client.js +34 -0
- package/vitest.config.server.js +30 -0
- package/404.html +0 -84
- package/about.html +0 -334
- package/about.html.br +0 -0
- package/about.html.gz +0 -0
- package/bundle-report.html +0 -39
- package/css/default.css +0 -1
- package/css/normalize.css +0 -1
- package/css/style.css +0 -1
- package/docs/404.html +0 -1187
- package/docs/assets/external/avatars.githubusercontent.com/u/170266279.png +0 -0
- package/docs/assets/external/img.shields.io/badge/GitHub_Package_Registry-white.ed8def48.svg +0 -1
- package/docs/assets/external/img.shields.io/badge/npmjs-white.681714c1.svg +0 -1
- package/docs/assets/external/mirrors.creativecommons.org/presskit/icons/by.svg +0 -20
- package/docs/assets/external/mirrors.creativecommons.org/presskit/icons/cc.svg +0 -27
- package/docs/assets/external/unpkg.com/mermaid@11/dist/mermaid.min.js +0 -2607
- package/docs/assets/images/favicon.png +0 -0
- package/docs/assets/javascripts/bundle.c8b220af.min.js +0 -16
- package/docs/assets/javascripts/bundle.c8b220af.min.js.map +0 -7
- package/docs/assets/javascripts/lunr/min/lunr.ar.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.da.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.de.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.du.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.el.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.es.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.fi.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.fr.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.he.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.hi.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.hu.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.hy.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.it.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.ja.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.jp.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.kn.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.ko.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.multi.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.nl.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.no.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.pt.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.ro.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.ru.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.sa.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.stemmer.support.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.sv.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.ta.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.te.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.th.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.tr.min.js +0 -18
- package/docs/assets/javascripts/lunr/min/lunr.vi.min.js +0 -1
- package/docs/assets/javascripts/lunr/min/lunr.zh.min.js +0 -1
- package/docs/assets/javascripts/lunr/tinyseg.js +0 -206
- package/docs/assets/javascripts/lunr/wordcut.js +0 -6708
- package/docs/assets/javascripts/workers/search.f8cc74c7.min.js +0 -42
- package/docs/assets/javascripts/workers/search.f8cc74c7.min.js.map +0 -7
- package/docs/assets/stylesheets/main.2afb09e1.min.css +0 -1
- package/docs/assets/stylesheets/main.2afb09e1.min.css.map +0 -1
- package/docs/assets/stylesheets/palette.06af60db.min.css +0 -1
- package/docs/assets/stylesheets/palette.06af60db.min.css.map +0 -1
- package/docs/blog/2015/01/04/secure-secure-shell/index.html +0 -1771
- package/docs/blog/2025/04/30/our-blog-is-live/index.html +0 -1436
- package/docs/blog/archive/2015/index.html +0 -1303
- package/docs/blog/archive/2025/index.html +0 -1291
- package/docs/blog/category/security/index.html +0 -1303
- package/docs/blog/index.html +0 -1350
- package/docs/conduct/index.html +0 -1509
- package/docs/feed_json_created.json +0 -1
- package/docs/feed_json_updated.json +0 -1
- package/docs/feed_rss_created.xml +0 -1
- package/docs/feed_rss_updated.xml +0 -1
- package/docs/fontawesome/LICENSE.txt +0 -165
- package/docs/fontawesome/brands/facebook.svg +0 -1
- package/docs/fontawesome/brands/instagram.svg +0 -1
- package/docs/fontawesome/brands/linkedin.svg +0 -1
- package/docs/fontawesome/brands/mastodon.svg +0 -1
- package/docs/fontawesome/solid/at.svg +0 -1
- package/docs/index.html +0 -1395
- package/docs/legal/index.html +0 -1740
- package/docs/privacy/index.html +0 -1615
- package/docs/search/search_index.json +0 -1
- package/docs/sitemap.xml +0 -55
- package/docs/sitemap.xml.gz +0 -0
- package/docs/tags/index.html +0 -2084
- package/docs/terms-conditions/index.html +0 -1655
- package/docs/terms-use/index.html +0 -1584
- package/favicon-192.png +0 -0
- package/favicon-512.png +0 -0
- package/favicon.svg.br +0 -0
- package/favicon.svg.gz +0 -0
- package/html/spotlight.html +0 -435
- package/html/spotlight.html.br +0 -0
- package/html/spotlight.html.gz +0 -0
- package/img/banner-1280x640.png +0 -0
- package/img/banner-1440.png +0 -0
- package/img/banner-og-1200x630.png +0 -0
- package/img/favicon-template.png +0 -0
- package/img/fb-cover.png +0 -0
- package/img/fb-cover2.png +0 -0
- package/img/fsf-member.png +0 -0
- package/img/gh-logo.png +0 -0
- package/img/gpl3-small.png +0 -0
- package/img/gpl3.png +0 -0
- package/img/linkedin-banner-new.png +0 -0
- package/img/linkedin-banner.png +0 -0
- package/img/linkedin-banner2.png +0 -0
- package/img/logo-1024x1024.png +0 -0
- package/img/logo-alt.png +0 -0
- package/img/logo-elevated.png +0 -0
- package/img/logo-light-elevated.png +0 -0
- package/img/logo-light-slogan.png +0 -0
- package/img/logo-light.png +0 -0
- package/img/logo-slogan.png +0 -0
- package/img/logo-transparent-black-small.png +0 -0
- package/img/logo-transparent-black.png +0 -0
- package/img/logo-transparent-elevated.png +0 -0
- package/img/logo-transparent-slogan.png +0 -0
- package/img/mastodon-banner.png +0 -0
- package/img/netpro-logo-transparent.png +0 -0
- package/img/posts/acode.png +0 -0
- package/img/posts/linksheet.png +0 -0
- package/img/posts/tosdr.png +0 -0
- package/img/posts/urlcheck.png +0 -0
- package/img/qr/pgp-github.png +0 -0
- package/img/qr/pgp-support.png +0 -0
- package/img/qr/vcard.png +0 -0
- package/img/sd311.png +0 -0
- package/img/shield.png +0 -0
- package/img/shield.svg +0 -1
- package/img/shield.svg.br +0 -0
- package/img/shield.svg.gz +0 -0
- package/img/shield2.png +0 -0
- package/img/shield3-2000x2000.png +0 -0
- package/img/shield3-black-1024x1024.png +0 -0
- package/img/shield3-black.png +0 -0
- package/img/shield3-white.png +0 -0
- package/img/trademark.jpg +0 -0
- package/index.html +0 -268
- package/index.html.br +0 -0
- package/index.html.gz +0 -0
- package/js/app.d544156ea2ba85a7d486.mjs +0 -1
- package/js/runtime.52b1ac291305b90de3df.mjs +0 -1
- package/js/vendor/.gitkeep +0 -0
- package/legal.html +0 -535
- package/legal.html.br +0 -0
- package/legal.html.gz +0 -0
- package/privacy.html +0 -404
- package/privacy.html.br +0 -0
- package/privacy.html.gz +0 -0
- package/site.webmanifest +0 -25
- package/sitemap.xml +0 -177
- package/terms-and-conditions.html +0 -409
- package/terms-and-conditions.html.br +0 -0
- package/terms-and-conditions.html.gz +0 -0
- package/terms-of-use.html +0 -380
- package/terms-of-use.html.br +0 -0
- package/terms-of-use.html.gz +0 -0
- /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master/assets → assets}/nsa-happy-dance.png +0 -0
- /package/{favicon.svg → src/lib/img/favicon.svg} +0 -0
- /package/{favicon-180.png → src/lib/img/icon-180x180.png} +0 -0
- /package/{img/badge_obtainium.png → src/lib/img/obtainium.png} +0 -0
- /package/{img → src/lib/img}/qr/pgp-contact.png +0 -0
- /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/pgp-github.png +0 -0
- /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/pgp-support.png +0 -0
- /package/{docs/assets/external/raw.githubusercontent.com/netwk-pro/netwk-pro.github.io/refs/heads/master → src/lib}/img/qr/vcard.png +0 -0
- /package/{CNAME → static/CNAME} +0 -0
- /package/{favicon.ico → static/favicon.ico} +0 -0
- /package/{docs/img/favicon.png → static/icon-192x192.png} +0 -0
- /package/{docs/img/logo.png → static/icon-512x512.png} +0 -0
- /package/{favicon-splash.png → static/icon-splash.png} +0 -0
- /package/{img → static/img}/logo-transparent.png +0 -0
- /package/{img → static/img}/logo.png +0 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<!-- ======================================================================
|
|
6
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
7
|
+
This file is part of Network Pro.
|
|
8
|
+
============================================+========================== -->
|
|
9
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
10
|
+
<title>Offline | Site Unavailable</title>
|
|
11
|
+
<link rel="stylesheet" href="/offline.min.css" />
|
|
12
|
+
</head>
|
|
13
|
+
<body>
|
|
14
|
+
<div class="container">
|
|
15
|
+
<div class="icon">📶</div>
|
|
16
|
+
<h1>You're offline</h1>
|
|
17
|
+
<p
|
|
18
|
+
>It looks like you've lost your internet connection. The page you're
|
|
19
|
+
trying to view requires an active connection.</p
|
|
20
|
+
>
|
|
21
|
+
|
|
22
|
+
<div class="status">
|
|
23
|
+
Network status: Offline<br />
|
|
24
|
+
Last checked: <span id="timestamp">Just now</span>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<button class="retry-button" onclick="window.location.reload()">
|
|
28
|
+
Try Again
|
|
29
|
+
</button>
|
|
30
|
+
|
|
31
|
+
<div class="help-text">
|
|
32
|
+
Need help? Visit our
|
|
33
|
+
<a href="https://netwk.pro/contact" id="contact-link">contact page</a>
|
|
34
|
+
when you're back online.
|
|
35
|
+
</div>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
<script>
|
|
39
|
+
// Update timestamp every minute
|
|
40
|
+
function updateTimestamp() {
|
|
41
|
+
const now = new Date();
|
|
42
|
+
const timeStr = now.toLocaleTimeString([], {
|
|
43
|
+
hour: "2-digit",
|
|
44
|
+
minute: "2-digit",
|
|
45
|
+
});
|
|
46
|
+
document.getElementById("timestamp").textContent = timeStr;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Check connection status periodically
|
|
50
|
+
function checkConnection() {
|
|
51
|
+
if (navigator.onLine) {
|
|
52
|
+
window.location.reload();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Initial timestamp
|
|
57
|
+
updateTimestamp();
|
|
58
|
+
|
|
59
|
+
// Check connection every 30 seconds
|
|
60
|
+
setInterval(checkConnection, 30000);
|
|
61
|
+
setInterval(updateTimestamp, 60000);
|
|
62
|
+
|
|
63
|
+
// Also listen for online event
|
|
64
|
+
window.addEventListener("online", () => {
|
|
65
|
+
window.location.reload();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
// Prevent default action for offline links
|
|
69
|
+
document
|
|
70
|
+
.getElementById("contact-link")
|
|
71
|
+
.addEventListener("click", function (e) {
|
|
72
|
+
if (!navigator.onLine) {
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
alert("This link will be available when you are back online.");
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
</script>
|
|
78
|
+
</body>
|
|
79
|
+
</html>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*! ==========================================================================
|
|
2
|
+
src/lib/styles/css/offline.css
|
|
3
|
+
|
|
4
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
5
|
+
This file is part of Network Pro.
|
|
6
|
+
=========================================================================== */
|
|
7
|
+
html,body{height:100%;margin:0;padding:0}body{color:#fafafa;text-align:center;background-color:#191919;flex-direction:column;justify-content:center;align-items:center;margin:10px;padding:0 1rem;font-family:Arial,Helvetica,sans-serif;display:flex}.container{max-width:600px;margin:0 auto}h1{color:#fafafa;margin-bottom:1rem;font-size:2rem}p{margin-bottom:1.5rem;font-size:1.1rem;line-height:1.5}.icon{color:#ff5252;margin-bottom:1rem;font-size:4rem}.retry-button{color:#fafafa;cursor:pointer;background-color:#2e7d32;border:none;border-radius:4px;margin-top:1rem;padding:12px 24px;font-family:Arial,Helvetica,sans-serif;font-size:1rem;transition:background-color .2s}.retry-button:hover{background-color:#388e3c}.status{color:#bdbdbd;background-color:#ffffff0d;border-radius:4px;margin:1rem 0;padding:1rem;font-size:.9rem}a{text-decoration:none}a:link{color:#ffc627}a:hover,a:active{color:#ffc627;text-decoration:underline}a:focus{color:#191919;background-color:#ffc627}a:visited,a:visited:hover{color:#7f6227}.help-text{color:#bdbdbd;margin-top:2rem;font-size:.9rem}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<!-- Sitemap last updated on 2025-05-18 -->
|
|
3
|
+
|
|
4
|
+
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
5
|
+
|
|
6
|
+
<url>
|
|
7
|
+
|
|
8
|
+
<loc>https://netwk.pro</loc>
|
|
9
|
+
|
|
10
|
+
<lastmod>2025-05-16</lastmod>
|
|
11
|
+
|
|
12
|
+
<changefreq>weekly</changefreq>
|
|
13
|
+
|
|
14
|
+
<priority>1.0</priority>
|
|
15
|
+
|
|
16
|
+
</url>
|
|
17
|
+
|
|
18
|
+
<url>
|
|
19
|
+
|
|
20
|
+
<loc>https://netwk.pro/foss-spotlight</loc>
|
|
21
|
+
|
|
22
|
+
<lastmod>2025-05-15</lastmod>
|
|
23
|
+
|
|
24
|
+
<changefreq>weekly</changefreq>
|
|
25
|
+
|
|
26
|
+
<priority>0.8</priority>
|
|
27
|
+
|
|
28
|
+
</url>
|
|
29
|
+
|
|
30
|
+
<url>
|
|
31
|
+
|
|
32
|
+
<loc>https://netwk.pro/contact</loc>
|
|
33
|
+
|
|
34
|
+
<lastmod>2025-05-16</lastmod>
|
|
35
|
+
|
|
36
|
+
<changefreq>monthly</changefreq>
|
|
37
|
+
|
|
38
|
+
<priority>0.7</priority>
|
|
39
|
+
|
|
40
|
+
</url>
|
|
41
|
+
|
|
42
|
+
<url>
|
|
43
|
+
|
|
44
|
+
<loc>https://netwk.pro/privacy-rights</loc>
|
|
45
|
+
|
|
46
|
+
<lastmod>2025-05-16</lastmod>
|
|
47
|
+
|
|
48
|
+
<changefreq>monthly</changefreq>
|
|
49
|
+
|
|
50
|
+
<priority>0.7</priority>
|
|
51
|
+
|
|
52
|
+
</url>
|
|
53
|
+
|
|
54
|
+
<url>
|
|
55
|
+
|
|
56
|
+
<loc>https://netwk.pro/privacy-policy</loc>
|
|
57
|
+
|
|
58
|
+
<lastmod>2025-05-16</lastmod>
|
|
59
|
+
|
|
60
|
+
<changefreq>monthly</changefreq>
|
|
61
|
+
|
|
62
|
+
<priority>0.6</priority>
|
|
63
|
+
|
|
64
|
+
</url>
|
|
65
|
+
|
|
66
|
+
<url>
|
|
67
|
+
|
|
68
|
+
<loc>https://netwk.pro/license</loc>
|
|
69
|
+
|
|
70
|
+
<lastmod>2025-05-16</lastmod>
|
|
71
|
+
|
|
72
|
+
<changefreq>monthly</changefreq>
|
|
73
|
+
|
|
74
|
+
<priority>0.6</priority>
|
|
75
|
+
|
|
76
|
+
</url>
|
|
77
|
+
|
|
78
|
+
<url>
|
|
79
|
+
|
|
80
|
+
<loc>https://netwk.pro/terms-of-use</loc>
|
|
81
|
+
|
|
82
|
+
<lastmod>2025-05-15</lastmod>
|
|
83
|
+
|
|
84
|
+
<changefreq>monthly</changefreq>
|
|
85
|
+
|
|
86
|
+
<priority>0.6</priority>
|
|
87
|
+
|
|
88
|
+
</url>
|
|
89
|
+
|
|
90
|
+
<url>
|
|
91
|
+
|
|
92
|
+
<loc>https://netwk.pro/terms-conditions</loc>
|
|
93
|
+
|
|
94
|
+
<lastmod>2025-05-15</lastmod>
|
|
95
|
+
|
|
96
|
+
<changefreq>monthly</changefreq>
|
|
97
|
+
|
|
98
|
+
<priority>0.5</priority>
|
|
99
|
+
|
|
100
|
+
</url>
|
|
101
|
+
|
|
102
|
+
</urlset>
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
stylelint.config.js
|
|
3
|
+
|
|
4
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
5
|
+
This file is part of Network Pro.
|
|
6
|
+
========================================================================= */
|
|
7
|
+
|
|
8
|
+
/** @type {import('stylelint').Config} */
|
|
9
|
+
export default {
|
|
10
|
+
extends: [
|
|
11
|
+
"stylelint-config-recommended", // Base recommended config
|
|
12
|
+
"stylelint-config-html/html", // For linting HTML files
|
|
13
|
+
"stylelint-config-html/svelte", // For linting HTML within Svelte or similar frameworks
|
|
14
|
+
"stylelint-config-html", // For linting HTML files
|
|
15
|
+
],
|
|
16
|
+
plugins: ["stylelint-order"], // Add stylelint-order plugin
|
|
17
|
+
ignoreFiles: [
|
|
18
|
+
"./src/lib/styles/fa-global.css", // Ignore CSS import files
|
|
19
|
+
"./src/lib/styles/css/global.css", // Ignore CSS import files
|
|
20
|
+
"./src/lib/styles/css/brands.css", // Ignore FontAwesome CSS files
|
|
21
|
+
"**/*.min.css", // Also ignore minified CSS files as a best practice
|
|
22
|
+
],
|
|
23
|
+
overrides: [
|
|
24
|
+
{
|
|
25
|
+
files: ["**/*.html", "**/*.svelte"], // Use postcss-html for HTML and Svelte files
|
|
26
|
+
customSyntax: "postcss-html",
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
rules: {
|
|
30
|
+
"selector-pseudo-class-no-unknown": [
|
|
31
|
+
true,
|
|
32
|
+
{
|
|
33
|
+
ignorePseudoClasses: [":global"], // Allow :global for Svelte scoped styles
|
|
34
|
+
},
|
|
35
|
+
],
|
|
36
|
+
"property-no-vendor-prefix": null, // Allow vendor prefixes
|
|
37
|
+
"selector-no-vendor-prefix": null,
|
|
38
|
+
"selector-pseudo-element-colon-notation": [
|
|
39
|
+
"double",
|
|
40
|
+
{
|
|
41
|
+
severity: "warning",
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
"media-feature-name-no-vendor-prefix": null,
|
|
45
|
+
"font-family-no-duplicate-names": [
|
|
46
|
+
true,
|
|
47
|
+
{
|
|
48
|
+
ignoreFontFamilyNames: ["monospace"],
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
"selector-class-pattern": [
|
|
52
|
+
"^(?!fa-).*$", // Disallow classes starting with "fa-"
|
|
53
|
+
{
|
|
54
|
+
message:
|
|
55
|
+
"Class names must not start with 'fa-' (FontAwesome classes are ignored)",
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
"order/properties-order": [
|
|
59
|
+
[
|
|
60
|
+
{
|
|
61
|
+
groupName: "Positioning",
|
|
62
|
+
properties: ["position", "top", "right", "bottom", "left", "z-index"],
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
groupName: "Box Model",
|
|
66
|
+
properties: [
|
|
67
|
+
"display",
|
|
68
|
+
"flex",
|
|
69
|
+
"flex-grow",
|
|
70
|
+
"flex-shrink",
|
|
71
|
+
"flex-basis",
|
|
72
|
+
"justify-content",
|
|
73
|
+
"align-items",
|
|
74
|
+
"align-self",
|
|
75
|
+
"width",
|
|
76
|
+
"height",
|
|
77
|
+
"padding",
|
|
78
|
+
"margin",
|
|
79
|
+
"border",
|
|
80
|
+
"box-shadow",
|
|
81
|
+
],
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
groupName: "Typography",
|
|
85
|
+
properties: [
|
|
86
|
+
"font",
|
|
87
|
+
"font-size",
|
|
88
|
+
"font-weight",
|
|
89
|
+
"line-height",
|
|
90
|
+
"letter-spacing",
|
|
91
|
+
"color",
|
|
92
|
+
"text-align",
|
|
93
|
+
],
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
groupName: "Visual",
|
|
97
|
+
properties: [
|
|
98
|
+
"background",
|
|
99
|
+
"background-color",
|
|
100
|
+
"background-image",
|
|
101
|
+
"opacity",
|
|
102
|
+
"visibility",
|
|
103
|
+
],
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
groupName: "Animation & Transform",
|
|
107
|
+
properties: ["transition", "transform", "animation"],
|
|
108
|
+
},
|
|
109
|
+
],
|
|
110
|
+
{
|
|
111
|
+
unspecified: "bottomAlphabetical", // Place unspecified properties alphabetically at the bottom
|
|
112
|
+
},
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
reportDescriptionlessDisables: false, // Do not report disables without descriptions
|
|
116
|
+
reportInvalidScopeDisables: true, // Report invalid scope disables
|
|
117
|
+
reportNeedlessDisables: true, // Report unnecessary disables
|
|
118
|
+
};
|
package/svelte.config.js
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/* =========================================================================
|
|
2
|
+
svelte.config.js
|
|
3
|
+
|
|
4
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
5
|
+
This file is part of Network Pro.
|
|
6
|
+
========================================================================= */
|
|
7
|
+
|
|
8
|
+
import adapter from "@sveltejs/adapter-netlify"; // Netlify adapter for deployment
|
|
9
|
+
import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; // Vite preprocessor for Svelte
|
|
10
|
+
|
|
11
|
+
const config = {
|
|
12
|
+
// Preprocessors for enhanced functionality (vitePreprocess + mdsvex for Markdown support + svelte-preprocess for PostCSS)
|
|
13
|
+
preprocess: [
|
|
14
|
+
vitePreprocess({
|
|
15
|
+
postcss: true,
|
|
16
|
+
mdsvex: {
|
|
17
|
+
extensions: [".svx", ".md"],
|
|
18
|
+
},
|
|
19
|
+
}),
|
|
20
|
+
],
|
|
21
|
+
|
|
22
|
+
kit: {
|
|
23
|
+
// Netlify adapter configuration
|
|
24
|
+
adapter: adapter({
|
|
25
|
+
edge: false, // Disable edge functions (optional, enable if needed)
|
|
26
|
+
split: false, // Disable splitting function files (optional, enable if needed),
|
|
27
|
+
}),
|
|
28
|
+
// Paths configuration for deployment
|
|
29
|
+
paths: {
|
|
30
|
+
base: "", // Always deploy to the root of the domain
|
|
31
|
+
},
|
|
32
|
+
prerender: {
|
|
33
|
+
// Handle HTTP errors during prerendering
|
|
34
|
+
handleHttpError: ({ path, _referrer, message }) => {
|
|
35
|
+
// Paths to ignore and warn about
|
|
36
|
+
const warnList = ["/...404"];
|
|
37
|
+
|
|
38
|
+
if (warnList.includes(path)) {
|
|
39
|
+
console.warn(`Prerender error at path: ${path}, message: ${message}`);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// Otherwise, fail the build
|
|
44
|
+
throw new Error(message);
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
// File extensions for Svelte and mdsvex
|
|
49
|
+
extensions: [".svelte", ".svx", ".md"], // Added .md for Markdown support
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
export default config;
|
|
53
|
+
|
|
54
|
+
// PostCSS configuration is handled separately in postcss.config.cjs
|
|
55
|
+
// Consult https://svelte.dev/docs#compile-time-svelte-preprocess
|
|
56
|
+
// for more information about preprocessors
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
src/app.spec.js
|
|
3
|
+
|
|
4
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
5
|
+
This file is part of Network Pro.
|
|
6
|
+
========================================================================== */
|
|
7
|
+
|
|
8
|
+
// @ts-check
|
|
9
|
+
import { expect, test } from "@playwright/test";
|
|
10
|
+
|
|
11
|
+
test.describe("Desktop Tests", () => {
|
|
12
|
+
// Test for correct title on desktop with partial match
|
|
13
|
+
test("should load successfully with the correct title", async ({ page }) => {
|
|
14
|
+
// Simulate a desktop viewport
|
|
15
|
+
await page.setViewportSize({ width: 1280, height: 720 });
|
|
16
|
+
await page.goto("/");
|
|
17
|
+
|
|
18
|
+
// Wait for the title to be updated (not `%sveltekit.title%`)
|
|
19
|
+
await page.waitForFunction(() => document.title !== "%sveltekit.title%");
|
|
20
|
+
|
|
21
|
+
// Verify the page title contains the expected partial match
|
|
22
|
+
const title = await page.title();
|
|
23
|
+
expect(title).toContain("Locking Down Networks, Unlocking Confidence");
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
// Test for navigation bar visibility and "about" route
|
|
27
|
+
test("should display the navigation bar with an 'about' route", async ({
|
|
28
|
+
page,
|
|
29
|
+
}) => {
|
|
30
|
+
// Simulate a desktop viewport
|
|
31
|
+
await page.setViewportSize({ width: 1280, height: 720 });
|
|
32
|
+
await page.goto("/");
|
|
33
|
+
|
|
34
|
+
// Check that the navigation bar is visible
|
|
35
|
+
const nav = page.locator("nav");
|
|
36
|
+
await expect(nav).toBeVisible();
|
|
37
|
+
|
|
38
|
+
// Check for the "about" route in the navigation bar
|
|
39
|
+
const aboutLink = nav.locator("a", { hasText: "about" });
|
|
40
|
+
await expect(aboutLink).toBeVisible();
|
|
41
|
+
await expect(aboutLink).toHaveAttribute("href", "/about"); // Ensure it points to the correct route
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
// Test for footer visibility on desktop
|
|
45
|
+
test("should display the footer correctly", async ({ page }) => {
|
|
46
|
+
// Simulate a desktop viewport
|
|
47
|
+
await page.setViewportSize({ width: 1280, height: 720 });
|
|
48
|
+
await page.goto("/");
|
|
49
|
+
|
|
50
|
+
// Verify the footer is visible
|
|
51
|
+
const footer = page.locator("footer");
|
|
52
|
+
await expect(footer).toBeVisible();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
// Test for clickable links on desktop
|
|
56
|
+
test("should ensure links are clickable", async ({ page }) => {
|
|
57
|
+
// Simulate a desktop viewport
|
|
58
|
+
await page.setViewportSize({ width: 1280, height: 720 });
|
|
59
|
+
await page.goto("/");
|
|
60
|
+
|
|
61
|
+
// Check the "about" link is visible and clickable
|
|
62
|
+
const aboutLink = page.locator("a", { hasText: "about" });
|
|
63
|
+
await expect(aboutLink).toBeVisible();
|
|
64
|
+
await aboutLink.click();
|
|
65
|
+
await expect(page).toHaveURL(/\/about/);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/* ==========================================================================
|
|
2
|
+
src/mobile.spec.js
|
|
3
|
+
|
|
4
|
+
SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
|
|
5
|
+
This file is part of Network Pro.
|
|
6
|
+
========================================================================== */
|
|
7
|
+
|
|
8
|
+
// @ts-check
|
|
9
|
+
import { expect, test } from "@playwright/test";
|
|
10
|
+
|
|
11
|
+
test.describe("Mobile Responsiveness", () => {
|
|
12
|
+
test("should display main content correctly on mobile", async ({ page }) => {
|
|
13
|
+
// Simulate a mobile device
|
|
14
|
+
await page.setViewportSize({ width: 375, height: 812 });
|
|
15
|
+
await page.goto("/");
|
|
16
|
+
|
|
17
|
+
// Wait for the title to be updated (not `%sveltekit.title%`)
|
|
18
|
+
await page.waitForFunction(() => document.title !== "%sveltekit.title%");
|
|
19
|
+
|
|
20
|
+
// Verify the main heading is visible
|
|
21
|
+
const mainHeading = page.locator("h2");
|
|
22
|
+
await expect(mainHeading).toHaveText(/Security \| Networking \| Privacy/);
|
|
23
|
+
|
|
24
|
+
// Check that the layout adjusts properly
|
|
25
|
+
const nav = page.locator("nav");
|
|
26
|
+
await expect(nav).toBeVisible();
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("should ensure no overlapping content on mobile", async ({ page }) => {
|
|
30
|
+
await page.setViewportSize({ width: 375, height: 812 });
|
|
31
|
+
await page.goto("/");
|
|
32
|
+
|
|
33
|
+
// Wait for the title to be updated (not `%sveltekit.title%`)
|
|
34
|
+
await page.waitForFunction(() => document.title !== "%sveltekit.title%");
|
|
35
|
+
|
|
36
|
+
// Check that there are no overlapping elements
|
|
37
|
+
const body = await page.locator("body").boundingBox();
|
|
38
|
+
const header = await page.locator("header").boundingBox();
|
|
39
|
+
|
|
40
|
+
if (body && header) {
|
|
41
|
+
expect(header.y + header.height).toBeLessThanOrEqual(body.height);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("should ensure links are tappable", async ({ page }) => {
|
|
46
|
+
await page.setViewportSize({ width: 375, height: 812 });
|
|
47
|
+
await page.goto("/");
|
|
48
|
+
|
|
49
|
+
// Wait for the title to be updated (not `%sveltekit.title%`)
|
|
50
|
+
await page.waitForFunction(() => document.title !== "%sveltekit.title%");
|
|
51
|
+
|
|
52
|
+
// Check the "about" link is tappable and visible
|
|
53
|
+
const aboutLink = page.locator("a", { hasText: "about" });
|
|
54
|
+
await expect(aboutLink).toBeVisible();
|
|
55
|
+
await aboutLink.click();
|
|
56
|
+
await expect(page).toHaveURL(/\/about/);
|
|
57
|
+
});
|
|
58
|
+
});
|