Initial commit: MorseQuest - Complete amateur radio education platform

- Complete Product Requirements Document with full technical specs
- MorseQuest adventure-based branding and visual identity
- All logos, icons, and brand assets ready for development
- Freemium business model ($9.95/year, first year free launch strategy)
- Ready for Keylink IT Forge platform deployment

Phase 1 MVP ready to begin (10-12 week timeline)
This commit is contained in:
2026-04-29 15:18:08 -05:00
commit 7ea8f12a31
13 changed files with 1772 additions and 0 deletions
+62
View File
@@ -0,0 +1,62 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" width="80" height="80">
<defs>
<radialGradient id="expertGradient" cx="0.5" cy="0.3">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="50%" stop-color="#FFA500"/>
<stop offset="100%" stop-color="#DAA520"/>
</radialGradient>
<radialGradient id="gemGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#FFFFFF"/>
<stop offset="50%" stop-color="#87CEEB"/>
<stop offset="100%" stop-color="#4169E1"/>
</radialGradient>
<filter id="expertShadow">
<feDropShadow dx="2" dy="2" stdDeviation="3" flood-color="#000" flood-opacity="0.4"/>
</filter>
</defs>
<!-- Badge star shape -->
<g transform="translate(40, 40)">
<polygon points="0,-32 8,-10 30,-10 15,2 23,24 0,12 -23,24 -15,2 -30,-10 -8,-10"
fill="url(#expertGradient)" stroke="#B8860B" stroke-width="2" filter="url(#expertShadow)"/>
</g>
<!-- Inner circle -->
<circle cx="40" cy="40" r="20" fill="#8B0000" stroke="#DAA520" stroke-width="2"/>
<!-- Central gem -->
<circle cx="40" cy="35" r="6" fill="url(#gemGradient)" stroke="#4169E1" stroke-width="1"/>
<!-- Telegraph key symbol -->
<g transform="translate(40, 45) scale(0.5)">
<rect x="-8" y="-2" width="16" height="3" rx="1.5" fill="#DAA520"/>
<circle cx="-8" cy="0" r="3" fill="#DAA520"/>
<circle cx="8" cy="0" r="2" fill="#DAA520"/>
</g>
<!-- "E" for Expert -->
<text x="40" y="32" font-family="serif" font-size="12" font-weight="bold"
fill="#FFFFFF" text-anchor="middle">E</text>
<!-- Decorative corners -->
<g transform="translate(15, 15)">
<polygon points="0,0 3,1 1,3" fill="#DAA520"/>
</g>
<g transform="translate(65, 15)">
<polygon points="0,0 -3,1 -1,3" fill="#DAA520"/>
</g>
<g transform="translate(15, 65)">
<polygon points="0,0 3,-1 1,-3" fill="#DAA520"/>
</g>
<g transform="translate(65, 65)">
<polygon points="0,0 -3,-1 -1,-3" fill="#DAA520"/>
</g>
<!-- Lightning bolts for speed -->
<g transform="translate(25, 40)">
<path d="M0,-5 L3,-1 L1,0 L4,4 L-1,1 L1,0 Z" fill="#FFFF00" opacity="0.8"/>
</g>
<g transform="translate(55, 40)">
<path d="M0,-5 L3,-1 L1,0 L4,4 L-1,1 L1,0 Z" fill="#FFFF00" opacity="0.8"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

