From c1ea59d23c0bf8ab89c9d861b2f0c7dc6700640b Mon Sep 17 00:00:00 2001 From: Junwei Zhao Date: Sun, 19 Jul 2026 22:03:29 +1000 Subject: [PATCH] Update UI --- core/settings.py | 2 +- links/templates/links/link_list.html | 93 +++++++++++++++++++++--- locale/zh_Hans/LC_MESSAGES/django.mo | Bin 4993 -> 4931 bytes locale/zh_Hans/LC_MESSAGES/django.po | 102 ++++++++++++++------------- 4 files changed, 135 insertions(+), 62 deletions(-) diff --git a/core/settings.py b/core/settings.py index ac7d1e4..0d70e5f 100644 --- a/core/settings.py +++ b/core/settings.py @@ -145,7 +145,7 @@ MUSIC_ROOT = os.path.join(BASE_DIR, 'data', 'music') # File uploads folder — override via FILE_UPLOADS_FOLDER env var. # Defaults to ~/Downloads locally; set to /uploads on k8s. FILE_UPLOADS_FOLDER = os.environ.get('FILE_UPLOADS_FOLDER', os.path.expanduser('~/Downloads')) -IMAGES_FOLDER = os.environ.get('IMAGES_FOLDER', os.path.expanduser('~/Pictures')) +IMAGES_FOLDER = os.environ.get('IMAGES_FOLDER', os.path.expanduser('~/Downloads')) LOGGING = { diff --git a/links/templates/links/link_list.html b/links/templates/links/link_list.html index 2f1dfaa..76dbbc2 100644 --- a/links/templates/links/link_list.html +++ b/links/templates/links/link_list.html @@ -56,7 +56,7 @@ opacity: 1 !important; transform: none !important; } - .app-tile, .post-card, .fan-card, .fan-card img, .fan-card-frame { transition: none !important; animation: none !important; } + .app-tile, .post-card, .fan-card, .fan-card img, .fan-card-frame, .fan-lightbox { transition: none !important; animation: none !important; } } /* ---------- Hero ---------- */ @@ -395,6 +395,35 @@ .fan-actions { gap: 0.8rem; } } + /* ---------- Fan lightbox (full-size preview on card click) ---------- */ + .fan-lightbox { + position: fixed; inset: 0; z-index: 1000; + display: flex; align-items: center; justify-content: center; + padding: 2rem; + background: rgba(0, 0, 0, 0.82); + -webkit-backdrop-filter: blur(6px); backdrop-filter: blur(6px); + animation: fan-lightbox-fade 0.25s ease; + cursor: zoom-out; + } + .fan-lightbox[hidden] { display: none; } + @keyframes fan-lightbox-fade { from { opacity: 0; } to { opacity: 1; } } + .fan-lightbox-img { + max-width: min(92vw, 900px); max-height: 88vh; + display: block; object-fit: contain; cursor: default; + border-radius: 14px; + background: #e8e8ed; + box-shadow: 0 30px 80px rgba(0, 0, 0, 0.45); + } + .fan-lightbox-close { + position: absolute; top: 1.1rem; right: 1.1rem; + width: 2.5rem; height: 2.5rem; border-radius: 50%; border: none; + display: flex; align-items: center; justify-content: center; + background: rgba(255, 255, 255, 0.14); color: #fff; cursor: pointer; + transition: background 0.2s ease; + } + .fan-lightbox-close:hover, .fan-lightbox-close:focus-visible { background: rgba(255, 255, 255, 0.28); } + .fan-lightbox-close svg { width: 1.2rem; height: 1.2rem; } + /* ---------- Accessibility: visible keyboard focus ---------- */ a:focus-visible, button:focus-visible { outline: 2px solid var(--apple-blue); @@ -520,52 +549,52 @@
- - - - -
+ + +
@@ -776,6 +815,38 @@ card.addEventListener('animationend', () => { card.style.animation = 'none'; }, { once: true }); }); + /* ---------- Photo fan: lightbox (click a card to view it full-size) ---------- */ + const fanLightbox = document.getElementById('fan-lightbox'); + const fanLightboxImg = document.getElementById('fan-lightbox-img'); + const fanLightboxClose = document.getElementById('fan-lightbox-close'); + + window.openFanLightbox = function (img) { + if (!img || !fanLightbox || !fanLightboxImg) return; + fanLightboxImg.src = img.currentSrc || img.src; + fanLightboxImg.alt = img.alt; + fanLightbox.hidden = false; + document.body.style.overflow = 'hidden'; + fanLightboxClose.focus(); + }; + + function closeFanLightbox() { + if (!fanLightbox) return; + fanLightbox.hidden = true; + fanLightboxImg.src = ''; + document.body.style.overflow = ''; + } + + if (fanLightbox) { + fanLightboxClose.addEventListener('click', closeFanLightbox); + // Click the dimmed backdrop (not the image itself) to dismiss. + fanLightbox.addEventListener('click', function (event) { + if (event.target === fanLightbox) closeFanLightbox(); + }); + document.addEventListener('keydown', function (event) { + if (event.key === 'Escape' && !fanLightbox.hidden) closeFanLightbox(); + }); + } + /* ---------- Scroll-reveal animations (respects reduced motion) ---------- */ const revealEls = document.querySelectorAll('.reveal'); const reducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches; diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index ccaecd595b29a0a2fb09585f7f13bcde5339fa07..fa547429b1c420279a50022e14434827df686422 100644 GIT binary patch delta 1598 zcmYk+Nk~;u9LMp$_SBqm$|keH9G;e@mZe!~mZgET&`m`_W`ortA}Cz=C@2siNU=pw z5K%!05-%ztBxx0q6jTICG%Q3aY!OB@(D$c*qr>~Z&;6fs?>Xn5d+t4x_c%B7HZ{;= zlzL(z(GqF44|@arQHrC@Vz30GumXcvg#~yR`B^uA@pu`N@ut_`$2sH!7>BRC{vFOT z3)v_KNiYPooApk1U#XqE?^_Q}7z<{4i=o9-;bsj#|<8 z?iUPchCevaj1y?p9i^i>$UqGgL{70nuP;XpSc`?&glq6D=3_sqzmHgfpRqE+ESF9- z;b!hawkFzMtL5N071?;t8-`I6_~4Gazc7RPSVmWS4(bj|Q61KJUhnzN?!m~kkXlYr zqbu6Ir4#3qcX@p;s;7R`tv*5Ru9v9YGmg6cJMO>$Co>sq!Xj+O?RXJ&-Uw>ku_U&b zD!zKdZ#+gG#}k>H7*b{Jo?r012lZ@j;5>YQ>G%TG-ze(3Z=MHu^6VE&LDgsA9$cQn z7SjbCRLD!Hfv>x_z5WjB!U4~RJRe3)+ zLVk9Lzh&5lYw;>-6TC(Z@Dn#+RGJx^$5s)`3GFC7qW=r0{wumhMXRRW94c2v2@*}TO9;I;^@LVL8%!&bOR(>322n!jYqFS7Sx3|m)kF@ll2G9( zO}?8`w?Lv#&uk)#s3hu$JffK3{j^O)fT$u=^bDs9d(2|P4bjg6;b445Ot>+%DB>@T Cqj+@y delta 1674 zcmYk+Nk~;u9LMpandUs?kd|haLk?*+IAvB^sfz}zNFp*qEzk%oS_Hk4$V>_eA}Npv z3?dhii!5xys8vW96d_jNuqdKU6cH|qXzu%}G_2VGJ zIe64zA{EUv6E*Wv)XFMR9o3))Jb?7!4q1B>YT!1^!*<+=k8m|kqxy@clM+nAGC$|` zp(frP&i<=%i&<>PUR;F}sPWHTF=(q3eF9crZwsQ;a^{H*02mS4BL*X)a6 z|206rH9W;c@>i(#FQ|^EQ7iw8dg%OV)I*hwx-K1eV<9qk*N$tj8*A|;>bel_gC>}O z%2Pa6$-x#HitU0v?T71iNS%V#YQW)_-AA_onWiyEi|b$z9^*P;4tFq`fCN#A*oJMXKw zF0%*uxjqgnaS)4e4E1cpF1CTNoV*fwrrb82BUJP(sgx4hCEYT;dMYUdYjEp`488v< z3w(I*ovOLS4niwY$@Aeo7IVxbHd&kQugVr8ozR=2ozT~GGod$NIiX$B+o8p*C$zXw zjlYx7!^J|ppH!_ri_o^sFBK%Z*K?(Cu7dgV>ZzV(`M`(A~*9FQz*?24Z9K{r&^FxP<%w diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index a895218..722218e 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-07-19 21:30+1000\n" +"POT-Creation-Date: 2026-07-19 22:00+1000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -481,6 +481,11 @@ msgid "Slideshow" msgstr "" #: links/templates/links/collection_detail.html:254 +#: links/templates/links/link_list.html:552 +#: links/templates/links/link_list.html:562 +#: links/templates/links/link_list.html:572 +#: links/templates/links/link_list.html:582 +#: links/templates/links/link_list.html:592 msgid "View Full Size" msgstr "" @@ -659,7 +664,7 @@ msgid "All Files" msgstr "" #: links/templates/links/files/list.html:109 -#: links/templates/links/link_list.html:623 +#: links/templates/links/link_list.html:662 msgid "Type" msgstr "链接类型" @@ -731,7 +736,7 @@ msgstr "导出数据库" #: links/templates/links/files/list.html:233 #: links/templates/links/files/list.html:343 -#: links/templates/links/jobs.html:507 +#: links/templates/links/jobs.html:507 links/templates/links/link_list.html:607 msgid "Close" msgstr "" @@ -868,7 +873,7 @@ msgid "" msgstr "" #: links/templates/links/jobs.html:152 -#: links/templates/links/link_list.html:1007 +#: links/templates/links/link_list.html:1078 msgid "selected" msgstr "已选择" @@ -1025,13 +1030,13 @@ msgstr "链接详情" #: links/templates/links/link_confirm_delete.html:17 #: links/templates/links/link_detail.html:43 -#: links/templates/links/link_list.html:613 +#: links/templates/links/link_list.html:652 msgid "Alias" msgstr "别名" #: links/templates/links/link_confirm_delete.html:18 #: links/templates/links/link_detail.html:60 -#: links/templates/links/link_list.html:633 +#: links/templates/links/link_list.html:672 msgid "Original URL" msgstr "原始URL" @@ -1097,7 +1102,7 @@ msgid "No changes recorded." msgstr "" #: links/templates/links/link_detail.html:256 -#: links/templates/links/link_list.html:643 +#: links/templates/links/link_list.html:682 msgid "Clicks" msgstr "点击次数" @@ -1106,7 +1111,7 @@ msgid "Edit Link" msgstr "编辑链接" #: links/templates/links/link_form.html:33 -#: links/templates/links/link_list.html:597 +#: links/templates/links/link_list.html:636 msgid "New Link" msgstr "创建新链接" @@ -1139,136 +1144,130 @@ msgstr "" msgid "Alias cannot be changed after creation." msgstr "链接别名中不能带有 - 或者 _ 以及其他任意特殊字符" -#: links/templates/links/link_list.html:469 +#: links/templates/links/link_list.html:498 #: links/templates/links/mini_apps/image_gallery.html:4 templates/base.html:8 #: templates/base.html:61 msgid "GoLinks" msgstr "GoLinks" -#: links/templates/links/link_list.html:475 +#: links/templates/links/link_list.html:504 msgid "Search aliases" msgstr "搜索别名" -#: links/templates/links/link_list.html:479 +#: links/templates/links/link_list.html:508 msgid "Search aliases..." msgstr "搜索别名..." -#: links/templates/links/link_list.html:487 +#: links/templates/links/link_list.html:516 msgid "Matching aliases" msgstr "匹配的别名" -#: links/templates/links/link_list.html:493 +#: links/templates/links/link_list.html:522 #: links/templates/links/tag_detail.html:34 msgid "Links" msgstr "链接" -#: links/templates/links/link_list.html:498 +#: links/templates/links/link_list.html:527 msgid "Total Clicks" msgstr "总点击次数" -#: links/templates/links/link_list.html:506 +#: links/templates/links/link_list.html:535 msgid "Random Images" msgstr "随机图片" -#: links/templates/links/link_list.html:512 +#: links/templates/links/link_list.html:541 msgid "Shuffle all" msgstr "换一批" -#: links/templates/links/link_list.html:515 +#: links/templates/links/link_list.html:544 msgid "Open gallery" msgstr "打开画廊" -#: links/templates/links/link_list.html:523 -#: links/templates/links/link_list.html:533 -#: links/templates/links/link_list.html:543 -#: links/templates/links/link_list.html:553 -#: links/templates/links/link_list.html:563 -msgid "Shuffle image" -msgstr "换一张图片" - -#: links/templates/links/link_list.html:525 -#: links/templates/links/link_list.html:535 -#: links/templates/links/link_list.html:545 -#: links/templates/links/link_list.html:555 -#: links/templates/links/link_list.html:565 +#: links/templates/links/link_list.html:554 +#: links/templates/links/link_list.html:564 +#: links/templates/links/link_list.html:574 +#: links/templates/links/link_list.html:584 +#: links/templates/links/link_list.html:594 +#: links/templates/links/link_list.html:606 +#: links/templates/links/link_list.html:612 msgid "Random Image" msgstr "随机图片" -#: links/templates/links/link_list.html:580 +#: links/templates/links/link_list.html:619 msgid "Link List" msgstr "链接列表" -#: links/templates/links/link_list.html:582 +#: links/templates/links/link_list.html:621 #, python-format msgid "%(counter)s link" msgid_plural "%(counter)s links" msgstr[0] "" -#: links/templates/links/link_list.html:590 +#: links/templates/links/link_list.html:629 msgid "Search links" msgstr "搜索链接" -#: links/templates/links/link_list.html:591 +#: links/templates/links/link_list.html:630 msgid "Search links..." msgstr "搜索链接..." -#: links/templates/links/link_list.html:609 +#: links/templates/links/link_list.html:648 msgid "Select all links" msgstr "全选所有链接" -#: links/templates/links/link_list.html:651 +#: links/templates/links/link_list.html:690 #: links/templates/links/mini_apps/image_gallery.html:432 #: templates/pricemon/dashboard.html:187 msgid "Actions" msgstr "操作" -#: links/templates/links/link_list.html:659 +#: links/templates/links/link_list.html:698 msgid "No links available" msgstr "暂无可用链接" -#: links/templates/links/link_list.html:675 -#: links/templates/links/link_list.html:987 -#: links/templates/links/link_list.html:995 +#: links/templates/links/link_list.html:714 +#: links/templates/links/link_list.html:1058 +#: links/templates/links/link_list.html:1066 msgid "Load more" msgstr "" -#: links/templates/links/link_list.html:681 +#: links/templates/links/link_list.html:720 msgid "Delete Selected" msgstr "删除选中项" -#: links/templates/links/link_list.html:689 +#: links/templates/links/link_list.html:728 msgid "Latest Posts" msgstr "最新文章" -#: links/templates/links/link_list.html:691 +#: links/templates/links/link_list.html:730 msgid "View all posts" msgstr "查看全部文章" -#: links/templates/links/link_list.html:720 +#: links/templates/links/link_list.html:759 msgid "No posts available yet" msgstr "暂无文章" -#: links/templates/links/link_list.html:721 +#: links/templates/links/link_list.html:760 msgid "Create your first post" msgstr "创建你的第一篇文章" -#: links/templates/links/link_list.html:729 +#: links/templates/links/link_list.html:768 msgid "Pinned Mini Apps" msgstr "置顶小应用" -#: links/templates/links/link_list.html:750 +#: links/templates/links/link_list.html:789 msgid "No mini apps available" msgstr "暂无可用小应用" -#: links/templates/links/link_list.html:881 +#: links/templates/links/link_list.html:952 msgid "No results found" msgstr "未找到结果" -#: links/templates/links/link_list.html:959 +#: links/templates/links/link_list.html:1030 msgid "No matching links found" msgstr "未找到匹配的链接" -#: links/templates/links/link_list.html:977 +#: links/templates/links/link_list.html:1048 #: links/templates/links/settings.html:199 msgid "Loading…" msgstr "" @@ -2288,3 +2287,6 @@ msgstr "" #: templates/pricemon/watcher_form.html:145 msgid "Testing…" msgstr "" + +#~ msgid "Shuffle image" +#~ msgstr "换一张图片"