@networkpro/web 1.5.6 → 1.6.1

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.
@@ -0,0 +1,98 @@
1
+ /* ==========================================================================
2
+ src/hooks.server.js
3
+
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
5
+ SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
6
+ This file is part of Network Pro.
7
+ ========================================================================== */
8
+
9
+ /**
10
+ * SvelteKit server hook to set Content Security Policy (CSP) header.
11
+ * @type {import('@sveltejs/kit').Handle}
12
+ */
13
+ export async function handle({ event, resolve }) {
14
+ // Create the response
15
+ const response = await resolve(event);
16
+
17
+ // Check if the environment is for testing
18
+ const isTestEnvironment =
19
+ process.env.NODE_ENV === "test" || process.env.ENV_MODE === "ci";
20
+
21
+ // Set the Content Security Policy header
22
+ if (isTestEnvironment) {
23
+ // Relaxed CSP for testing: Allow inline scripts and eval
24
+ response.headers.set(
25
+ "Content-Security-Policy",
26
+ [
27
+ "default-src 'self';",
28
+ "script-src 'self' 'unsafe-inline' 'unsafe-eval' ws://localhost:*;", // Allow inline and eval scripts, and websockets for local testing
29
+ "style-src 'self' 'unsafe-inline';", // Allow inline styles
30
+ "img-src 'self' data:;", // Allow images from same origin and data URIs
31
+ "connect-src 'self';", // Allow connections only to same origin
32
+ "font-src 'self' data:;", // Allow fonts from same origin and data URIs
33
+ "form-action 'self';", // Allow forms to post to same origin
34
+ "base-uri 'self';", // Restrict base URIs to same origin
35
+ "object-src 'none';", // Block all object sources
36
+ "frame-ancestors 'none';", // Prevent framing of the site
37
+ "upgrade-insecure-requests;", // Automatically upgrade HTTP to HTTPS
38
+ "report-uri /api/mock-csp;", // Mock CSP reports for testing
39
+ ].join(" "),
40
+ );
41
+ } else {
42
+ // Production or development environment: use a more restrictive CSP
43
+ response.headers.set(
44
+ "Content-Security-Policy",
45
+ [
46
+ "default-src 'self';", // Allow resources from same origin
47
+ "script-src 'self' 'unsafe-inline';", // Allow inline scripts
48
+ "style-src 'self' 'unsafe-inline';", // Allow inline styles
49
+ "img-src 'self' data:;", // Allow images from same origin and data URIs
50
+ "connect-src 'self';", // Allow connections only to same origin
51
+ "font-src 'self' data:;", // Allow fonts from same origin and data URIs
52
+ "form-action 'self';", // Allow forms to post to same origin
53
+ "base-uri 'self';", // Restrict base URIs to same origin
54
+ "object-src 'none';", // Block all object sources
55
+ "frame-ancestors 'none';", // Prevent framing of the site
56
+ "upgrade-insecure-requests;", // Automatically upgrade HTTP to HTTPS
57
+ `report-uri ${process.env.ENV_MODE === "prod" ? "/.netlify/functions/cspReport" : "/api/mock-csp"};`, // Add CSP report URI for violations
58
+ ].join(" "),
59
+ );
60
+ }
61
+
62
+ // Set other security headers
63
+ response.headers.set(
64
+ "Permissions-Policy",
65
+ [
66
+ "fullscreen=(self)",
67
+ "sync-xhr=()",
68
+ "camera=()",
69
+ "microphone=()",
70
+ "geolocation=()",
71
+ "clipboard-read=()",
72
+ "clipboard-write=()",
73
+ "payment=()",
74
+ "usb=()",
75
+ "hid=()",
76
+ "gamepad=()",
77
+ "serial=()",
78
+ "publickey-credentials-get=()",
79
+ "interest-cohort=()",
80
+ "topics=()",
81
+ ].join(", "),
82
+ );
83
+
84
+ response.headers.set("X-Content-Type-Options", "nosniff");
85
+ response.headers.set("Referrer-Policy", "strict-origin-when-cross-origin");
86
+ response.headers.set("X-Frame-Options", "DENY");
87
+
88
+ if (process.env.ENV_MODE !== "test" && process.env.ENV_MODE !== "ci") {
89
+ response.headers.set(
90
+ "Strict-Transport-Security",
91
+ "max-age=2592000; includeSubDomains;", // Use max-age of 30 days
92
+ );
93
+ }
94
+
95
+ return response;
96
+ }
97
+
98
+ // cspell:ignore licdn
@@ -8,8 +8,8 @@ This file is part of Network Pro.
8
8
 
