diff --git a/main.go b/main.go index cf8d3e9..212f9bb 100644 --- a/main.go +++ b/main.go @@ -55,7 +55,6 @@ func main() { http.HandleFunc("/cinema", Cinema) http.HandleFunc("/engine", Engine) http.HandleFunc("/portfolio", Portfolio) - http.HandleFunc("/git", func(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "https://git.samantha42.xyz", http.StatusFound) }) diff --git a/site b/site index 032feac..73c9f9b 100755 Binary files a/site and b/site differ diff --git a/static/about.html b/static/about.html index 0db5cfc..cfca9df 100644 --- a/static/about.html +++ b/static/about.html @@ -93,6 +93,15 @@
Aalborg University · Expected 2028
+
+
2024 — 2025
+
+
Mathematics-Technology & Computer Science (BSc)
+
Aalborg University · 1 semester
+ discontinued +
+
+
2020 —
2023
@@ -136,6 +145,61 @@
+
+

Movie/Show Top list

+ +
+ +
+
    +
  1. + Blade Runner 2049 + +
  2. +
  3. A Cure of Wellness + +
  4. + +
  5. Fight Club + +
  6. +
  7. Dracula: A Love Tale + +
  8. +
  9. Girl with a Dragon Tattoo + +
  10. +
+
+
+ +
+ +
+
    +
  1. Chernobyl + +
  2. +
  3. Succession + +
  4. +
  5. Breaking Bad + +
  6. +
  7. Avatar: The Last Airbender + +
  8. +
  9. Adolescence + +
  10. +
+
+
+
diff --git a/static/movies.md b/static/movies.md new file mode 100644 index 0000000..c8f7435 --- /dev/null +++ b/static/movies.md @@ -0,0 +1,69 @@ += Top 5 Movies +1. Blade Runner 2049 +2. A cure of Wellness +3. Fight Club +4. Dracula: A Love Tale +5. Girl with a Dragon Tattoo + + += Movies +- Tenet +- The Outrun +- Hail Mary +- Day Break +- l, Tonya (2018) +- Caddo lake (2024) +- The Shawshank Redemption +- Fight Club +- Perl +- A Cure of Wellness, (2016) +- green book +- spirited away +- Saltburn +- Dracula: A Love Tale (2025) +- Frankenstein (2015) +- The Fall Guy +- The Notebook +- Primal Fear +- blade runner 2049 +- girl with a dragon tatto +- Wicked +- Matrix +- Book of Eli +- Pulp Fiction +- Midsommer +- Living +- Moneyball +- Legally Blonde (2001) +- Dune +- Internal sunshine + + +== Danish +- A royal affiar +- Adams æbler + += Top 5 Shows +1. Chernobyl +2. Succesion +3. Breaking Bad +4. Avatar, the last air bender +5. Adolescence + += Shows +- succesion +- Breaking bad +- Adolescence (2025) +- The penguin +- Community +- Avatar, the last air bender +- Foundation +- Lessons in Chemistry +- Hanna +- You +- killing eve +- ozark +- Chernobyl +- The wire + + diff --git a/static/portfolio.html b/static/portfolio.html index 42d442f..fa690ff 100644 --- a/static/portfolio.html +++ b/static/portfolio.html @@ -4,8 +4,147 @@ Portfolio — Samantha Friis - - + +
@@ -59,6 +198,40 @@
+ +
+ + connecting to backend… + · + uptime — + · + db — + + +
+ + +
+
+

Positions

+

+
+
+

Total Shares

+

+
+
+

Total Trades

+

+
+
+

Currencies

+

+
+
+ + +

// positions

@@ -75,11 +248,35 @@ + + + +
loading…
+ +

// companies — tracked universe

+
+ + + + + + + + + + + + + +
SymbolCurrencyPriceShares OutstandingMarket Cap
loading…
+
+ +
+
+
+ +
+

