2026-10-24 SAT UTC 7:56 PM TPE 3:56 AM Auto-updates hourly 中文 EN
LIVE WIRE
7:07 PM Emirates cancels three nonstop A380 routes this winter.↗▪7:07 PM European countries consider broader counter-drone powers for infrastructure operators↗▪7:07 PM Saudia and Riyadh Air route Riyadh passengers via Al Qassim↗▪6:54 PM Taiwan CAA says domestic flights will be canceled tomorrow; international schedules may change.↗▪6:54 PM Chery unveils two Lingxiao eVTOL concepts.↗▪6:54 PM TRV-150 intercepts multiple attack drones in Florida trial↗▪6:54 PM Singapore Airlines announces KrisWorld IFE upgrades↗▪6:54 PM Armenia’s first L-39 Skyfox appears in Air Force markings↗▪6:54 PM IATA and OneVasco plan to integrate visa services with Timatic.↗▪1:39 AM Airbus Helicopters completes H140 US hot-and-high tests↗ 7:07 PM Emirates cancels three nonstop A380 routes this winter.↗▪7:07 PM European countries consider broader counter-drone powers for infrastructure operators↗▪7:07 PM Saudia and Riyadh Air route Riyadh passengers via Al Qassim↗▪6:54 PM Taiwan CAA says domestic flights will be canceled tomorrow; international schedules may change.↗▪6:54 PM Chery unveils two Lingxiao eVTOL concepts.↗▪6:54 PM TRV-150 intercepts multiple attack drones in Florida trial↗▪6:54 PM Singapore Airlines announces KrisWorld IFE upgrades↗▪6:54 PM Armenia’s first L-39 Skyfox appears in Air Force markings↗▪6:54 PM IATA and OneVasco plan to integrate visa services with Timatic.↗▪1:39 AM Airbus Helicopters completes H140 US hot-and-high tests↗
← Back to the site changelog Site Changelog

Original commit record