+46
View File
@@ -0,0 +1,46 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 80 80" width="80" height="80">
<defs>
<radialGradient id="noviceGradient" cx="0.5" cy="0.3">
<stop offset="0%" stop-color="#CD7F32"/>
<stop offset="70%" stop-color="#A0522D"/>
<stop offset="100%" stop-color="#8B4513"/>
</radialGradient>
<radialGradient id="noviceGemGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#87CEEB"/>
<stop offset="50%" stop-color="#4169E1"/>
<stop offset="100%" stop-color="#191970"/>
</radialGradient>
<filter id="badgeShadow">
<feDropShadow dx="2" dy="2" stdDeviation="2" flood-color="#000" flood-opacity="0.3"/>
</filter>
</defs>
<!-- Badge circle -->
<circle cx="40" cy="40" r="36" fill="url(#noviceGradient)" stroke="#654321" stroke-width="2" filter="url(#badgeShadow)"/>
<!-- Inner ring -->
<circle cx="40" cy="40" r="30" fill="none" stroke="#F4A460" stroke-width="1.5"/>
<!-- Quest shield (novice crest) -->
<g transform="translate(40, 38)">
<path d="M-12,-10 L12,-10 L12,2 Q12,10 0,16 Q-12,10 -12,2 Z"
fill="#F4A460" stroke="#654321" stroke-width="1.2"/>
<!-- Quest gem on shield -->
<circle cx="0" cy="-2" r="3.5" fill="url(#noviceGemGradient)" stroke="#4169E1" stroke-width="0.6"/>
</g>
<!-- "N" for Novice -->
<text x="40" y="61" font-family="serif" font-size="14" font-weight="bold"
fill="#F4A460" text-anchor="middle">NOVICE</text>
<!-- Stars around the edge -->
<g transform="translate(40, 15)">
<polygon points="0,-3 1,0 4,0 2,2 3,5 0,3 -3,5 -2,2 -4,0 -1,0" fill="#F4A460"/>
</g>
<g transform="translate(65, 40)">
<polygon points="0,-2 0.5,0 2,0 1,1 1.5,3 0,2 -1.5,3 -1,1 -2,0 -0.5,0" fill="#F4A460"/>
</g>
<g transform="translate(15, 40)">
<polygon points="0,-2 0.5,0 2,0 1,1 1.5,3 0,2 -1.5,3 -1,1 -2,0 -0.5,0" fill="#F4A460"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

+21
View File
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 48 24" width="48" height="24">
<defs>
<linearGradient id="dashGradient" x1="0%" y1="0%" x2="0%" y2="100%">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="50%" stop-color="#DAA520"/>
<stop offset="100%" stop-color="#B8860B"/>
</linearGradient>
<filter id="dashShadow">
<feDropShadow dx="1" dy="2" stdDeviation="1" flood-color="#8B4513" flood-opacity="0.5"/>
</filter>
</defs>
<!-- Outer glow -->
<rect x="2" y="2" width="44" height="20" rx="10" fill="#D4AF37" opacity="0.2"/>
<!-- Main dash -->
<rect x="6" y="6" width="36" height="12" rx="6" fill="url(#dashGradient)" filter="url(#dashShadow)"/>
<!-- Highlight -->
<rect x="8" y="8" width="12" height="4" rx="2" fill="#FFFF88" opacity="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 825 B

+21
View File
@@ -0,0 +1,21 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
<defs>
<radialGradient id="dotGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="50%" stop-color="#DAA520"/>
<stop offset="100%" stop-color="#B8860B"/>
</radialGradient>
<filter id="dotShadow">
<feDropShadow dx="1" dy="1" stdDeviation="1" flood-color="#8B4513" flood-opacity="0.5"/>
</filter>
</defs>
<!-- Outer glow -->
<circle cx="12" cy="12" r="10" fill="#D4AF37" opacity="0.2"/>
<!-- Main dot -->
<circle cx="12" cy="12" r="6" fill="url(#dotGradient)" filter="url(#dotShadow)"/>
<!-- Highlight -->
<circle cx="10" cy="10" r="2" fill="#FFFF88" opacity="0.6"/>
</svg>

After

Width:  |  Height:  |  Size: 751 B

+33
View File
@@ -0,0 +1,33 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60 40" width="60" height="40">
<defs>
<radialGradient id="brassGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="40%" stop-color="#DAA520"/>
<stop offset="100%" stop-color="#B8860B"/>
</radialGradient>
</defs>
<!-- Key base -->
<ellipse cx="30" cy="28" rx="20" ry="7" fill="#654321"/>
<ellipse cx="30" cy="26" rx="20" ry="7" fill="url(#brassGradient)"/>
<!-- Key lever -->
<rect x="15" y="19" width="35" height="5" rx="2.5" fill="url(#brassGradient)"/>
<!-- Key knob (left side) -->
<circle cx="15" cy="22" r="6" fill="#654321"/>
<circle cx="15" cy="21" r="6" fill="url(#brassGradient)"/>
<circle cx="15" cy="20" r="3" fill="#FFD700"/>
<!-- Connection point (right side) -->
<circle cx="50" cy="22" r="4" fill="#654321"/>
<circle cx="50" cy="21" r="4" fill="url(#brassGradient)"/>
<!-- Connection wires -->
<path d="M35,23 Q45,15 55,10" stroke="#654321" stroke-width="1.5" fill="none"/>
<path d="M35,23 Q45,30 55,35" stroke="#654321" stroke-width="1.5" fill="none"/>
<!-- Base mounting screws -->
<circle cx="20" cy="26" r="1" fill="#8B4513"/>
<circle cx="40" cy="26" r="1" fill="#8B4513"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