9
9
  <script>
10
10
  /**
11
- * Array of feature strings that describe the FOSS item
12
- * @type {string[]}
11
+ * Array of feature objects that describe the FOSS item
12
+ * @type {Array<{ emoji: string, label: string, description: string }>}
13
13
  */
14
14
  export let features = [];
15
15
  </script>
@@ -17,9 +17,62 @@ This file is part of Network Pro.
17
17
  <!-- BEGIN FOSS FEATURES -->
18
18
  {#if features && features.length > 0}
19
19
  <ul>
20
- {#each features as feature}
21
- <li>{feature}</li>
20
+ {#each features as feature, index}
21
+ <li class="emoji">
22
+ {#if index === 0}
23
+ <span class="headline">
24
+ {feature.emoji}
25
+ <span class="label">{feature.label}</span>
26
+ {#if feature.description && feature.description.trim()}
27
+ <span class="description">&mdash; {feature.description}</span>
28
+ {/if}
29
+ </span>
30
+ {:else}
31
+ {feature.emoji}
32
+ <span class="label">{feature.label}</span>
33
+ {#if feature.description && feature.description.trim()}
34
+ <span class="description">&mdash; {feature.description}</span>
35
+ {/if}
36
+ {/if}
37
+ </li>
22
38
  {/each}
23
39
  </ul>
24
40
  {/if}
41
+
25
42
  <!-- END FOSS FEATURES -->
43
+
44
+ <style>
45
+ ul {
46
+ margin: 0;
47
+ list-style-type: none;
48
+ padding-left: 0;
49
+ }
50
+
51
+ ul li {
52
+ font-weight: 600;
53
+ margin-bottom: 0.5em;
54
+ }
55
+
56
+ .emoji {
57
+ margin-right: 8px;
58
+ }
59
+
60
+ .headline {
61
+ display: block; /* Ensure it is on its own line */
62
+ font-weight: bold; /* Keep the first item bold */
63
+ font-style: italic; /* Only make the first item italic */
64
+ margin-bottom: 4px; /* Add space between headline and the rest */
65
+ }
66
+
67
+ .label {
68
+ font-weight: bold; /* Keep the label bold */
69
+ font-family: inherit; /* Ensure it uses the same font-family as normal text */
70
+ }
71
+
72
+ .description {
73
+ display: inline; /* Keep description inline */
74
+ font-weight: normal; /* Ensure the description is normal (not bold) */
75
+ font-family: inherit; /* Ensure it uses the same font-family as normal text */
76
+ font-style: normal; /* Remove italic for the description */
77
+ }
78
+ </style>
@@ -89,7 +89,7 @@ This file is part of Network Pro.
89
89
  <h3>{fossItem.headline}</h3>
90
90
 
91
91
  <!-- Trusted input, from internal CMS -->
92
- {@html fossItem.detailsDescription}
92
+ {@html fossItem.headlineDescription}
93
93
 
94
94
  <FossFeatures features={fossItem.features} />
95
95
 
@@ -14,7 +14,7 @@ This file is part of Network Pro.
14
14
  import { bySvg, ccSvg } from "$lib";
15
15
 
16
16
  // Log the base path to verify its value
17
- //console.log("Base path:", base);
17
+ console.log("Base path:", base);
18
18
 
19
19
  // Dynamic links for licensing and trademark
20
20
  const ccbyLink = `${base}/license#cc-by`;
@@ -10,7 +10,7 @@ This file is part of Network Pro.
10
10
  import { base } from "$app/paths";
11
11
 
12
12
  // Log the base path to verify its value
13
- //console.log("Base path:", base);
13
+ console.log("Base path:", base);
14
14
 
15
15
  const homeLink = base || "/";
16
16
  const aboutLink = `${base}/about`;
@@ -10,7 +10,7 @@ This file is part of Network Pro.
10
10
  import { base } from "$app/paths";
11
11
 
12
12
  // Log the base path to verify its value
13
- //console.log("Base path:", base);
13
+ console.log("Base path:", base);
14
14
 
15
15
  const aboutLink = `${base}/about`;
16
16
  const fossLink = `${base}/foss-spotlight`;
@@ -1,14 +1,99 @@
1
1
  /* ==========================================================================
2
2
  src/lib/data/fossData.js
3
3
 
4
+ Copyright © 2025 Network Pro Strategies (Network Pro™)
4
5
  SPDX-License-Identifier: CC-BY-4.0 OR GPL-3.0-or-later
5
6
  This file is part of Network Pro.
6
7
  ========================================================================== */
7
8
 
9
+ // cspell:ignore lsheet eauth bolditalic tosdr
10
+
8
11
  // Import FOSS images
9
- import { acodePng, acodeWbp, lsheetPng, lsheetWbp, pmxPng, pmxWbp, tosPng, tosWbp, urlPng, urlWbp } from "$lib";
12
+ import { acodePng, acodeWbp, eauthPng, eauthWbp, lsheetPng, lsheetWbp, pmxPng, pmxWbp, tosPng, tosWbp, urlPng, urlWbp } from "$lib";
10
13
 
11
14
  export const fossData = [
15
+ {
16
+ id: "eauth",
17
+ images: {
18
+ webp: eauthWbp,
19
+ png: eauthPng,
20
+ },
21
+ imgAlt: "Ente Auth",
22
+ title: "Ente Auth",
23
+ headline: "🔐 Elevate Your 2FA Game with Ente Auth — The Cross-Platform Open-Source Powerhouse!",
24
+ headlineDescription: `
25
+ <p>
26
+ This week's <strong>FOSS Spotlight</strong> is on <strong>Ente Auth</strong> — the sleek, open-source 2FA authenticator that's putting privacy and usability front and center.
27
+ </p>
28
+ <p>
29
+ Whether you're a dev, a cybersecurity enthusiast, or simply serious about protecting your accounts, <strong>Ente Auth</strong> offers a next-level authentication experience — <strong>backed by encryption, not ads.</strong>
30
+ </p>
31
+ `,
32
+ features: [
33
+ {
34
+ emoji: "✨",
35
+ label: "Why Make the Switch to Ente Auth?",
36
+ isIntro: true
37
+ },
38
+ {
39
+ emoji: "✔️",
40
+ label: "End-to-End Encrypted Backups",
41
+ description: "Never lose access to your 2FA codes again."
42
+ },
43
+ {
44
+ emoji: "✔️",
45
+ label: "Cross-Platform Sync",
46
+ description: "Android, iOS, Windows, macOS, Linux, Web — all covered."
47
+ },
48
+ {
49
+ emoji: "✔️",
50
+ label: "Offline Functionality",
51
+ description: "No account or connection? No problem."
52
+ },
53
+ {
54
+ emoji: "✔️",
55
+ label: "Intuitive UX",
56
+ description: "Easily search, preview the next code, and share tokens securely."
57
+ },
58
+ {
59
+ emoji: "✔️",
60
+ label: "Audited Open Source",
61
+ description: "Reviewed by top-tier security firms."
62
+ },
63
+ {
64
+ emoji: "✔️",
65
+ label: "Free Forever",
66
+ description: "No ads. No tracking. Just transparent, user-first security."
67
+ }
68
+ ],
69
+ detailsDescription: `
70
+ <p>
71
+ We've long backed <strong>Aegis</strong> — and still do. But <strong>Aegis lacks true cross-platform support</strong>. That's where <strong>Ente Auth</strong> shines.
72
+ </p>
73
+ <p>
74
+ Take control of your authentication experience. <strong>Embrace the freedom of private, seamless, and secure 2FA.</strong>
75
+ </p>
76
+ `,
77
+ links: [
78
+ {
79
+ label: "GitHub",
80
+ href: "https://github.com/ente-io/ente/",
81
+ },
82
+ {
83
+ label: "F-Droid",
84
+ href: "https://f-droid.org/packages/io.ente.auth/",
85
+ },
86
+ {
87
+ label: "Website",
88
+ href: "https://ente.io/auth/",
89
+ },
90
+ {
91
+ label: "Play Store",
92
+ href: "https://play.google.com/store/apps/details?id=io.ente.auth",
93
+ },
94
+ ],
95
+ notes: [],
96
+ },
12
97
  {
13
98
  id: "pmx",
14
99
  images: {
@@ -19,28 +104,56 @@ export const fossData = [
19
104
  title: "Permission Manager X",
20
105
  headline: "Take Control of App Permissions Like a Pro with PMX!",
21
106
  headlineDescription: `
22
- <p>Introducing Permission Manager X (PMX), the open-source, lightweight Android tool that provides you with full control over your app's permissions without the need for root access.</p>
23
- <p>PMX was designed with user autonomy and simplicity in mind, enabling users to fully manage app permissions (both manifest permissions and AppOps) on Android devices.</p>
107
+ <p>
108
+ Introducing Permission Manager X (PMX), the open-source, lightweight Android tool that provides you with full control over your app's permissions without the need for root access.
109
+ </p>
110
+ <p>
111
+ PMX was designed with user autonomy and simplicity in mind, enabling users to fully manage app permissions (both manifest permissions and AppOps) on Android devices.
112
+ </p>
24
113
  `,
25
114
  features: [
26
- "Granular, On-Demand Permission Control",
27
- "Sensitive Data Access Monitoring",
28
- "Autostart Abuse Prevention",
29
- "Clean, Ad-Free Interface",
30
- "Wireless ADB Support (No Root)",
115
+ {
116
+ emoji: "⚡",
117
+ label: "Why Choose PMX?",
118
+ isIntro: true
119
+ },
120
+ {
121
+ emoji: "✔️",
122
+ label: "Granular, On-Demand Permission Control",
123
+ description: "Instantly block or allow app permissions with real-time control."
124
+ },
125
+ {
126
+ emoji: "✔️",
127
+ label: "Sensitive Data Access Monitoring",
128
+ description: "See which apps access your camera, mic, location, and more."
129
+ },
130
+ {
131
+ emoji: "✔️",
132
+ label: "Autostart Abuse Prevention",
133
+ description: "Halt apps that auto-launch and exploit background permissions."
134
+ },
135
+ {
136
+ emoji: "✔️",
137
+ label: "Clean, Ad-Free Interface",
138
+ description: "Lightweight UI with zero ads, trackers, or unnecessary bloat."
139
+ },
140
+ {
141
+ emoji: "✔️",
142
+ label: "Wireless ADB Support (No Root)",
143
+ description: "Advanced controls via ADB—wireless if supported—no root needed."
144
+ }
31
145
  ],
32
146
  detailsDescription: `
33
- <p>PMX offers a wealth of features for anyone evaluating mobile security tools, be they an IT professional, developer, or privacy-conscious user.</p>
34
- <p>⚡ <span class="bolditalic">Why Choose PMX?</span><br />
35
- ✔️ <strong>Granular, On-Demand Permission Control:</strong> Instantly block or allow app permissions with real-time control.<br />
36
- ✔️ <strong>Sensitive Data Access Monitoring:</strong> See which apps access your camera, mic, location, and more.<br />
37
- ✔️ <strong>Autostart Abuse Prevention:</strong> Halt apps that auto-launch and exploit background permissions.<br />
38
- ✔️ <strong>Clean, Ad-Free Interface:</strong> Lightweight UI with zero ads, trackers, or unnecessary bloat.<br />
39
- ✔️ <strong>Wireless ADB Support (No Root):</strong> Advanced controls via ADB—wireless if supported—no root needed.<br />
40
- </p>
41
- <p>No ads. No tracking. Just privacy made easy.<br />
42
- This isn't just another utility — it's a <em>must-have</em> for anyone serious about mobile privacy and transparency.</p>
43
- <p>Try it now and liberate your Android from bloatware permission abuse!</p>
147
+ <p>
148
+ PMX offers a wealth of features for anyone evaluating mobile security tools, be they an IT professional, developer, or privacy-conscious user.
149
+ </p>
150
+ <p>
151
+ No ads. No tracking. Just privacy made easy.<br />
152
+ This isn't just another utility — it's a <em>must-have</em> for anyone serious about mobile privacy and transparency.
153
+ </p>
154
+ <p>
155
+ Try it now and liberate your Android from bloatware permission abuse!
156
+ </p>
44
157
  `,
45
158
  links: [
46
159
  {
@@ -76,26 +189,55 @@ export const fossData = [
76
189
  headline:
77
190
  "Discover ToS;DR - The Open-Source Project That Translates Legal Jargon into Clarity",
78
191
  headlineDescription: `
79
- <p>We've all been there&mdash;scrolling past walls of legal text and clicking “I agree” just to get on with it. But what exactly are we agreeing to?</p>
80
- <p><strong>ToS;DR (Terms of Service; Didn't Read)</strong> is the open-source project that helps you find out—without needing a law degree.</p>
192
+ <p>
193
+ We've all been there&mdash;scrolling past walls of legal text and clicking “I agree” just to get on with it. But what exactly are we agreeing to?
194
+ </p>
195
+ <p>
196
+ <strong>ToS;DR (Terms of Service; Didn't Read)</strong> is the open-source project that helps you find out—without needing a law degree.
197
+ </p>
81
198
  `,
82
199
  features: [
83
- "Community-driven ratings from A (best) to E (worst)",
84
- "Clear summaries of complex terms and privacy policies",
85
- "Highlights of key clauses—both good and bad",
86
- "No account needed, completely free to use",
87
- "Transparent, open-source code and contribution process",
200
+ {
201
+ emoji: "✨",
202
+ label: "Why ToS;DR?",
203
+ isIntro: true
204
+ },
205
+ {
206
+ emoji: "✔️",
207
+ label: "Community-driven ratings",
208
+ description: "from A (best) to E (worst)."
209
+ },
210
+ {
211
+ emoji: "✔️",
212
+ label: "Clear summaries of complex terms and privacy policies",
213
+ description: ""
214
+ },
215
+ {
216
+ emoji: "✔️",
217
+ label: "Highlights of key clauses",
218
+ description: "both good and bad."
219
+ },
220
+ {
221
+ emoji: "✔️",
222
+ label: "No account needed, completely free to use",
223
+ description: ""
224
+ },
225
+ {
226
+ emoji: "✔️",
227
+ label: "Transparent, open-source code and contribution process",
228
+ description: ""
229
+ }
88
230
  ],
89
231
  detailsDescription: `
90
- <p>✨ <span class="bolditalic">Why ToS;DR?</span><br />
91
- ✔️ Community-driven ratings from A (best) to E (worst)<br />
92
- ✔️ Clear summaries of complex terms and privacy policies<br />
93
- ✔️ Highlights of key clauses—both good and bad<br />
94
- ✔️ No account needed, completely free to use<br />
95
- ✔️ Transparent, open-source code and contribution process</p>
96
- <p>Whether you're a privacy advocate, a curious user, or someone tired of blindly agreeing to questionable terms, ToS;DR helps you make informed decisions about the services you use every day.</p>
97
- <p>💡 From browser extensions to a dedicated <strong>Android app on F-Droid</strong>, ToS;DR is privacy-conscious, ad-free, and built to empower.</p>
98
- <p>Stay informed, protect your rights, and take back control of your digital life—one ToS at a time.</p>
232
+ <p>
233
+ Whether you're a privacy advocate, a curious user, or someone tired of blindly agreeing to questionable terms, ToS;DR helps you make informed decisions about the services you use every day.
234
+ </p>
235
+ <p>
236
+ 💡 From browser extensions to a dedicated <strong>Android app on F-Droid</strong>, ToS;DR is privacy-conscious, ad-free, and built to empower.
237
+ </p>
238
+ <p>
239
+ Stay informed, protect your rights, and take back control of your digital life—one ToS at a time.
240
+ </p>
99
241
  `,
100
242
  links: [
101
243
  {
@@ -103,13 +245,13 @@ export const fossData = [
103
245
  href: "https://f-droid.org/en/packages/xyz.ptgms.tosdr/",
104
246
  },
105
247
  {
106
- label: "GitHub (works with Obtanium)",
248
+ label: "GitHub (works with Obtainium)",
107
249
  href: "https://github.com/tosdr/tosdr-android",
108
250
  },
109
251
  { label: "Website", href: "https://tosdr.org/" },
110
252
  ],
111
253
  notes: [
112
- `While the latest <a rel="noopener noreferrer" href="https://reports.exodus-privacy.eu.org/en/reports/592855/">Exodus</a> privacy audit shows the <a rel="noopener noreferrer" href="https://play.google.com/store/apps/details?id=xyz.ptgms.tosdr">Play Store</a> version is free of trackers, we'd still recommend opting for the F-Droid version or installing via <a rel="noopener noreferrer" href="https://github.com/ImranR98/Obtainium">Obtanium</a>.`,
254
+ `While the latest <a rel="noopener noreferrer" href="https://reports.exodus-privacy.eu.org/en/reports/592855/">Exodus</a> privacy audit shows the <a rel="noopener noreferrer" href="https://play.google.com/store/apps/details?id=xyz.ptgms.tosdr">Play Store</a> version is free of trackers, we'd still recommend opting for the F-Droid version or installing via <a rel="noopener noreferrer" href="https://github.com/ImranR98/Obtainium">Obtainium</a>.`,
113
255
  ],
114
256
  },
115
257
  {
@@ -123,23 +265,46 @@ export const fossData = [
123
265
  headline:
124
266
  "Bring the power of a full-fledged IDE to your Android device with Acode!",
125
267
  headlineDescription: `
126
- <p>Discover Acode, the open-source code editor that brings the power of a full-fledged IDE to your Android device. Whether you're tweaking HTML, crafting CSS, or debugging JavaScript, Acode has you covered.</p>
268
+ <p>
269
+ Discover Acode, the open-source code editor that brings the power of a full-fledged IDE to your Android device. Whether you're tweaking HTML, crafting CSS, or debugging JavaScript, Acode has you covered.
270
+ </p>
127
271
  `,
128
272
  features: [
129
- "Lightweight & fast",
130
- "Supports over 100 programming languages",
131
- "Offline functionality—no internet needed",
132
- "Integrated Git support",
133
- "Customizable themes & syntax highlighting",
273
+ {
274
+ emoji: "✨",
275
+ label: "Why Acode?",
276
+ isIntro: true
277
+ },
278
+ {
279
+ emoji: "✔️",
280
+ label: "Lightweight & fast",
281
+ description: ""
282
+ },
283
+ {
284
+ emoji: "✔️",
285
+ label: "Supports over 100 programming languages",
286
+ description: ""
287
+ },
288
+ {
289
+ emoji: "✔️",
290
+ label: "Offline functionality",
291
+ description: "no internet needed."
292
+ },
293
+ {
294
+ emoji: "✔️",
295
+ label: "Integrated Git support",
296
+ description: ""
297
+ },
298
+ {
299
+ emoji: "✔️",
300
+ label: "Customizable themes & syntax highlighting",
301
+ description: ""
302
+ }
134
303
  ],
135
304
  detailsDescription: `
136
- <p>✨ <span class="bolditalic">Why Acode?</span><br />
137
- ✔️ Lightweight & fast<br />
138
- ✔️ Supports over 100 programming languages<br />
139
- ✔️ Offline functionality—no internet needed<br />
140
- ✔️ Integrated Git support<br />
141
- ✔️ Customizable themes & syntax highlighting</p>
142
- <p>Perfect for developers on the go, students, or anyone passionate about coding and open-source software.</p>
305
+ <p>
306
+ Perfect for developers on the go, students, or anyone passionate about coding and open-source software.
307
+ </p>
143
308
  `,
144
309
  links: [
145
310
  { label: "GitHub", href: "https://github.com/Acode-Foundation/Acode" },
@@ -164,20 +329,43 @@ export const fossData = [
164
329
  headline:
165
330
  "Restore link control on Android 12 and later with LinkSheet Nightly.",
166
331
  headlineDescription: `
167
- <p>LinkSheet is a powerful tool that restores the ability to choose which app opens your links on Android 12 and later. With its Material Design interface, LinkSheet allows you to set custom preferences for specific hosts, enhancing your privacy and control.</p>
332
+ <p>
333
+ LinkSheet is a powerful tool that restores the ability to choose which app opens your links on Android 12 and later. With its Material Design interface, LinkSheet allows you to set custom preferences for specific hosts, enhancing your privacy and control.
334
+ </p>
168
335
  `,
169
336
  features: [
170
- "Regain Choice: Decide which app opens your links, bypassing Android's default restrictions.",
171
- "Custom Preferences: Set your preferred browser or app for specific hosts.",
172
- "Enhanced Privacy: Prevent unwanted app launches and ensure links open where you intend.",
173
- "User-Friendly Interface: Enjoy a sleek, Material Design that integrates seamlessly with your device.",
337
+ {
338
+ emoji: "✨",
339
+ label: "Why LinkSheet?",
340
+ isIntro: true
341
+ },
342
+ {
343
+ emoji: "✔️",
344
+ label: "Regain Choice",
345
+ description: "Decide which app opens your links, bypassing Android's default restrictions."
346
+ },
347
+ {
348
+ emoji: "✔️",
349
+ label: "Custom Preferences",
350
+ description: "Set your preferred browser or app for specific hosts."
351
+ },
352
+ {
353
+ emoji: "✔️",
354
+ label: "Enhanced Privacy",
355
+ description: "Prevent unwanted app launches and ensure links open where you intend."
356
+ },
357
+ {
358
+ emoji: "✔️",
359
+ label: "User-Friendly Interface",
360
+ description: "Enjoy a sleek, Material Design that integrates seamlessly with your device."
361
+ },
362
+ {
363
+ emoji: "✔️",
364
+ label: "Customizable themes & syntax highlighting",
365
+ description: ""
366
+ }
174
367
  ],
175
368
  detailsDescription: `
176
- <p>✨ <span class="bolditalic">Why LinkSheet?</span><br />
177
- ✔️ <strong>Regain Choice:</strong> Decide which app opens your links, bypassing Android's default restrictions.<br />
178
- ✔️ <strong>Custom Preferences:</strong> Set your preferred browser or app for specific hosts.<br />
179
- ✔️ <strong>Enhanced Privacy:</strong> Prevent unwanted app launches and ensure links open where you intend.<br />
180
- ✔️ <strong>User-Friendly Interface:</strong> Enjoy a sleek, Material Design that integrates seamlessly with your device.</p>
181
369
  `,
182
370
  links: [
183
371
  {
@@ -208,18 +396,33 @@ export const fossData = [
208
396
  title: "URLCheck",
209
397
  headline: "Analyze and inspect links before opening them with URLCheck.",
210
398
  headlineDescription: `
211
- <p>URLCheck is a must-have for privacy-conscious users! This app helps you analyze and inspect links before opening them, protecting you from trackers, malicious sites, and other online threats.</p>
399
+ <p>
400
+ URLCheck is a must-have for privacy-conscious users! This app helps you analyze and inspect links before opening them, protecting you from trackers, malicious sites, and other online threats.
401
+ </p>
212
402
  `,
213
403
  features: [
214
- "Automatic URL screening: Set it as your default browser for real-time link analysis.",
215
- "Full transparency: Know what's behind a link before you click.",
216
- "Stronger privacy & security: Stay safe online with minimal effort.",
404
+ {
405
+ emoji: "🔍",
406
+ label: "Why you need it:",
407
+ isIntro: true
408
+ },
409
+ {
410
+ emoji: "✔️",
411
+ label: "Automatic URL Screening",
412
+ description: "Set it as your default browser for real-time link analysis."
413
+ },
414
+ {
415
+ emoji: "✔️",
416
+ label: "Full Transparency",
417
+ description: "Know what's behind a link before you click."
418
+ },
419
+ {
420
+ emoji: "✔️",
421
+ label: "Stronger Privacy & Security",
422
+ description: "Stay safe online with minimal effort!"
423
+ }
217
424
  ],
218
425
  detailsDescription: `
219
- <p>🔍 <span class="bolditalic">Why you need it:</span><br />
220
- ✔️ <b>Automatic URL screening:</b> Set it as your default browser for real-time link analysis.<br />
221
- ✔️ <b>Full transparency:</b> Know what's behind a link before you click.<br />
222
- ✔️ <b>Stronger privacy & security:</b> Stay safe online with minimal effort!</p>
223
426
  `,
224
427
  links: [
225
428
  { label: "GitHub", href: "https://github.com/TrianguloY/URLCheck" },
package/src/lib/images.js CHANGED
@@ -38,6 +38,8 @@ import obtainiumWbp from "$lib/img/obtainium.webp";
38
38
  // Import images for posts
39
39
  import acodePng from "$lib/img/posts/acode.png";
40
40
  import acodeWbp from "$lib/img/posts/acode.webp";
41
+ import eauthPng from "$lib/img/posts/eauth.png";
42
+ import eauthWbp from "$lib/img/posts/eauth.webp";
41
43
  import lsheetPng from "$lib/img/posts/linksheet.png";
42
44
  import lsheetWbp from "$lib/img/posts/linksheet.webp";
43
45
  import pmxPng from "$lib/img/posts/pmx.png";
@@ -60,6 +62,8 @@ export {
60
62
  bySvg,
61
63
  ccBadge,
62
64
  ccSvg,
65
+ eauthPng,
66
+ eauthWbp,
63
67
  faviconSvg,
64
68
  gplBadge,
65
69
  logoPng,
@@ -78,3 +82,5 @@ export {
78
82
  urlWbp,
79
83
  vcfSrc
80
84
  };
85
+
86
+ // cspell:ignore eauth
Binary file
Binary file