diff --git a/src/lib/navigation.ts b/src/lib/navigation.ts
index 6e2eb5ad..c6710e22 100644
--- a/src/lib/navigation.ts
+++ b/src/lib/navigation.ts
@@ -67,6 +67,46 @@ export function createMainNavigation(
{
title: 'Stopwatch & Timer',
url: '/tools/stopwatch-timer'
+ },
+ {
+ title: 'QR Code Generator',
+ url: '/tools/qr-code-generator'
+ },
+ {
+ title: 'Base64 Converter',
+ url: '/tools/base64-converter'
+ },
+ {
+ title: 'JSON Formatter',
+ url: '/tools/json-formatter'
+ },
+ {
+ title: 'Color Picker',
+ url: '/tools/color-picker'
+ },
+ {
+ title: 'URL Tools',
+ url: '/tools/url-tools'
+ },
+ {
+ title: 'Hash Generator',
+ url: '/tools/hash-generator'
+ },
+ {
+ title: 'Lorem Generator',
+ url: '/tools/lorem-generator'
+ },
+ {
+ title: 'ASCII Art',
+ url: '/tools/ascii-art'
+ },
+ {
+ title: 'Markdown Preview',
+ url: '/tools/markdown-preview'
+ },
+ {
+ title: 'Regex Tester',
+ url: '/tools/regex-tester'
}
]
},
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index f7da8651..28798599 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -15,7 +15,17 @@
{ name: 'Word Counter', url: '/tools/word-counter' },
{ name: 'Password Generator', url: '/tools/password-generator' },
{ name: 'Random Number Generator', url: '/tools/random-number-generator' },
- { name: 'Stopwatch & Timer', url: '/tools/stopwatch-timer' }
+ { name: 'Stopwatch & Timer', url: '/tools/stopwatch-timer' },
+ { name: 'QR Code Generator', url: '/tools/qr-code-generator' },
+ { name: 'Base64 Converter', url: '/tools/base64-converter' },
+ { name: 'JSON Formatter', url: '/tools/json-formatter' },
+ { name: 'Color Picker', url: '/tools/color-picker' },
+ { name: 'URL Tools', url: '/tools/url-tools' },
+ { name: 'Hash Generator', url: '/tools/hash-generator' },
+ { name: 'Lorem Generator', url: '/tools/lorem-generator' },
+ { name: 'ASCII Art', url: '/tools/ascii-art' },
+ { name: 'Markdown Preview', url: '/tools/markdown-preview' },
+ { name: 'Regex Tester', url: '/tools/regex-tester' }
];
diff --git a/src/routes/tools/ascii-art/+page.svelte b/src/routes/tools/ascii-art/+page.svelte
new file mode 100644
index 00000000..72aea053
--- /dev/null
+++ b/src/routes/tools/ascii-art/+page.svelte
@@ -0,0 +1,147 @@
+
+
+
+
+
+ ASCII Art Generator
+ Convert text into ASCII art
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if output}
+
+ {/if}
+
+
+ {#if output}
+
+ {/if}
+
+
+
Supported characters: A-Z, space, !, ?
+
Tip: Keep text short (max 20 characters) for best results
+
Note: ASCII art works best with monospace fonts
+
+
+
+
diff --git a/src/routes/tools/base64-converter/+page.svelte b/src/routes/tools/base64-converter/+page.svelte
new file mode 100644
index 00000000..2c8a9a5a
--- /dev/null
+++ b/src/routes/tools/base64-converter/+page.svelte
@@ -0,0 +1,107 @@
+
+
+
+
+
+ Base64 Encoder/Decoder
+ Encode text to Base64 or decode Base64 back to text
+
+
+
+
+ Encode
+ Decode
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if outputText}
+
+ {/if}
+
+
+ {#if error}
+
+ {error}
+
+ {/if}
+
+ {#if outputText}
+
+
Result:
+
+
+ {/if}
+
+
+
diff --git a/src/routes/tools/color-picker/+page.svelte b/src/routes/tools/color-picker/+page.svelte
new file mode 100644
index 00000000..a788c1d5
--- /dev/null
+++ b/src/routes/tools/color-picker/+page.svelte
@@ -0,0 +1,234 @@
+
+
+
+
+
+ Color Picker & Palette
+ Pick colors and get values in different formats
+
+
+
+
+
+
+
+
+
Color Values
+
+
+
+
HEX:
+
+ {selectedColor.toUpperCase()}
+
+
+
+
+ {#if rgb()}
+
+
RGB:
+
+ rgb({rgb()?.r}, {rgb()?.g}, {rgb()?.b})
+
+
+
+ {/if}
+
+ {#if hsl()}
+
+
HSL:
+
+ hsl({hsl()?.h}, {hsl()?.s}%, {hsl()?.l}%)
+
+
+
+ {/if}
+
+
+
+
+
+ {#if complementaryColors().length > 0}
+
+
Complementary Color
+
+ {#each complementaryColors() as color}
+
+ {/each}
+
+
+ {/if}
+
+
+ {#if colorHistory.length > 0}
+
+
Recent Colors
+
+ {#each colorHistory as color}
+
+ {/each}
+
+
+ {/if}
+
+
+
diff --git a/src/routes/tools/hash-generator/+page.svelte b/src/routes/tools/hash-generator/+page.svelte
new file mode 100644
index 00000000..d61bfa50
--- /dev/null
+++ b/src/routes/tools/hash-generator/+page.svelte
@@ -0,0 +1,153 @@
+
+
+
+
+
+ Hash Generator
+ Generate MD5, SHA1, SHA256, and CRC32 hashes from text
+
+
+
+
+
+
+
+
+
+
+
+ {#if Object.keys(hashes).length > 0}
+
+
Generated Hashes:
+
+ {#each Object.entries(hashes) as [algorithm, hash]}
+
+
+ {algorithm}
+
+
+
+ {hash}
+
+
+ {/each}
+
+ {/if}
+
+ {#if inputText.trim()}
+
+
Input length: {inputText.length} characters
+
Input bytes: {new TextEncoder().encode(inputText).length} bytes
+
+ {/if}
+
+
+
Hash Information:
+
+ -
+ MD5: 128-bit hash, commonly used but not cryptographically secure
+
+ - SHA1: 160-bit hash, deprecated for cryptographic use
+ -
+ SHA256: 256-bit hash, part of SHA-2 family, cryptographically secure
+
+ -
+ CRC32: 32-bit checksum, used for error detection, not cryptographically
+ secure
+
+
+
+
+
+
diff --git a/src/routes/tools/json-formatter/+page.svelte b/src/routes/tools/json-formatter/+page.svelte
new file mode 100644
index 00000000..b2393183
--- /dev/null
+++ b/src/routes/tools/json-formatter/+page.svelte
@@ -0,0 +1,145 @@
+
+
+
+
+
+ JSON Formatter & Validator
+ Format, validate, and minify JSON data
+
+
+
+
+
+
Input JSON
+
+ {#if inputJson.trim()}
+
+ {isValid ? 'Valid' : 'Invalid'}
+
+ {/if}
+
+
+
+
+
+
+
Formatted Output
+
+
+
+
+ {#if error}
+
+ Error:
+ {error}
+
+ {/if}
+
+
+
+
+
+ {#if outputJson}
+
+ {/if}
+
+
+
+
+
+
+
+
+
diff --git a/src/routes/tools/lorem-generator/+page.svelte b/src/routes/tools/lorem-generator/+page.svelte
new file mode 100644
index 00000000..ea549944
--- /dev/null
+++ b/src/routes/tools/lorem-generator/+page.svelte
@@ -0,0 +1,265 @@
+
+
+
+
+
+ Lorem Ipsum Generator
+ Generate placeholder text for your designs and layouts
+
+
+
+
+
+
+
+ {#if output}
+
+ {/if}
+
+
+ {#if output}
+
+
Generated Text:
+
+
+ {/if}
+
+
+
+ Tip: Lorem ipsum is placeholder text commonly used in the printing and typesetting
+ industry since the 1500s.
+
+ {#if output}
+
+ Generated:
+ {count} paragraph{count !== 1 ? 's' : ''}, {output.split(' ').length} words, {output
+ .split(/[.!?]+/)
+ .filter((s) => s.trim()).length} sentences
+
+ {/if}
+
+
+
+
diff --git a/src/routes/tools/markdown-preview/+page.svelte b/src/routes/tools/markdown-preview/+page.svelte
new file mode 100644
index 00000000..139e8bcd
--- /dev/null
+++ b/src/routes/tools/markdown-preview/+page.svelte
@@ -0,0 +1,314 @@
+
+
+
+
+
+ Markdown Preview
+ Write markdown and see the live preview
+
+
+
+
+
+ Split View
+ Markdown Only
+ Preview Only
+
+
+
+
+
+
+
+
+
+
+
+
Markdown Input:
+
+
+
+
Live Preview:
+
+ {@html htmlOutput}
+
+
+
+
+
+
+
+
+
+
+ {@html htmlOutput}
+
+
+
+
+
+
+
+
diff --git a/src/routes/tools/qr-code-generator/+page.svelte b/src/routes/tools/qr-code-generator/+page.svelte
new file mode 100644
index 00000000..7144343d
--- /dev/null
+++ b/src/routes/tools/qr-code-generator/+page.svelte
@@ -0,0 +1,67 @@
+
+
+
+
+
+ QR Code Generator
+ Generate QR codes from text, URLs, or any other data
+
+
+
+
+
+
+
+
+
+
+
+ {#if qrCodeUrl}
+
+

+
+
+ {/if}
+
+
+
diff --git a/src/routes/tools/regex-tester/+page.svelte b/src/routes/tools/regex-tester/+page.svelte
new file mode 100644
index 00000000..64e06622
--- /dev/null
+++ b/src/routes/tools/regex-tester/+page.svelte
@@ -0,0 +1,282 @@
+
+
+
+
+
+ Regular Expression Tester
+ Test and debug regular expressions with live matching
+
+
+
+
+
+
+
+
+ {isValid ? 'Valid' : 'Invalid'}
+
+ {#if pattern && flags}
+ /{pattern}/{flags}
+ {/if}
+ {#if matches.length > 0}
+ {matches.length} match{matches.length !== 1 ? 'es' : ''}
+ {/if}
+
+
+ {#if error}
+
+ Error:
+ {error}
+
+ {/if}
+
+
+
+
Common Patterns:
+
+ {#each commonPatterns as commonPattern}
+
+ {/each}
+
+
+
+
+
+
+
+
+
+
+ {#if testString}
+
+
Text with Matches Highlighted:
+
+ {@html getHighlightedText()}
+
+
+ {/if}
+
+
+ {#if matches.length > 0}
+
+
Matches ({matches.length}):
+
+ {#each matches as match, index}
+
+
+ {match[0]}
+
+ Position: {match.index}
+
+
+ {#if match.length > 1}
+
+ Groups: {match
+ .slice(1)
+ .map((group, i) => `$${i + 1}: "${group}"`)
+ .join(', ')}
+
+ {/if}
+
+ {/each}
+
+
+ {/if}
+
+
+
+
+
+ {#if pattern}
+
+ {/if}
+ {#if matches.length > 0}
+
+ {/if}
+
+
+
+
+
+ Common flags: g (global), i (case-insensitive), m (multiline), s (dotall)
+
+
Tip: Use capture groups () to extract parts of matches
+
+
+
+
diff --git a/src/routes/tools/url-tools/+page.svelte b/src/routes/tools/url-tools/+page.svelte
new file mode 100644
index 00000000..67e59aff
--- /dev/null
+++ b/src/routes/tools/url-tools/+page.svelte
@@ -0,0 +1,202 @@
+
+
+
+
+
+ URL Tools
+ Shorten URLs and analyze URL components
+
+
+
+
+ Shorten
+ Analyze
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {#if urlAnalysis()}
+
+
URL Components:
+
+
+ Protocol:
+ {urlAnalysis()?.protocol}
+
+
+ Hostname:
+ {urlAnalysis()?.hostname}
+
+ {#if urlAnalysis()?.port}
+
+ Port:
+ {urlAnalysis()?.port}
+
+ {/if}
+ {#if urlAnalysis()?.pathname && urlAnalysis()?.pathname !== '/'}
+
+ Path:
+ {urlAnalysis()?.pathname}
+
+ {/if}
+ {#if urlAnalysis()?.search}
+
+ Query:
+ {urlAnalysis()?.search}
+
+ {/if}
+ {#if urlAnalysis()?.hash}
+
+ Fragment:
+ {urlAnalysis()?.hash}
+
+ {/if}
+
+
+ {/if}
+
+
+
+
+
+ {#if outputUrl}
+
+ {/if}
+
+
+ {#if error}
+
+ {error}
+
+ {/if}
+
+ {#if outputUrl && outputUrl !== inputUrl}
+
+ {/if}
+
+
+