+88
View File
@@ -0,0 +1,88 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 80" width="600" height="80">
<defs>
<!-- Gradient for telegraph key -->
<radialGradient id="brassGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="40%" stop-color="#DAA520"/>
<stop offset="100%" stop-color="#B8860B"/>
</radialGradient>
<!-- Text gradient -->
<linearGradient id="textGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#8B4513"/>
<stop offset="50%" stop-color="#D4AF37"/>
<stop offset="100%" stop-color="#CD7F32"/>
</linearGradient>
<!-- Quest gem gradient -->
<radialGradient id="gemGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#87CEEB"/>
<stop offset="50%" stop-color="#4169E1"/>
<stop offset="100%" stop-color="#191970"/>
</radialGradient>
</defs>
<!-- Telegraph key assembly -->
<g transform="translate(20, 20)">
<!-- Key base -->
<ellipse cx="20" cy="35" rx="15" ry="6" fill="#8B4513"/>
<ellipse cx="20" cy="33" rx="15" ry="6" fill="url(#brassGradient)"/>
<!-- Key lever -->
<rect x="12" y="28" width="30" height="4" rx="2" fill="url(#brassGradient)"/>
<circle cx="42" cy="30" r="3" fill="#8B4513"/>
<circle cx="42" cy="29" r="3" fill="url(#brassGradient)"/>
<!-- Key knob -->
<circle cx="12" cy="30" r="4" fill="#8B4513"/>
<circle cx="12" cy="29" r="4" fill="url(#brassGradient)"/>
<circle cx="12" cy="28" r="2" fill="#FFD700"/>
<!-- Quest gem on key -->
<circle cx="20" cy="25" r="2.5" fill="url(#gemGradient)" stroke="#4169E1" stroke-width="0.5"/>
</g>
<!-- Main title text -->
<text x="80" y="35" font-family="serif" font-size="26" font-weight="bold" fill="url(#textGradient)">
MORSEQUEST
</text>
<!-- Morse code visualization -->
<g transform="translate(80, 50)">
<!-- Dots and dashes representing "CQ" (calling anyone) -->
<circle cx="0" cy="8" r="2" fill="#D4AF37"/>
<rect x="8" y="6" width="8" height="4" rx="2" fill="#D4AF37"/>
<circle cx="22" cy="8" r="2" fill="#D4AF37"/>
<rect x="30" y="6" width="8" height="4" rx="2" fill="#D4AF37"/>
<rect x="50" y="6" width="8" height="4" rx="2" fill="#DAA520"/>
<rect x="62" y="6" width="8" height="4" rx="2" fill="#DAA520"/>
<circle cx="78" cy="8" r="2" fill="#DAA520"/>
<rect x="86" y="6" width="8" height="4" rx="2" fill="#DAA520"/>
<!-- Signal waves -->
<path d="M0,15 Q15,10 30,15 T60,15 T90,15" stroke="#DAA520" stroke-width="1.5" fill="none" opacity="0.5"/>
</g>
<!-- Tagline -->
<text x="450" y="25" font-family="sans-serif" font-size="9" fill="#8B4513" text-anchor="middle">
Learn Morse Code
</text>
<text x="450" y="38" font-family="sans-serif" font-size="9" fill="#8B4513" text-anchor="middle">
Master Amateur Radio
</text>
<text x="450" y="51" font-family="sans-serif" font-size="9" fill="#8B4513" text-anchor="middle">
Adventure Awaits
</text>
<!-- Quest sword accent -->
<g transform="translate(570, 18)">
<rect x="0" y="-12" width="2.5" height="24" fill="#B8860B"/>
<rect x="-4" y="-14" width="11" height="3" fill="#DAA520"/>
<circle cx="1.25" cy="-16" r="1.8" fill="#4169E1"/>
</g>
<!-- Decorative accent line -->
<rect x="20" y="70" width="560" height="1.5" fill="#D4AF37" opacity="0.5"/>
<rect x="20" y="74" width="560" height="1.5" fill="#4169E1" opacity="0.4"/>
</svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

