@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,110 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/components/Logo.svelte
|
|
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
|
+
<script>
|
|
9
|
+
// Import logo images
|
|
10
|
+
import { logoPng, logoWbp } from "$lib";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Decoding mode for the image.
|
|
14
|
+
* @type {"sync" | "async" | "auto"}
|
|
15
|
+
*/
|
|
16
|
+
export let decoding = "sync";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Loading mode for the image.
|
|
20
|
+
* @type {"eager" | "lazy"}
|
|
21
|
+
*/
|
|
22
|
+
export let loading = "eager";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* CSS class for the logo image.
|
|
26
|
+
* @type {string}
|
|
27
|
+
*/
|
|
28
|
+
export let className = "logo";
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Alt text for the logo image.
|
|
32
|
+
* @type {string}
|
|
33
|
+
*/
|
|
34
|
+
export let alt = "Network Pro Strategies";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* First part of the company slogan.
|
|
38
|
+
* @type {string}
|
|
39
|
+
*/
|
|
40
|
+
export let sloganA = "Locking Down Networks";
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Second part of the company slogan.
|
|
44
|
+
* @type {string}
|
|
45
|
+
*/
|
|
46
|
+
export let sloganB = "Unlocking Confidence™";
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Enable/disable display of the slogan.
|
|
50
|
+
* @type {boolean}
|
|
51
|
+
*/
|
|
52
|
+
export let showSlogan = true;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Enable/disable display of the tagline.
|
|
56
|
+
* @type {boolean}
|
|
57
|
+
*/
|
|
58
|
+
export let showTagline = true;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Width of the logo in pixels.
|
|
62
|
+
* @type {number}
|
|
63
|
+
*/
|
|
64
|
+
export let width = 250;
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Height of the logo in pixels.
|
|
68
|
+
* @type {number}
|
|
69
|
+
*/
|
|
70
|
+
export let height = 250;
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Fetch priority for the logo image.
|
|
74
|
+
* @type {"high" | "low" | "auto"}
|
|
75
|
+
*/
|
|
76
|
+
export let fetchpriority = "high";
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Tagline text to display.
|
|
80
|
+
* @type {string}
|
|
81
|
+
*/
|
|
82
|
+
export let tagline = "Security | Networking | Privacy";
|
|
83
|
+
</script>
|
|
84
|
+
|
|
85
|
+
<!-- BEGIN LOGO AND SITE TITLE -->
|
|
86
|
+
<picture>
|
|
87
|
+
<source srcset={logoWbp} type="image/webp" />
|
|
88
|
+
<img
|
|
89
|
+
{decoding}
|
|
90
|
+
{loading}
|
|
91
|
+
class={className}
|
|
92
|
+
src={logoPng}
|
|
93
|
+
{alt}
|
|
94
|
+
{fetchpriority}
|
|
95
|
+
style="width: {width}px; height: {height}px" />
|
|
96
|
+
</picture>
|
|
97
|
+
|
|
98
|
+
{#if showSlogan}
|
|
99
|
+
<div class="index-title1">
|
|
100
|
+
{sloganA},<br />
|
|
101
|
+
{sloganB}
|
|
102
|
+
</div>
|
|
103
|
+
{/if}
|
|
104
|
+
|
|
105
|
+
<div class="spacer"></div>
|
|
106
|
+
|
|
107
|
+
{#if showTagline}
|
|
108
|
+
<h2 class="index-title2">{tagline}</h2>
|
|
109
|
+
{/if}
|
|
110
|
+
<!-- END LOGO AND SITE TITLE -->
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/components/SocialMedia.svelte
|
|
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
|
+
<script>
|
|
9
|
+
/**
|
|
10
|
+
* Social media link object.
|
|
11
|
+
* @typedef {Object} SocialLink
|
|
12
|
+
* @property {string} href - The URL of the social media profile.
|
|
13
|
+
* @property {string} label - The name of the social media platform (used for accessibility).
|
|
14
|
+
* @property {string} iconClass - The CSS class for the font-awesome icon.
|
|
15
|
+
* @property {string} [rel="noopener noreferrer"] - The `rel` attribute for the link (optional, defaults to "noopener noreferrer").
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Array of social media links.
|
|
20
|
+
* @type {SocialLink[]}
|
|
21
|
+
*/
|
|
22
|
+
const socialLinks = [
|
|
23
|
+
{
|
|
24
|
+
href: "https://instagram.com/netwk_pro",
|
|
25
|
+
label: "Instagram",
|
|
26
|
+
iconClass: "fab fa-square-instagram fa-2x",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
href: "https://facebook.com/neteng.pro",
|
|
30
|
+
label: "Facebook",
|
|
31
|
+
iconClass: "fab fa-square-facebook fa-2x",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
href: "https://linkedin.com/company/netwk-pro",
|
|
35
|
+
label: "LinkedIn",
|
|
36
|
+
iconClass: "fab fa-linkedin fa-2x",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
href: "https://noc.social/@NetEng_Pro",
|
|
40
|
+
label: "Mastodon",
|
|
41
|
+
rel: "me noopener noreferrer", // Special rel attribute for Mastodon
|
|
42
|
+
iconClass: "fab fa-mastodon fa-2x",
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
href: "https://github.com/netwk-pro/",
|
|
46
|
+
label: "GitHub",
|
|
47
|
+
iconClass: "fab fa-square-github fa-2x",
|
|
48
|
+
},
|
|
49
|
+
];
|
|
50
|
+
</script>
|
|
51
|
+
|
|
52
|
+
<!-- BEGIN SOCIAL MEDIA -->
|
|
53
|
+
<div class="soc-wrap">
|
|
54
|
+
<table class="soc">
|
|
55
|
+
<tbody>
|
|
56
|
+
<tr>
|
|
57
|
+
{#each socialLinks as { href, label, rel = "noopener noreferrer", iconClass }}
|
|
58
|
+
<td class="soc-fa">
|
|
59
|
+
<p>
|
|
60
|
+
<a {rel} {href} target="_blank" aria-label={label}>
|
|
61
|
+
<span class={iconClass}></span>
|
|
62
|
+
</a>
|
|
63
|
+
</p>
|
|
64
|
+
</td>
|
|
65
|
+
{/each}
|
|
66
|
+
</tr>
|
|
67
|
+
</tbody>
|
|
68
|
+
</table>
|
|
69
|
+
</div>
|
|
70
|
+
<!-- END SOCIAL MEDIA -->
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/components/foss/FossFeatures.svelte
|
|
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
|
+
<script>
|
|
9
|
+
/**
|
|
10
|
+
* Array of feature strings that describe the FOSS item
|
|
11
|
+
* @type {string[]}
|
|
12
|
+
*/
|
|
13
|
+
export let features = [];
|
|
14
|
+
</script>
|
|
15
|
+
|
|
16
|
+
<!-- BEGIN FOSS FEATURES -->
|
|
17
|
+
{#if features && features.length > 0}
|
|
18
|
+
<ul>
|
|
19
|
+
{#each features as feature}
|
|
20
|
+
<li>{feature}</li>
|
|
21
|
+
{/each}
|
|
22
|
+
</ul>
|
|
23
|
+
{/if}
|
|
24
|
+
<!-- END FOSS FEATURES -->
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/components/foss/FossItemContent.svelte
|
|
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
|
+
<script>
|
|
9
|
+
import FossFeatures from "$lib/components/foss/FossFeatures.svelte";
|
|
10
|
+
// Import directly from $lib by way of image utility
|
|
11
|
+
import { obtainiumPng, obtainiumWbp } from "$lib";
|
|
12
|
+
|
|
13
|
+
/** @type {"noopener noreferrer"} */
|
|
14
|
+
const rel = "noopener noreferrer";
|
|
15
|
+
|
|
16
|
+
/** @type {string} */
|
|
17
|
+
const obtainiumLink =
|
|
18
|
+
"https://apps.obtainium.imranr.dev/redirect.html?r=obtainium://app/%7B%22id%22%3A%22fe.linksheet.nightly%22%2C%22url%22%3A%22https%3A%2F%2Fgithub.com%2FLinkSheet%2Fnightly%22%2C%22author%22%3A%221fexd%22%2C%22name%22%3A%22LinkSheet%20Nightly%22%2C%22preferredApkIndex%22%3A0%2C%22additionalSettings%22%3A%22%7B%5C%22includePrereleases%5C%22%3Atrue%2C%5C%22fallbackToOlderReleases%5C%22%3Atrue%2C%5C%22filterReleaseTitlesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22filterReleaseNotesByRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22verifyLatestTag%5C%22%3Afalse%2C%5C%22dontSortReleasesList%5C%22%3Afalse%2C%5C%22useLatestAssetDateAsReleaseDate%5C%22%3Afalse%2C%5C%22trackOnly%5C%22%3Afalse%2C%5C%22versionExtractionRegEx%5C%22%3A%5C%22%5C%22%2C%5C%22matchGroupToUse%5C%22%3A%5C%22%5C%22%2C%5C%22versionDetection%5C%22%3Afalse%2C%5C%22releaseDateAsVersion%5C%22%3Afalse%2C%5C%22useVersionCodeAsOSVersion%5C%22%3Afalse%2C%5C%22apkFilterRegEx%5C%22%3A%5C%22LinkSheet.Nightly%5C%22%2C%5C%22invertAPKFilter%5C%22%3Atrue%2C%5C%22autoApkFilterByArch%5C%22%3Atrue%2C%5C%22appName%5C%22%3A%5C%22%5C%22%2C%5C%22shizukuPretendToBeGooglePlay%5C%22%3Afalse%2C%5C%22exemptFromBackgroundUpdates%5C%22%3Afalse%2C%5C%22skipUpdateNotifications%5C%22%3Afalse%2C%5C%22about%5C%22%3A%5C%22Restore%20link%20control%20on%20Android%2012%2B%5C%22%7D%22%7D";
|
|
19
|
+
|
|
20
|
+
/** @type {"async"} */
|
|
21
|
+
const decoding = "async";
|
|
22
|
+
|
|
23
|
+
/** @type {"lazy"} */
|
|
24
|
+
const loading = "lazy";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @type {{
|
|
28
|
+
* id: string,
|
|
29
|
+
* title: string,
|
|
30
|
+
* images: {
|
|
31
|
+
* webp: string,
|
|
32
|
+
* png: string
|
|
33
|
+
* },
|
|
34
|
+
* imgAlt: string,
|
|
35
|
+
* headline: string,
|
|
36
|
+
* headlineDescription: string,
|
|
37
|
+
* detailsDescription: string,
|
|
38
|
+
* features: any[],
|
|
39
|
+
* notes: string[],
|
|
40
|
+
* links: Array<{
|
|
41
|
+
* label?: string,
|
|
42
|
+
* href?: string,
|
|
43
|
+
* imgAlt?: string,
|
|
44
|
+
* downloadText?: string,
|
|
45
|
+
* downloadHref?: string,
|
|
46
|
+
* hideLabels?: boolean
|
|
47
|
+
* }>
|
|
48
|
+
* }}
|
|
49
|
+
*/
|
|
50
|
+
export let fossItem;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Flag indicating if this is the first FOSS item in the list.
|
|
54
|
+
* Only the first item should use eager loading.
|
|
55
|
+
* @type {boolean}
|
|
56
|
+
*/
|
|
57
|
+
export let isFirst = false;
|
|
58
|
+
</script>
|
|
59
|
+
|
|
60
|
+
<!-- BEGIN FOSS ITEMS -->
|
|
61
|
+
<section id={fossItem.id}>
|
|
62
|
+
<div class="foss-wrap">
|
|
63
|
+
<table class="foss">
|
|
64
|
+
<tbody>
|
|
65
|
+
<tr>
|
|
66
|
+
<td class="foss-cell">
|
|
67
|
+
<picture>
|
|
68
|
+
<source srcset={fossItem.images.webp} type="image/webp" />
|
|
69
|
+
<img
|
|
70
|
+
decoding={isFirst ? "sync" : decoding}
|
|
71
|
+
loading={isFirst ? "eager" : loading}
|
|
72
|
+
fetchpriority={isFirst ? "high" : "auto"}
|
|
73
|
+
src={fossItem.images.png}
|
|
74
|
+
alt={fossItem.imgAlt}
|
|
75
|
+
style="width: 50px; height: 50px" />
|
|
76
|
+
</picture>
|
|
77
|
+
</td>
|
|
78
|
+
<td class="foss-cell">
|
|
79
|
+
<h2>{fossItem.title}</h2>
|
|
80
|
+
</td>
|
|
81
|
+
</tr>
|
|
82
|
+
</tbody>
|
|
83
|
+
</table>
|
|
84
|
+
</div>
|
|
85
|
+
|
|
86
|
+
<h3>{fossItem.headline}</h3>
|
|
87
|
+
|
|
88
|
+
{@html fossItem.headlineDescription}
|
|
89
|
+
|
|
90
|
+
<FossFeatures features={fossItem.features} />
|
|
91
|
+
|
|
92
|
+
{@html fossItem.detailsDescription}
|
|
93
|
+
|
|
94
|
+
{#each fossItem.notes as note}
|
|
95
|
+
<blockquote class="bquote">
|
|
96
|
+
{@html note}
|
|
97
|
+
</blockquote>
|
|
98
|
+
{/each}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
<div class="linksheet">
|
|
103
|
+
<!-- Special handling for LinkSheet's Obtainium link -->
|
|
104
|
+
{#if fossItem.id === "linksheet"}
|
|
105
|
+
<div class="linksheet-entry">
|
|
106
|
+
<a {rel} href={obtainiumLink} target="_blank">
|
|
107
|
+
<picture>
|
|
108
|
+
<source srcset={obtainiumWbp} type="image/webp" />
|
|
109
|
+
<img
|
|
110
|
+
decoding={isFirst ? "sync" : decoding}
|
|
111
|
+
loading={isFirst ? "eager" : loading}
|
|
112
|
+
fetchpriority={isFirst ? "high" : "auto"}
|
|
113
|
+
src={obtainiumPng}
|
|
114
|
+
alt="Obtainium"
|
|
115
|
+
style="width: 207px; height: 80px" />
|
|
116
|
+
</picture>
|
|
117
|
+
</a>
|
|
118
|
+
<p>
|
|
119
|
+
<span style="color: #ffc627"
|
|
120
|
+
><i class="fas fa-file-arrow-down" style="margin-left: 8px;"></i
|
|
121
|
+
></span>
|
|
122
|
+
<a
|
|
123
|
+
{rel}
|
|
124
|
+
href="https://raw.githubusercontent.com/netwk-pro/dev-sveltekit/refs/heads/master/assets/bin/linksheet.json"
|
|
125
|
+
download
|
|
126
|
+
type="application/json"
|
|
127
|
+
style="margin-left: 8px;"
|
|
128
|
+
target="_blank">
|
|
129
|
+
Obtainium App Config
|
|
130
|
+
</a>
|
|
131
|
+
</p>
|
|
132
|
+
</div>
|
|
133
|
+
{/if}
|
|
134
|
+
|
|
135
|
+
<!-- Other links -->
|
|
136
|
+
{#each fossItem.links as { label, href, imgAlt, downloadText, downloadHref, hideLabels }, i}
|
|
137
|
+
<!-- Skip the first link for LinkSheet since we already handled it separately -->
|
|
138
|
+
{#if !(fossItem.id === "linksheet" && i === 0)}
|
|
139
|
+
<div class="linksheet-entry">
|
|
140
|
+
{#if !hideLabels && label && href}
|
|
141
|
+
<strong>{label}:</strong>
|
|
142
|
+
<a {rel} {href} target="_blank">{href}</a>
|
|
143
|
+
{/if}
|
|
144
|
+
</div>
|
|
145
|
+
{/if}
|
|
146
|
+
{/each}
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<div class="spacer"></div>
|
|
150
|
+
|
|
151
|
+
<span class="small-text"><a href="#top">Back to top</a></span>
|
|
152
|
+
</section>
|
|
153
|
+
<!-- END FOSS ITEMS -->
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/components/layout/Footer.svelte
|
|
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
|
+
<script>
|
|
9
|
+
import { base } from "$app/paths";
|
|
10
|
+
// Import icons for licenses
|
|
11
|
+
import { bySvg, ccSvg } from "$lib";
|
|
12
|
+
|
|
13
|
+
// Log the base path to verify its value
|
|
14
|
+
//console.log("Base path:", base);
|
|
15
|
+
|
|
16
|
+
// Dynamic links for licensing and trademark
|
|
17
|
+
const ccbyLink = `${base}/license#cc-by`;
|
|
18
|
+
const gnugplLink = `${base}/license#gnu-gpl`;
|
|
19
|
+
const trademarkLink = `${base}/license#trademark`;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Creator details object.
|
|
23
|
+
* @typedef {Object} Creator
|
|
24
|
+
* @property {string} name - The name of the creator.
|
|
25
|
+
* @property {string} url - The URL of the creator's website.
|
|
26
|
+
* @property {string} trademark - The trademark name of the creator.
|
|
27
|
+
* @property {string} slogan - The slogan of the creator.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Icon details object.
|
|
32
|
+
* @typedef {Object} Icon
|
|
33
|
+
* @property {string} src - The source URL of the icon image.
|
|
34
|
+
* @property {string} alt - The alt text for the icon image.
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* License details object.
|
|
39
|
+
* @typedef {Object} License
|
|
40
|
+
* @property {string} type - The type of the license (e.g., "CC BY 4.0").
|
|
41
|
+
* @property {string} url - The internal URL for the license.
|
|
42
|
+
* @property {string} [externalUrl] - The external URL for the license.
|
|
43
|
+
* @property {string} [description] - A brief description of the license.
|
|
44
|
+
* @property {Icon[]} [icons] - An array of icon objects for representing the license visually.
|
|
45
|
+
*/
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* @type {Creator}
|
|
49
|
+
*/
|
|
50
|
+
const creator = {
|
|
51
|
+
name: "Network Pro Strategies",
|
|
52
|
+
url: "https://netwk.pro",
|
|
53
|
+
trademark: "Network Pro™",
|
|
54
|
+
slogan: "Locking Down Networks™",
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* @type {License[]}
|
|
59
|
+
*/
|
|
60
|
+
const licenses = [
|
|
61
|
+
{
|
|
62
|
+
type: "CC BY 4.0",
|
|
63
|
+
url: ccbyLink,
|
|
64
|
+
externalUrl: "https://creativecommons.org/licenses/by/4.0/",
|
|
65
|
+
icons: [
|
|
66
|
+
{
|
|
67
|
+
src: ccSvg,
|
|
68
|
+
alt: "Creative Commons BY",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
src: bySvg,
|
|
72
|
+
alt: "Creative Commons BY",
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
type: "GNU GPL",
|
|
78
|
+
url: gnugplLink,
|
|
79
|
+
externalUrl: "https://fsf.org",
|
|
80
|
+
description: "Free Software Foundation",
|
|
81
|
+
},
|
|
82
|
+
];
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Namespace attributes for the container.
|
|
86
|
+
* @type {Object}
|
|
87
|
+
*/
|
|
88
|
+
const namespaceAttributes = {
|
|
89
|
+
"xmlns:cc": "http://creativecommons.org/ns#",
|
|
90
|
+
"xmlns:dct": "http://purl.org/dc/terms/",
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Relation attributes for external links.
|
|
95
|
+
* @type {string}
|
|
96
|
+
*/
|
|
97
|
+
const rel = "noopener noreferrer";
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Relation attributes for license links.
|
|
101
|
+
* @type {string}
|
|
102
|
+
*/
|
|
103
|
+
const relLicense = "license noopener noreferrer";
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Target attribute for opening links in the same tab.
|
|
107
|
+
* @type {string}
|
|
108
|
+
*/
|
|
109
|
+
const targetSelf = "_self";
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Target attribute for opening links in a new tab.
|
|
113
|
+
* @type {string}
|
|
114
|
+
*/
|
|
115
|
+
const targetBlank = "_blank";
|
|
116
|
+
</script>
|
|
117
|
+
|
|
118
|
+
<!-- BEGIN FOOTER -->
|
|
119
|
+
<div class="copyright" {...namespaceAttributes}>
|
|
120
|
+
<!-- Copyright Section -->
|
|
121
|
+
<p>
|
|
122
|
+
Copyright © 2025<br />
|
|
123
|
+
<a
|
|
124
|
+
rel="cc:attributionURL dct:creator"
|
|
125
|
+
property="cc:attributionName"
|
|
126
|
+
href={creator.url}
|
|
127
|
+
target={targetBlank}>
|
|
128
|
+
<strong>{creator.name}</strong>
|
|
129
|
+
</a>
|
|
130
|
+
({creator.trademark})
|
|
131
|
+
</p>
|
|
132
|
+
|
|
133
|
+
<!-- Trademark Section -->
|
|
134
|
+
<p>
|
|
135
|
+
{creator.trademark}, the shield logo, and the "{creator.slogan}" slogan are
|
|
136
|
+
<a href={trademarkLink} target={targetSelf}>trademarks</a>
|
|
137
|
+
of {creator.name}.
|
|
138
|
+
</p>
|
|
139
|
+
|
|
140
|
+
<!-- Licensing Section -->
|
|
141
|
+
<p>
|
|
142
|
+
Licensed under
|
|
143
|
+
{#each licenses as license, index}
|
|
144
|
+
{#if license.type === "CC BY 4.0"}
|
|
145
|
+
<a
|
|
146
|
+
href={license.url}
|
|
147
|
+
target={targetSelf}
|
|
148
|
+
rel={relLicense}
|
|
149
|
+
style="display: inline-block">
|
|
150
|
+
<strong>{license.type}</strong>
|
|
151
|
+
</a>
|
|
152
|
+
{#if license.icons}
|
|
153
|
+
{#each license.icons as icon}
|
|
154
|
+
<a
|
|
155
|
+
href={license.externalUrl}
|
|
156
|
+
target={targetBlank}
|
|
157
|
+
rel={relLicense}
|
|
158
|
+
style="display: inline-block">
|
|
159
|
+
<img
|
|
160
|
+
decoding="async"
|
|
161
|
+
loading="lazy"
|
|
162
|
+
src={icon.src}
|
|
163
|
+
alt={icon.alt}
|
|
164
|
+
style="
|
|
165
|
+
width: 18px !important;
|
|
166
|
+
height: 18px !important;
|
|
167
|
+
margin-left: 3px;
|
|
168
|
+
text-decoration: none;
|
|
169
|
+
vertical-align: text-bottom;
|
|
170
|
+
" />
|
|
171
|
+
</a>
|
|
172
|
+
{/each}
|
|
173
|
+
{/if}
|
|
174
|
+
{:else}
|
|
175
|
+
<a href={license.url} target={targetSelf} rel={relLicense}>
|
|
176
|
+
<strong>{license.type}</strong>
|
|
177
|
+
</a>
|
|
178
|
+
, as published by the
|
|
179
|
+
<a {rel} href={license.externalUrl} target={targetBlank}
|
|
180
|
+
>{license.description}</a
|
|
181
|
+
>, either version 3 of the License, or (at your option) any later
|
|
182
|
+
version.
|
|
183
|
+
{/if}
|
|
184
|
+
{index < licenses.length - 1 ? ", and the " : ""}
|
|
185
|
+
{/each}
|
|
186
|
+
</p>
|
|
187
|
+
</div>
|
|
188
|
+
<!-- END FOOTER -->
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
<!-- ==========================================================================
|
|
2
|
+
src/lib/components/layout/HeaderDefault.svelte
|
|
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
|
+
<script>
|
|
9
|
+
import { base } from "$app/paths";
|
|
10
|
+
|
|
11
|
+
// Log the base path to verify its value
|
|
12
|
+
//console.log("Base path:", base);
|
|
13
|
+
|
|
14
|
+
const homeLink = base || "/";
|
|
15
|
+
const aboutLink = `${base}/about`;
|
|
16
|
+
const fossLink = `${base}/foss-spotlight`;
|
|
17
|
+
const blogLink = "https://blog.netwk.pro";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Navigation link object.
|
|
21
|
+
* @typedef {Object} NavItem
|
|
22
|
+
* @property {string} label - The text displayed for the link.
|
|
23
|
+
* @property {string} href - The URL or anchor the link points to.
|
|
24
|
+
* @property {string} target - Specifies where to open the link (e.g., "_self" or "_blank").
|
|
25
|
+
* @property {boolean} external - Whether the link points to an external resource.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Array of navigation links.
|
|
30
|
+
* @type {NavItem[]}
|
|
31
|
+
*/
|
|
32
|
+
const nav = [
|
|
33
|
+
{ label: "home", href: homeLink, target: "_self", external: false },
|
|
34
|
+
{ label: "about", href: aboutLink, target: "_self", external: false },
|
|
35
|
+
{ label: "foss", href: fossLink, target: "_self", external: false },
|
|
36
|
+
{
|
|
37
|
+
label: "blog",
|
|
38
|
+
href: blogLink,
|
|
39
|
+
target: "_self",
|
|
40
|
+
external: false,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
label: "discussions",
|
|
44
|
+
href: "https://github.com/netwk-pro/netwk-pro.github.io/discussions",
|
|
45
|
+
target: "_blank",
|
|
46
|
+
external: true,
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
label: "link hub",
|
|
50
|
+
href: "https://linktr.ee/neteng_pro",
|
|
51
|
+
target: "_blank",
|
|
52
|
+
external: true,
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Relation attribute for external links.
|
|
58
|
+
* @type {string}
|
|
59
|
+
*/
|
|
60
|
+
const rel = "noopener noreferrer";
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<!-- BEGIN DEFAULT HEADER -->
|
|
64
|
+
<nav class="center-nav">
|
|
65
|
+
{#each nav as { label, href, target, external }, index}
|
|
66
|
+
<a {href} {target} rel={external ? rel : undefined}>
|
|
67
|
+
{label}
|
|
68
|
+
</a>
|
|
69
|
+
{#if external}
|
|
70
|
+
<sup>
|
|
71
|
+
<span style="color: #ffc627;">
|
|
72
|
+
<i class="fas fa-arrow-up-right-from-square fa-2xs"></i>
|
|
73
|
+
</span>
|
|
74
|
+
</sup>
|
|
75
|
+
{/if}
|
|
76
|
+
<!-- Separator logic -->
|
|
77
|
+
{#if index < nav.length - 1}
|
|
78
|
+
{#if label === "blog"}
|
|
79
|
+
<br />
|
|
80
|
+
{:else}
|
|
81
|
+
<span class="separator">|</span>
|
|
82
|
+
{/if}
|
|
83
|
+
{/if}
|
|
84
|
+
{/each}
|
|
85
|
+
</nav>
|
|
86
|
+
<!-- END DEFAULT HEADER -->
|