在搜尋欄右側新增 SKYTICAL 官方 FB 與 IG (#375)

SHA
5a583102f2088b4a54058c87a97d7aeea4b9a410
Commit date
Author
CHI HSUN YANG · 125815713+nnneeeooo-nnneeeooo@users.noreply.github.com
Committer
GitHub · noreply@github.com

Changed files (3)

  • static/site.css modified · +24 / −2
  • templates/base.html modified · +18 / −0
  • tests/test_search.py modified · +16 / −1

Full diff

@@ -78,11 +78,13 @@ a.ticker-item:hover .ticker-time { color: var(--color-accent); }\n }\n /* — Google-style search, deliberately the first row of every page — */\n .header-search-row {\n+  display: flex; align-items: center; justify-content: center; gap: 16px;\n   padding: 11px 20px; border-bottom: 1px solid var(--color-divider);\n   background: var(--color-bg);\n }\n .header-search-form {\n-  width: min(720px, 100%); min-height: 48px; margin: 0 auto;\n+  width: min(720px, 100%); max-width: 720px; min-width: 0;\n+  flex: 1; min-height: 48px; margin: 0;\n   display: grid; grid-template-columns: 22px minmax(0, 1fr) auto 40px;\n   align-items: center; gap: 9px; padding: 3px 5px 3px 16px;\n   border: 1px solid color-mix(in srgb, var(--color-text) 24%, transparent);\n@@ -123,6 +125,16 @@ a.ticker-item:hover .ticker-time { color: var(--color-accent); }\n .header-search-clear:focus-visible, .header-search-submit:focus-visible {\n   outline: 2px solid var(--color-accent); outline-offset: 2px;\n }\n+.header-social-links { display: flex; flex: 0 0 auto; align-items: center; gap: 8px; }\n+.header-social-links a {\n+  display: inline-flex; align-items: center; justify-content: center;\n+  width: 44px; height: 44px; border-radius: 50%;\n+  border: 1px solid color-mix(in srgb, var(--color-text) 24%, transparent);\n+  color: var(--color-text); text-decoration: none; touch-action: manipulation;\n+}\n+.header-social-links svg { display: block; width: 22px; height: 22px; }\n+.header-social-links a:hover { color: var(--color-accent); border-color: currentColor; }\n+.header-social-links a:focus-visible { outline: 2px solid var(--color-accent); outline-offset: 3px; }\n \n .utility-bar { border-bottom: 1px solid var(--color-divider); }\n .utility-row {\n@@ -883,8 +895,18 @@ html[lang="en"] .search-help-term:not(:last-child) { margin-right: .3em; }\n   .marquee-track .ticker-pass:nth-child(2) { display: none; }\n }\n \n+@media (max-width: 400px) {\n+  .header-search-row .header-search-form {\n+    grid-template-columns: minmax(0, 1fr) auto 36px;\n+    gap: 5px;\n+  }\n+  .header-search-form > .header-search-icon { display: none; }\n+  .header-search-form .header-search-clear { width: 24px; }\n+}\n+\n @media (max-width: 640px) {\n-  .header-search-row { padding: 9px 12px; }\n+  .header-search-row { padding: 9px 12px; gap: 8px; }\n+  .header-social-links { gap: 4px; }\n   .header-search-form {\n     min-height: 44px; grid-template-columns: 20px minmax(0, 1fr) auto 36px;\n     gap: 7px; padding-left: 13px;\n@@ -87,6 +87,24 @@\n         </svg>\n       </button>\n     </form>\n+    <nav class="header-social-links" aria-label="{% if lang == 'zh' %}SKYTICAL官方社群{% else %}SKYTICAL social media{% endif %}">\n+      <a href="https://www.facebook.com/profile.php?id=61595860824748"\n+         target="_blank" rel="noopener noreferrer" title="SKYTICAL Facebook"\n+         aria-label="SKYTICAL Facebook{% if lang == 'zh' %}(另開分頁){% else %} (opens in a new tab){% endif %}">\n+        <svg viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">\n+          <path d="M13 22v-8h3l.6-4H13V7.5c0-1.1.5-1.5 1.6-1.5H17V2.3c-.8-.2-2-.3-3.2-.3C10.5 2 8.5 4 8.5 7.5V10H6v4h2.5v8Z"></path>\n+        </svg>\n+      </a>\n+      <a href="https://www.instagram.com/skyticalnews/"\n+         target="_blank" rel="noopener noreferrer" title="SKYTICAL Instagram"\n+         aria-label="SKYTICAL Instagram{% if lang == 'zh' %}(另開分頁){% else %} (opens in a new tab){% endif %}">\n+        <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" aria-hidden="true" focusable="false">\n+          <rect x="3" y="3" width="18" height="18" rx="5"></rect>\n+          <circle cx="12" cy="12" r="4"></circle>\n+          <circle cx="17.5" cy="6.5" r="1" fill="currentColor" stroke="none"></circle>\n+        </svg>\n+      </a>\n+    </nav>\n   </div>\n   <div class="utility-bar">\n     <div class="utility-row">\n@@ -8,6 +8,8 @@\n import unicodedata\n from pathlib import Path\n \n+from bs4 import BeautifulSoup\n+\n ROOT = Path(__file__).resolve().parent.parent\n sys.path.insert(0, str(ROOT / "pipeline"))\n \n@@ -239,6 +241,20 @@ def main() -> None:\n     assert re.search(r'/assets/search\.js\?v=[0-9a-f]{10}', zh)\n     assert home.index('class="header-search-row"') < home.index('id="clock-utc"')\n     assert home.index('class="header-search-row"') < home.index('class="brand-row"')\n+    for page in (home, article, en):\n+        social = BeautifulSoup(page, "html.parser").select_one(\n+            ".header-search-row .header-social-links")\n+        assert social is not None and social.find_parent("form") is None\n+        links = social.select("a")\n+        assert [link["href"] for link in links] == [\n+            "https://www.facebook.com/profile.php?id=61595860824748",\n+            "https://www.instagram.com/skyticalnews/",\n+        ]\n+        for link in links:\n+            assert link["target"] == "_blank"\n+            assert {"noopener", "noreferrer"} <= set(link["rel"])\n+            assert "SKYTICAL" in link["aria-label"]\n+            assert link.select_one('svg[aria-hidden="true"]') is not None\n     main_markup = re.search(r'<main class="search-page">(.*?)</main>', zh,\n                             re.DOTALL).group(1)\n     assert "<form" not in main_markup\n@@ -251,7 +267,6 @@ def main() -> None:\n     assert ".header-search-submit" in css\n     assert "航空公司 IATA/ICAO 代碼" in zh\n     assert "airline IATA/ICAO codes" in en\n-    from bs4 import BeautifulSoup\n     for markup, language in ((zh, "zh"), (en, "en")):\n         header = BeautifulSoup(markup, "html.parser").select_one(".search-header")\n         groups = header.select(".search-help-group")

You found a secret theme!

8-bit mode is unlocked. Refresh to apply it now. You can switch themes anytime using the theme selector.