+
-
+
Sofie Thorsen
+Software Engineer
+Stockholm, Sweden
+ +
+
+
+
+ I like coding and gaming. Maybe cooking too.
+diff --git a/favicon.ico b/favicon.ico index c6df057..3458fb8 100644 Binary files a/favicon.ico and b/favicon.ico differ diff --git a/index.html b/index.html index 35ae062..9a9993b 100644 --- a/index.html +++ b/index.html @@ -1,45 +1,82 @@ - - +
- - + + + +Software Engineer living in London.
-I like code and games. And owls. Those are cute.
-
-
-
+
+
+
diff --git a/stylesheets/styles.css b/stylesheets/styles.css
index d85b72f..1c68790 100644
--- a/stylesheets/styles.css
+++ b/stylesheets/styles.css
@@ -1,126 +1,387 @@
+/* ================================
+ CSS Reset & Base Styles
+ ================================ */
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ /* Color Palette */
+ --color-primary: #0f172a;
+ --color-secondary: #1e293b;
+ --color-accent: #3b82f6;
+ --color-accent-hover: #2563eb;
+ --color-text: #f1f5f9;
+ --color-text-muted: #94a3b8;
+ --color-border: #334155;
+
+ /* Typography */
+ --font-primary: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
+ --font-display: 'Space Grotesk', -apple-system, BlinkMacSystemFont, sans-serif;
+
+ /* Spacing */
+ --space-xs: 0.5rem;
+ --space-sm: 1rem;
+ --space-md: 1.5rem;
+ --space-lg: 2rem;
+ --space-xl: 3rem;
+ --space-2xl: 4rem;
+
+ /* Transitions */
+ --transition-fast: 150ms ease;
+ --transition-base: 250ms ease;
+ --transition-slow: 400ms ease;
+}
+
html {
- height: 100%
+ font-size: 16px;
+ scroll-behavior: smooth;
}
body {
- font-family: 'Lato';
- background-color: #79bd9a;
+ font-family: var(--font-primary);
+ background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+ color: var(--color-text);
+ line-height: 1.6;
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ position: relative;
+ overflow-x: hidden;
+}
+
+/* ================================
+ Layout
+ ================================ */
+
+.container {
+ flex: 1;
+ width: 100%;
+ max-width: 900px;
+ margin: 0 auto;
+ padding: var(--space-lg);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ z-index: 1;
+}
+
+.hero {
+ width: 100%;
+ text-align: center;
+ animation: fadeIn 0.8s ease;
+}
+
+.hero-content {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: var(--space-md);
+}
+
+/* ================================
+ Gradient Orbs Background
+ ================================ */
+
+.gradient-orbs {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ z-index: 0;
+ pointer-events: none;
+ overflow: hidden;
+}
+
+.orb {
+ position: absolute;
+ border-radius: 50%;
+ filter: blur(80px);
+ opacity: 0.4;
+ animation: float-orb 20s ease-in-out infinite;
+}
+
+.orb-1 {
+ width: 500px;
+ height: 500px;
+ background: radial-gradient(circle, #3b82f6 0%, transparent 70%);
+ top: -10%;
+ left: -10%;
+ animation-delay: 0s;
+ animation-duration: 25s;
+}
+
+.orb-2 {
+ width: 400px;
+ height: 400px;
+ background: radial-gradient(circle, #8b5cf6 0%, transparent 70%);
+ top: 50%;
+ right: -10%;
+ animation-delay: 5s;
+ animation-duration: 30s;
+}
+
+.orb-3 {
+ width: 450px;
+ height: 450px;
+ background: radial-gradient(circle, #06b6d4 0%, transparent 70%);
+ bottom: -15%;
+ left: 30%;
+ animation-delay: 10s;
+ animation-duration: 28s;
+}
+
+/* ================================
+ Typography
+ ================================ */
+
+.name {
+ font-family: var(--font-display);
+ font-size: clamp(2.5rem, 8vw, 4.5rem);
+ font-weight: 700;
+ color: var(--color-text);
+ letter-spacing: -0.02em;
+ margin-bottom: var(--space-xs);
+ background: linear-gradient(135deg, #fff 0%, #94a3b8 100%);
+ -webkit-background-clip: text;
+ -webkit-text-fill-color: transparent;
+ background-clip: text;
+}
+
+.title {
+ font-size: clamp(1.25rem, 3vw, 1.75rem);
+ font-weight: 600;
+ color: var(--color-accent);
+ margin-bottom: var(--space-xs);
}
-h1 {
- font-size: 68px;
- color: rgba(255,255,255,1);
+.location {
+ font-size: 1.125rem;
+ color: var(--color-text-muted);
+ display: flex;
+ align-items: center;
+ gap: var(--space-xs);
+ justify-content: center;
}
-a {
- text-decoration:none;
- color: rgba(255,255,255,0.5);
+
+.location::before {
+ content: "📍";
}
-a:hover {
- color:white;
- text-decoration:none;
+
+.bio {
+ max-width: 600px;
+ margin: var(--space-lg) auto;
+ padding: var(--space-md);
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid var(--color-border);
+ border-radius: 12px;
+ backdrop-filter: blur(10px);
+}
+
+.bio p {
+ font-size: 1.125rem;
+ color: var(--color-text);
+ line-height: 1.7;
}
-p {
- color: rgba(255,255,255,1);
+
+/* ================================
+ Social Links
+ ================================ */
+
+.social-links {
+ display: flex;
+ gap: var(--space-md);
+ justify-content: center;
+ flex-wrap: wrap;
+ margin-top: var(--space-lg);
}
-#contact img {
- margin: 0 auto;
- display: block;
+.social-links a {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 48px;
+ height: 48px;
+ background: rgba(255, 255, 255, 0.05);
+ border: 1px solid var(--color-border);
+ border-radius: 12px;
+ color: var(--color-text-muted);
+ transition: all var(--transition-base);
+ text-decoration: none;
+ backdrop-filter: blur(10px);
}
-#container {
- z-index: 1;
- text-align: center;
- margin: 0 auto;
- position: relative;
- height: 100%;
+.social-links a:hover {
+ background: var(--color-accent);
+ border-color: var(--color-accent);
+ color: white;
+ transform: translateY(-4px);
+ box-shadow: 0 10px 25px rgba(59, 130, 246, 0.3);
}
-#imageContainer {
- z-index: -1;
+.social-links a:active {
+ transform: translateY(-2px);
}
-#footer {
- padding-top: 25px;
- padding-bottom: 25px;
- background-color: #3b8686;
- font-size: 500%;
+.social-links svg {
+ width: 20px;
+ height: 20px;
+ transition: transform var(--transition-fast);
}
-#contact {
- width: 100%;
- text-align: center;
- position: absolute;
- bottom: 0;
- left: 0;
+.social-links a:hover svg {
+ transform: scale(1.1);
}
-@font-face {
- font-family: 'Mono Social Icons Font';
- src: url('MonoSocialIconsFont-1.10.eot');
- src: url('MonoSocialIconsFont-1.10.eot?#iefix') format('embedded-opentype'),
- url('MonoSocialIconsFont-1.10.woff') format('woff'),
- url('MonoSocialIconsFont-1.10.ttf') format('truetype'),
- url('MonoSocialIconsFont-1.10.svg#MonoSocialIconsFont') format('svg');
- src: url('MonoSocialIconsFont-1.10.ttf') format('truetype');
- font-weight: normal;
- font-style: normal;
+/* ================================
+ Footer
+ ================================ */
+
+.site-footer {
+ text-align: center;
+ padding: var(--space-lg);
+ color: var(--color-text-muted);
+ font-size: 0.875rem;
+ border-top: 1px solid var(--color-border);
+ background: rgba(0, 0, 0, 0.2);
}
-.symbol, a.symbol:before {
- font-family: 'Mono Social Icons Font';
- -webkit-text-rendering: optimizeLegibility;
- -moz-text-rendering: optimizeLegibility;
- -ms-text-rendering: optimizeLegibility;
- -o-text-rendering: optimizeLegibility;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-font-smoothing: antialiased;
- -ms-font-smoothing: antialiased;
- -o-font-smoothing: antialiased;
- font-smoothing: antialiased;
+/* ================================
+ Animations
+ ================================ */
+@keyframes fadeIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
}
-a.symbol:before {
- content: attr(icon);
- margin-right: 0em;
- font-size: 80%;
+@keyframes float-orb {
+ 0%, 100% {
+ transform: translate(0, 0) scale(1);
+ }
+ 33% {
+ transform: translate(30px, -30px) scale(1.1);
+ }
+ 66% {
+ transform: translate(-20px, 20px) scale(0.9);
+ }
+}
+
+/* ================================
+ Responsive Design
+ ================================ */
+
+@media (max-width: 768px) {
+ .container {
+ padding: var(--space-md);
+ }
+
+ .hero-content {
+ gap: var(--space-sm);
+ }
+
+ .bio {
+ padding: var(--space-sm);
+ margin: var(--space-md) auto;
+ }
+
+ .bio p {
+ font-size: 1rem;
+ }
+
+ .social-links {
+ gap: var(--space-sm);
+ }
+
+ .social-links a {
+ width: 44px;
+ height: 44px;
+ }
+
+ .orb {
+ filter: blur(60px);
+ }
}
-a.symbol {
- font-variant: normal;
- padding: 7px 5px 3px 5px;
- color: rgba(255,255,255,0.5);
- text-decoration: none;
- -webkit-transition-timing-function: ease-out;
- -webkit-transition-duration: 500ms;
- -moz-transition-timing-function: ease-out;
- -moz-transition-duration: 500ms;
- position: relative;
+@media (max-width: 480px) {
+ .name {
+ font-size: 2rem;
+ }
+
+ .title {
+ font-size: 1.125rem;
+ }
+
+ .location {
+ font-size: 1rem;
+ }
+ .social-links a {
+ width: 40px;
+ height: 40px;
+ }
+
+ .social-links svg {
+ width: 18px;
+ height: 18px;
+ }
}
-a:hover.symbol {
- padding-top: 10px;
- color:white;
- -webkit-transition-timing-function: ease-out;
- -webkit-transition-duration: 500ms;
- -moz-transition-timing-function: ease-out;
- -moz-transition-duration: 500ms;
- position: relative;
- z-index: 99;
+
+/* ================================
+ Accessibility
+ ================================ */
+
+@media (prefers-reduced-motion: reduce) {
+ *,
+ *::before,
+ *::after {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ }
+
+ .orb {
+ animation: none !important;
+ }
}
-#typed-cursor{
- opacity: 1;
- font-weight: 100;
- // add prefixes
- animation: blink 0.7s infinite;
+/* Focus styles for keyboard navigation */
+a:focus-visible,
+button:focus-visible {
+ outline: 2px solid var(--color-accent);
+ outline-offset: 4px;
+ border-radius: 4px;
}
-@-keyframes blink{
- 0% { opacity:1; }
- 50% { opacity:0; }
- 100% { opacity:1; }
+/* ================================
+ Print Styles
+ ================================ */
+
+@media print {
+ body {
+ background: white;
+ color: black;
+ }
+
+ .social-links a {
+ border: 1px solid black;
+ }
+
+ .gradient-orbs {
+ display: none;
+ }
}
\ No newline at end of file