+80
View File
@@ -0,0 +1,80 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" width="100" height="100">
<defs>
<!-- Gradient for telegraph key -->
<radialGradient id="brassGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="40%" stop-color="#DAA520"/>
<stop offset="100%" stop-color="#B8860B"/>
</radialGradient>
<!-- Background gradient -->
<radialGradient id="bgGradient" cx="0.5" cy="0.3">
<stop offset="0%" stop-color="#F5E6D3"/>
<stop offset="70%" stop-color="#D4AF37" stop-opacity="0.3"/>
<stop offset="100%" stop-color="#4169E1" stop-opacity="0.25"/>
</radialGradient>
<!-- Quest gem gradient -->
<radialGradient id="gemGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#87CEEB"/>
<stop offset="50%" stop-color="#4169E1"/>
<stop offset="100%" stop-color="#191970"/>
</radialGradient>
</defs>
<!-- Background circle with adventure theme -->
<circle cx="50" cy="50" r="48" fill="url(#bgGradient)" stroke="#8B4513" stroke-width="2"/>
<circle cx="50" cy="50" r="45" fill="none" stroke="#D4AF37" stroke-width="1" opacity="0.5"/>
<!-- Telegraph key assembly - centered and larger -->
<g transform="translate(50, 50)">
<!-- Key base -->
<ellipse cx="0" cy="15" rx="18" ry="7" fill="#654321"/>
<ellipse cx="0" cy="13" rx="18" ry="7" fill="url(#brassGradient)"/>
<!-- Key lever -->
<rect x="-15" y="6" width="35" height="6" rx="3" fill="url(#brassGradient)"/>
<circle cx="20" cy="9" r="4" fill="#654321"/>
<circle cx="20" cy="8" r="4" fill="url(#brassGradient)"/>
<!-- Key knob -->
<circle cx="-15" cy="9" r="6" fill="#654321"/>
<circle cx="-15" cy="8" r="6" fill="url(#brassGradient)"/>
<circle cx="-15" cy="7" r="3" fill="#FFD700"/>
<!-- Connection posts -->
<rect x="5" y="13" width="3" height="8" fill="#654321"/>
<rect x="-8" y="13" width="3" height="8" fill="#654321"/>
<!-- Quest gem on key -->
<circle cx="0" cy="2" r="3.5" fill="url(#gemGradient)" stroke="#4169E1" stroke-width="0.6"/>
</g>
<!-- Morse code dots and dashes around the key -->
<g transform="translate(50, 25)">
<circle cx="-20" cy="0" r="2.5" fill="#D4AF37"/>
<rect x="-10" y="-1.5" width="8" height="3" rx="1.5" fill="#D4AF37"/>
<circle cx="5" cy="0" r="2.5" fill="#D4AF37"/>
<rect x="15" y="-1.5" width="8" height="3" rx="1.5" fill="#D4AF37"/>
</g>
<!-- Signal waves emanating from key -->
<g opacity="0.4">
<circle cx="50" cy="50" r="20" fill="none" stroke="#DAA520" stroke-width="1.5"/>
<circle cx="50" cy="50" r="30" fill="none" stroke="#4169E1" stroke-width="1"/>
<circle cx="50" cy="50" r="40" fill="none" stroke="#DAA520" stroke-width="0.5"/>
</g>
<!-- Quest sword accent -->
<g transform="translate(25, 25)">
<rect x="-1" y="-6" width="2" height="12" fill="#B8860B"/>
<rect x="-3" y="-7.5" width="6" height="2" fill="#DAA520"/>
<circle cx="0" cy="-9" r="1.6" fill="#4169E1"/>
</g>
<!-- Subtle accent line at base -->
<g transform="translate(50, 85)" opacity="0.6">
<rect x="-30" y="0" width="60" height="1.5" fill="#D4AF37"/>
<rect x="-30" y="3" width="60" height="1.5" fill="#4169E1" opacity="0.7"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