@@ -108,6 +310,7 @@ Symbol Asset Ccy + Currency Date Dir Qty @@ -116,15 +319,19 @@ open to load trades + + expand to load trades
+
@@ -189,309 +396,242 @@
\ No newline at end of file diff --git a/static/posters/AcureForWellness.jpg b/static/posters/AcureForWellness.jpg new file mode 100644 index 0000000..9afda5e Binary files /dev/null and b/static/posters/AcureForWellness.jpg differ diff --git a/static/posters/Adolescence.webp b/static/posters/Adolescence.webp new file mode 100644 index 0000000..578a922 Binary files /dev/null and b/static/posters/Adolescence.webp differ diff --git a/static/posters/Avatar.webp b/static/posters/Avatar.webp new file mode 100644 index 0000000..025d73d Binary files /dev/null and b/static/posters/Avatar.webp differ diff --git a/static/posters/Breaking Bad.webp b/static/posters/Breaking Bad.webp new file mode 100644 index 0000000..18414e3 Binary files /dev/null and b/static/posters/Breaking Bad.webp differ diff --git a/static/posters/Chernobyl.webp b/static/posters/Chernobyl.webp new file mode 100644 index 0000000..7a39b96 Binary files /dev/null and b/static/posters/Chernobyl.webp differ diff --git a/static/posters/Dracula.webp b/static/posters/Dracula.webp new file mode 100644 index 0000000..b123e2d Binary files /dev/null and b/static/posters/Dracula.webp differ diff --git a/static/posters/Fightclub.jpg b/static/posters/Fightclub.jpg new file mode 100644 index 0000000..7662808 Binary files /dev/null and b/static/posters/Fightclub.jpg differ diff --git a/static/posters/Succession.webp b/static/posters/Succession.webp new file mode 100644 index 0000000..92e72be Binary files /dev/null and b/static/posters/Succession.webp differ diff --git a/static/posters/TheGirlwiththeDragonTattoo.webp b/static/posters/TheGirlwiththeDragonTattoo.webp new file mode 100644 index 0000000..377fa67 Binary files /dev/null and b/static/posters/TheGirlwiththeDragonTattoo.webp differ diff --git a/static/posters/bladerunner2049.jpg b/static/posters/bladerunner2049.jpg new file mode 100644 index 0000000..28879f9 Binary files /dev/null and b/static/posters/bladerunner2049.jpg differ diff --git a/static/styles.css b/static/styles.css index 43c0542..900f30f 100644 --- a/static/styles.css +++ b/static/styles.css @@ -1151,487 +1151,19 @@ nav .section-label { grid-template-columns: 1fr; } } -/* ─── Portfolio page ─── */ -/* Health / API status badge */ -.health-badge { - display: inline-flex; - align-items: center; - gap: 0.45rem; - font-family: var(--ff-mono); - font-size: 0.68rem; - color: var(--muted); - letter-spacing: 0.05em; - margin-top: 0.8rem; - cursor: default; -} -.health-dot { - width: 7px; - height: 7px; - border-radius: 50%; - background: var(--dim); - flex-shrink: 0; - transition: background 0.3s; -} -.health-dot.ok { - background: var(--green); - box-shadow: 0 0 6px rgba(10, 124, 82, 0.5); -} -.health-dot.error { - background: var(--red); -} -.health-dot.loading { - background: var(--yellow); - animation: pulse 1s ease-in-out infinite; -} - -/* Section header row (above table) */ -.section-header-row { - display: flex; - align-items: center; - gap: 0.75rem; - margin-bottom: 0.6rem; - flex-wrap: wrap; -} - -/* Live price status indicator */ -.price-cell { - position: relative; -} -.price-val { - transition: color 0.4s; -} -.price-val.loading { - color: var(--dim); -} -.price-val.flash-up { - color: var(--green); -} -.price-val.flash-down { - color: var(--red); -} -.price-status { - display: inline-flex; - align-items: center; - gap: 0.4rem; - font-family: var(--ff-mono); - font-size: 0.68rem; - color: var(--muted); - margin-left: auto; - vertical-align: middle; -} -.price-dot { - width: 6px; - height: 6px; - border-radius: 50%; - background: var(--dim); + .edu-tag { display: inline-block; - flex-shrink: 0; -} -.price-dot.live { - background: var(--green); - box-shadow: 0 0 4px rgba(10, 124, 82, 0.6); -} -.price-dot.error { - background: var(--red); -} -.price-dot.loading { - background: var(--yellow); - animation: pulse 1s ease-in-out infinite; -} -.refresh-btn { - background: none; - border: 1px solid var(--border); - border-radius: 4px; - color: var(--muted); - font-family: var(--ff-mono); - font-size: 0.68rem; - padding: 2px 8px; - cursor: pointer; - letter-spacing: 0.05em; - transition: border-color 0.15s, color 0.15s; -} -.refresh-btn:hover { - border-color: var(--accent2); - color: var(--accent); -} - -/* Trades accordion */ -.trades-section { - margin-top: 2.5rem; - border: 1px solid var(--border); - border-radius: 6px; - overflow: hidden; -} -.trades-toggle { - display: flex; - align-items: center; - justify-content: space-between; - cursor: pointer; - background: var(--surface2); - border: none; - border-bottom: 1px solid var(--border); - width: 100%; - padding: 0.85rem 1rem; - color: inherit; - font-family: var(--ff-mono); - font-size: 0.75rem; - letter-spacing: 0.07em; - text-align: left; - user-select: none; - transition: background 0.15s; -} -.trades-toggle:hover { - background: var(--surface); -} -.trades-toggle:hover .toggle-label { - color: var(--accent); -} -.toggle-label { - color: var(--muted); - transition: color 0.15s; -} -.toggle-label span { - color: var(--accent); -} -.toggle-icon { - color: var(--dim); - font-size: 1rem; - transition: transform 0.25s ease; - line-height: 1; -} -.trades-toggle[aria-expanded="true"] .toggle-icon { - transform: rotate(180deg); -} -.trades-body { - display: grid; - grid-template-rows: 0fr; - transition: grid-template-rows 0.3s ease; -} -.trades-body.open { - grid-template-rows: 1fr; -} -.trades-inner { - overflow: hidden; -} - -/* Trades header row (filters + add button) */ -.trades-header-row { - display: flex; - align-items: center; - gap: 0.75rem; - padding: 0.9rem 1rem 0.6rem; - border-bottom: 1px solid var(--border); - flex-wrap: wrap; -} -.trades-filter { - display: flex; - gap: 0.5rem; - flex-wrap: wrap; -} -.filter-btn { - background: none; - border: 1px solid var(--border); - border-radius: 4px; - color: var(--muted); - font-family: var(--ff-mono); - font-size: 0.68rem; - letter-spacing: 0.06em; - padding: 3px 10px; - cursor: pointer; - transition: border-color 0.15s, color 0.15s, background 0.15s; -} -.filter-btn:hover, -.filter-btn.active { - border-color: var(--accent2); - color: var(--accent); - background: rgba(26, 86, 219, 0.05); -} -.add-trade-btn { - background: none; - border: 1px solid var(--border); - border-radius: 4px; - color: var(--muted); - font-family: var(--ff-mono); - font-size: 0.68rem; - letter-spacing: 0.05em; - padding: 0.3rem 0.8rem; - cursor: pointer; - transition: border-color 0.15s, color 0.15s; - margin-left: auto; -} -.add-trade-btn:hover { - border-color: var(--accent2); - color: var(--accent); -} - -/* Trades table */ -.trades-count { - font-family: var(--ff-mono); - color: var(--muted); - font-size: 0.68rem; - padding: 0.5rem 1rem 0.3rem; - letter-spacing: 0.04em; -} -.trades-table-wrap { - overflow-x: auto; - padding-bottom: 1.5rem; -} -.trades-table { - width: 100%; - border-collapse: collapse; - font-size: 0.78rem; - font-family: var(--ff-mono); -} -.trades-table thead tr { - border-bottom: 1px solid var(--border); - background: var(--surface2); -} -.trades-table th { - color: var(--dim); - font-weight: 400; - letter-spacing: 0.07em; - font-size: 0.62rem; + margin-top: 8px; + font-family: 'DM Mono', monospace; + font-size: 10px; + letter-spacing: 0.1em; text-transform: uppercase; - padding: 0.5rem 0.75rem; - text-align: left; - white-space: nowrap; -} -.trades-table td { - padding: 0.65rem 0.75rem; - border-bottom: 1px solid var(--border); - white-space: nowrap; - color: var(--text); -} -.trades-table tbody tr { - background: var(--surface); - transition: background 0.15s; -} -.trades-table tbody tr:last-child td { - border-bottom: none; -} -.trades-table tbody tr:hover { - background: var(--surface2); -} -.trades-table tr.hidden-row { - display: none; -} -.trades-empty { - font-family: var(--ff-mono); - font-size: 0.75rem; - color: var(--dim); - padding: 1.4rem 0; - text-align: center; -} - -/* Trade cell types */ -.dir-buy { color: var(--green); } -.dir-sell { color: var(--red); } -.pnl-pos { color: var(--green); } -.pnl-neg { color: var(--red); } -.pnl-zero { color: var(--muted); } -.trade-ticker { - font-weight: 500; - color: var(--text); -} -.trade-code { - display: inline-block; - padding: 1px 6px; + padding: 3px 8px; border-radius: 3px; - font-size: 0.65rem; - border: 1px solid var(--border); - color: var(--muted); - letter-spacing: 0.05em; -} - -/* Add Trade modal */ -.modal-overlay { - display: none; - position: fixed; - inset: 0; - background: rgba(0, 0, 0, 0.45); - backdrop-filter: blur(3px); - z-index: 100; - align-items: center; - justify-content: center; -} -.modal-overlay.open { - display: flex; -} -.modal { - background: var(--surface); - border: 1px solid var(--border); - border-radius: 8px; - width: min(520px, 94vw); - padding: 2rem; - position: relative; - animation: modalIn 0.2s ease; - box-shadow: 0 8px 40px rgba(0, 0, 0, 0.12); -} -@keyframes modalIn { - from { opacity: 0; transform: translateY(12px); } - to { opacity: 1; transform: translateY(0); } -} -.modal-title { - font-family: var(--ff-mono); - font-size: 0.72rem; - color: var(--muted); - letter-spacing: 0.08em; - margin-bottom: 1.4rem; -} -.modal-title span { - color: var(--text); -} -.modal-close { - position: absolute; - top: 1rem; - right: 1rem; - background: none; - border: none; - color: var(--dim); - font-size: 1.1rem; - cursor: pointer; - padding: 0.2rem 0.4rem; - transition: color 0.15s; - line-height: 1; -} -.modal-close:hover { - color: var(--text); -} -.form-grid { - display: grid; - grid-template-columns: 1fr 1fr; - gap: 0.8rem 1.2rem; -} -.form-grid .full { - grid-column: 1 / -1; -} -.form-field label { - display: block; - font-family: var(--ff-mono); - font-size: 0.62rem; - letter-spacing: 0.14em; - text-transform: uppercase; - color: var(--muted); - margin-bottom: 0.3rem; -} -.form-field input, -.form-field select { - width: 100%; - background: var(--bg); - border: 1px solid var(--border); - color: var(--text); - font-family: var(--ff-mono); - font-size: 0.82rem; - padding: 0.5rem 0.7rem; - outline: none; - border-radius: 4px; - transition: border-color 0.15s, box-shadow 0.15s; - -webkit-appearance: none; - appearance: none; -} -.form-field input:focus, -.form-field select:focus { - border-color: var(--accent2); - box-shadow: 0 0 0 3px rgba(26, 71, 184, 0.08); -} -.form-field select option { - background: var(--surface); -} -.form-actions { - display: flex; - justify-content: flex-end; - gap: 0.7rem; - margin-top: 1.4rem; -} -.btn-cancel { - background: none; - border: 1px solid var(--border); - color: var(--muted); - font-family: var(--ff-mono); - font-size: 0.78rem; - padding: 0.5rem 1.1rem; - border-radius: 4px; - cursor: pointer; - transition: border-color 0.15s, color 0.15s; -} -.btn-cancel:hover { - border-color: var(--border-focus); - color: var(--text); -} -.btn-submit { - background: var(--accent2); - border: none; - color: #ffffff; - font-family: var(--ff-mono); - font-size: 0.78rem; - font-weight: 500; - letter-spacing: 0.06em; - padding: 0.5rem 1.3rem; - border-radius: 4px; - cursor: pointer; - transition: background 0.15s, opacity 0.15s; -} -.btn-submit:hover { - background: var(--accent); -} -.btn-submit:disabled { - opacity: 0.4; - cursor: not-allowed; -} -.form-error { - font-family: var(--ff-mono); - font-size: 0.72rem; - color: var(--red); - margin-top: 0.9rem; - min-height: 1rem; -} - -/* Toast notification */ -.toast { - position: fixed; - bottom: 1.8rem; - right: 1.8rem; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 5px; - color: var(--text); - font-family: var(--ff-mono); - font-size: 0.78rem; - padding: 0.7rem 1.1rem; - z-index: 200; - opacity: 0; - transform: translateY(8px); - transition: opacity 0.2s, transform 0.2s; - pointer-events: none; - box-shadow: 0 4px 16px rgba(0, 0, 0, 0.08); -} -.toast.show { - opacity: 1; - transform: translateY(0); -} -.toast.success { - border-color: rgba(10, 124, 82, 0.4); - color: var(--green); -} -.toast.error { - border-color: rgba(185, 28, 28, 0.4); - color: var(--red); -} - -/* Loading skeleton rows */ -.skeleton-row td { - padding: 0.75rem 1rem; -} -.skeleton-cell { - height: 0.65rem; - background: linear-gradient(90deg, var(--surface2) 25%, var(--surface) 50%, var(--surface2) 75%); - background-size: 200% 100%; - animation: shimmer 1.4s infinite; - border-radius: 2px; - width: 70%; -} -@keyframes shimmer { - 0% { background-position: 200% 0; } - 100% { background-position: -200% 0; } -} \ No newline at end of file + } + + .tag-dropped { + background: #F0EBE4; + color: #8A5C2E; + } diff --git a/static/styles2.css b/static/styles2.css index e082bca..3fba17d 100644 --- a/static/styles2.css +++ b/static/styles2.css @@ -229,3 +229,69 @@ footer{ aside{display:none;} .edu-card{grid-template-columns:1fr;gap:0.3rem;} } + + .edu-tag { + display: inline-block; + margin-top: 8px; + font-family: 'DM Mono', monospace; + font-size: 10px; + letter-spacing: 0.1em; + text-transform: uppercase; + padding: 3px 8px; + border-radius: 3px; + } + + .tag-dropped { + background: #F0EBE4; + color: #8A5C2E; + } + + + .toplist-group{ + display:grid;grid-template-columns:80px 1fr;gap:1.2rem; + background:var(--surface);border:1px solid var(--border); + border-radius:6px;padding:1.2rem 1.4rem; + transition:border-color 0.2s,box-shadow 0.2s; +} + +.toplist-body { display: none; } +.collapsed .toplist-body { display: block; } +.collapsed .toplist-toggle-icon { transform: rotate(-90deg); } +.toplist-toggle-icon { display: inline-block; transition: transform 0.2s; } + +.toplist-ranked { + list-style: none; + padding: 0; + margin: 0; + display: flex; + flex-direction: column; + gap: 12px; +} + +.toplist-ranked li { + display: flex; + align-items: center; + gap: 14px; + counter-increment: rank; +} + +.toplist-ranked { + counter-reset: rank; +} + +.toplist-ranked li::before { + content: counter(rank); + font-family: 'DM Mono', monospace; + font-size: 11px; + color: var(--muted); + min-width: 16px; + text-align: right; +} + +.toplist-ranked li img { + width: 42px; + height: 62px; + object-fit: cover; + border-radius: 4px; + flex-shrink: 0; +} \ No newline at end of file