+86
View File
@@ -0,0 +1,86 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 100" width="320" height="100">
<defs>
<!-- Gradient for telegraph key -->
<radialGradient id="brassGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#FFD700"/>
<stop offset="40%" stop-color="#DAA520"/>
<stop offset="100%" stop-color="#B8860B"/>
</radialGradient>
<!-- Text gradient -->
<linearGradient id="textGradient" x1="0%" y1="0%" x2="100%" y2="0%">
<stop offset="0%" stop-color="#8B4513"/>
<stop offset="50%" stop-color="#D4AF37"/>
<stop offset="100%" stop-color="#CD7F32"/>
</linearGradient>
<!-- Quest gem gradient -->
<radialGradient id="gemGradient" cx="0.3" cy="0.3">
<stop offset="0%" stop-color="#87CEEB"/>
<stop offset="50%" stop-color="#4169E1"/>
<stop offset="100%" stop-color="#191970"/>
</radialGradient>
</defs>
<!-- Telegraph key assembly -->
<g transform="translate(20, 25)">
<!-- Key base -->
<ellipse cx="20" cy="35" rx="15" ry="6" fill="#8B4513"/>
<ellipse cx="20" cy="33" rx="15" ry="6" fill="url(#brassGradient)"/>
<!-- Key lever -->
<rect x="12" y="28" width="30" height="4" rx="2" fill="url(#brassGradient)"/>
<circle cx="42" cy="30" r="3" fill="#8B4513"/>
<circle cx="42" cy="29" r="3" fill="url(#brassGradient)"/>
<!-- Key knob -->
<circle cx="12" cy="30" r="4" fill="#8B4513"/>
<circle cx="12" cy="29" r="4" fill="url(#brassGradient)"/>
<circle cx="12" cy="28" r="2" fill="#FFD700"/>
<!-- Quest gem on key -->
<circle cx="20" cy="25" r="3" fill="url(#gemGradient)" stroke="#4169E1" stroke-width="0.5"/>
</g>
<!-- "MORSE" text -->
<text x="80" y="40" font-family="serif" font-size="32" font-weight="bold" fill="url(#textGradient)">
MORSE
</text>
<!-- "QUEST" text with adventure styling -->
<text x="80" y="75" font-family="serif" font-size="32" font-weight="bold" fill="url(#textGradient)">
QUEST
</text>
<!-- Quest sword accent -->
<g transform="translate(290, 35)">
<rect x="0" y="-15" width="3" height="30" fill="#B8860B"/>
<rect x="-5" y="-18" width="13" height="4" fill="#DAA520"/>
<circle cx="1.5" cy="-20" r="2" fill="#4169E1"/>
</g>
<!-- Morse code dots and dashes -->
<g transform="translate(85, 55)">
<!-- Spell out "CQ" in Morse -->
<circle cx="0" cy="8" r="2" fill="#D4AF37"/>
<rect x="8" y="6" width="8" height="4" rx="2" fill="#D4AF37"/>
<circle cx="22" cy="8" r="2" fill="#D4AF37"/>
<rect x="30" y="6" width="8" height="4" rx="2" fill="#D4AF37"/>
<rect x="50" y="6" width="8" height="4" rx="2" fill="#DAA520"/>
<rect x="62" y="6" width="8" height="4" rx="2" fill="#DAA520"/>
<circle cx="78" cy="8" r="2" fill="#DAA520"/>
<rect x="86" y="6" width="8" height="4" rx="2" fill="#DAA520"/>
</g>
<!-- Tagline -->
<text x="160" y="15" font-family="sans-serif" font-size="9" fill="#8B4513" text-anchor="middle">
Learn Morse Code • Master Amateur Radio • Adventure Awaits
</text>
<!-- Signal waves -->
<g opacity="0.3">
<path d="M75,80 Q85,75 95,80 T115,80 T135,80" stroke="#DAA520" stroke-width="1" fill="none"/>
<path d="M75,85 Q90,78 105,85 T125,85 T145,85" stroke="#DAA520" stroke-width="0.8" fill="none"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.2 KiB