Compare commits

..

8 Commits

Author SHA1 Message Date
346dc71d2e gay
Some checks failed
Deploy / build-and-deploy (push) Has been cancelled
2025-09-05 12:06:51 +08:00
d9414a9781 update 2025-09-04 19:00:16 +08:00
5b03465fc7 AIgen 2025-09-01 20:05:04 +08:00
7fd89bfaf2 update 2025-09-01 09:46:08 +08:00
8dbedff306 fix 2025-09-01 09:35:58 +08:00
77085efaca update 2025-08-31 19:36:59 +08:00
0f453cba75 update 2025-08-30 23:45:15 +08:00
37253011b4 update 2025-08-29 10:23:21 +08:00
20 changed files with 615 additions and 2574 deletions

View File

@@ -1,8 +1,8 @@
VITE_OJ=https://oj.xuyue.cc
VITE_CODE=https://code.xuyue.cc
VITE_WEB=https://web.xuyue.cc
VITE_PLAY=https://play.xuyue.cc
VITE_BOOK=https://book.xuyue.cc
VITE_HUABU=https://huabu.xuyue.cc
VITE_PPT=https://ppt.xuyue.cc/py
VITE_PY=https://python.xuyue.cc
VITE_BLOCKLY=https://lego.xuyue.cc

View File

@@ -1,7 +1,7 @@
VITE_OJ=http://10.13.114.114:81
VITE_CODE=http://10.13.114.114:82
VITE_WEB=http://10.13.114.114:91
# VITE_PLAY=http://10.13.114.114:83
VITE_BOOK=http://10.13.114.114:84
VITE_HUABU=http://10.13.114.114:85
VITE_SHUATI=http://10.13.114.114:86
VITE_BLOCKLY=http://10.13.114.114:98

View File

@@ -5,38 +5,23 @@ on:
branches:
- main
permissions:
contents: read
jobs:
deploy:
build-and-deploy:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- name: debian
build_command: build
remote_port: 22
- name: school
build_command: build:staging
remote_port: 8822
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v4
with:
node-version: 24
cache: npm
- run: npm ci
- run: npm run ${{ matrix.build_command }}
env:
CI: false
cache: 'npm'
- run: npm install
- run: CI=false npm run build
- uses: easingthemes/ssh-deploy@main
env:
SSH_PRIVATE_KEY: ${{ secrets.KEY }}
REMOTE_HOST: ${{ secrets.HOST }}
REMOTE_PORT: ${{ matrix.remote_port }}
ARGS: "-avzr --delete"
SOURCE: dist/
REMOTE_USER: root

367
app.js
View File

@@ -1,367 +0,0 @@
import { pins, sites } from "./data.js"
import {
getDesignThemeLabel,
getInitialLanguage,
LANGUAGE_KEY,
LANGUAGE_NAMES,
SUPPORTED_LANGUAGES,
t,
} from "./i18n.js"
import { renderSites } from "./render.js"
import {
getCurrentDesignTheme,
getInitialDesignTheme,
getInitialTheme,
setDesignTheme,
setDesignThemeMenuOpen,
setSelectedDesignThemeUI,
setTheme,
toggleTheme,
updateDesignThemeOptions,
} from "./theme.js"
export function initApp() {
const CAT_ICON = "/icons/noto--cat-face.svg"
const themeToggle = document.getElementById("themeToggle")
const designThemeButton = document.getElementById("designThemeButton")
const designThemeList = document.getElementById("designThemeList")
const languageButton = document.getElementById("languageButton")
const languageList = document.getElementById("languageList")
const titleEl = document.querySelector(".title")
const subtitleEl = document.querySelector(".subtitle")
const designThemeLabelEl = document.querySelector(
'[data-i18n="designThemeLabel"]',
)
const languageLabelEl = document.querySelector('[data-i18n="languageLabel"]')
const moonIcon = document.querySelector(".theme-icon-moon")
const sunIcon = document.querySelector(".theme-icon-sun")
const sitesContainer = document.querySelector("#sites")
const faviconEl = document.querySelector('link[rel~="icon"]')
const beianIcpEl = document.querySelector('[data-i18n="beianIcp"]')
const beianMpsEl = document.querySelector('[data-i18n="beianMps"]')
let currentLanguage = getInitialLanguage()
const getThemeLabel = (designTheme, language = currentLanguage) =>
getDesignThemeLabel(designTheme, language)
function setSelectedLanguageUI(language) {
if (!languageList) return
const options = [...languageList.querySelectorAll('[role="option"]')]
options.forEach((el) => {
const value = el.getAttribute("data-value")
const label = LANGUAGE_NAMES[value] || value || ""
el.setAttribute("aria-selected", value === language ? "true" : "false")
el.textContent = label
})
if (languageButton) {
languageButton.textContent = LANGUAGE_NAMES[language] || language
}
}
function setLanguageMenuOpen(open) {
if (!languageButton || !languageList) return
languageButton.setAttribute("aria-expanded", open ? "true" : "false")
languageList.hidden = !open
if (open) {
languageList.focus()
}
}
function updateSubtitle(language = currentLanguage) {
if (!subtitleEl) return
if (pins.length) {
subtitleEl.textContent = t("pinnedSubtitle", language)
} else {
subtitleEl.textContent = subtitleEl.dataset.text || ""
}
}
function getDocumentLang(language) {
if (language === "zh-Hant") return "zh-Hant"
if (language === "zh-Hans") return "zh-Hans"
if (language === "ja") return "ja"
if (language === "ko") return "ko"
return "en"
}
function setSwappableIcon(element, language) {
if (!element) return
if (!element.dataset.defaultSrc) {
element.dataset.defaultSrc = element.getAttribute("src") || ""
}
element.setAttribute(
"src",
language === "meow" ? CAT_ICON : element.dataset.defaultSrc,
)
}
function setFavicon(language) {
if (!faviconEl) return
if (!faviconEl.dataset.defaultHref) {
faviconEl.dataset.defaultHref = faviconEl.getAttribute("href") || ""
}
faviconEl.setAttribute(
"href",
language === "meow" ? CAT_ICON : faviconEl.dataset.defaultHref,
)
}
function applyTranslations() {
const language = currentLanguage
document.documentElement.setAttribute("lang", getDocumentLang(language))
document.title = t("appTitle", language)
if (titleEl) {
const titleText = t("appTitle", language)
titleEl.textContent = titleText
titleEl.dataset.text = titleText
}
if (designThemeLabelEl) {
designThemeLabelEl.textContent = t("designThemeLabel", language)
}
if (languageLabelEl) {
languageLabelEl.textContent = t("languageLabel", language)
}
if (beianIcpEl) {
beianIcpEl.textContent = t("beianIcp", language)
}
if (beianMpsEl) {
beianMpsEl.textContent = t("beianMps", language)
}
if (designThemeButton) {
designThemeButton.setAttribute(
"aria-label",
t("designThemeLabel", language),
)
}
if (languageButton) {
languageButton.setAttribute("aria-label", t("languageLabel", language))
}
if (themeToggle) {
themeToggle.setAttribute("aria-label", t("themeToggleLabel", language))
themeToggle.setAttribute("title", t("themeToggleTitle", language))
}
if (moonIcon) {
moonIcon.setAttribute("alt", t("moonAlt", language))
}
if (sunIcon) {
sunIcon.setAttribute("alt", t("sunAlt", language))
}
setSwappableIcon(moonIcon, language)
setSwappableIcon(sunIcon, language)
setFavicon(language)
updateDesignThemeOptions({
designThemeList,
getLabel: getThemeLabel,
language,
})
setSelectedDesignThemeUI({
designThemeList,
designThemeButton,
designTheme: getCurrentDesignTheme(),
getLabel: getThemeLabel,
})
setSelectedLanguageUI(language)
updateSubtitle(language)
renderSites({ container: sitesContainer, sites, pins, language })
}
function setLanguage(language) {
const safeLanguage = SUPPORTED_LANGUAGES.includes(language)
? language
: "zh-Hans"
currentLanguage = safeLanguage
localStorage.setItem(LANGUAGE_KEY, safeLanguage)
applyTranslations()
}
if (titleEl && !titleEl.dataset.text) {
titleEl.dataset.text = titleEl.textContent?.trim() || ""
}
if (subtitleEl && !subtitleEl.dataset.text) {
subtitleEl.dataset.text = subtitleEl.textContent?.trim() || ""
}
const initialTheme = getInitialTheme()
setTheme(initialTheme)
const initialDesignTheme = getInitialDesignTheme()
setDesignTheme(initialDesignTheme, themeToggle)
setSelectedDesignThemeUI({
designThemeList,
designThemeButton,
designTheme: initialDesignTheme,
getLabel: getThemeLabel,
})
setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open: false,
})
setLanguage(currentLanguage)
if (designThemeButton && designThemeList) {
designThemeButton.addEventListener("click", () => {
const isOpen = designThemeButton.getAttribute("aria-expanded") === "true"
setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open: !isOpen,
})
})
designThemeList.addEventListener("click", (e) => {
const option = e.target.closest?.('[role="option"][data-value]')
if (!option) return
const value = option.getAttribute("data-value")
setDesignTheme(value, themeToggle)
setSelectedDesignThemeUI({
designThemeList,
designThemeButton,
designTheme: value,
getLabel: getThemeLabel,
})
setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open: false,
})
})
document.addEventListener("click", (e) => {
if (!designThemeButton || !designThemeList) return
const clickedInside =
designThemeButton.contains(e.target) ||
designThemeList.contains(e.target)
if (!clickedInside) {
setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open: false,
})
}
})
document.addEventListener("keydown", (e) => {
const isOpen = designThemeButton.getAttribute("aria-expanded") === "true"
if (!isOpen) return
if (e.key === "Escape") {
e.preventDefault()
setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open: false,
})
designThemeButton.focus()
return
}
const options = [...designThemeList.querySelectorAll('[role="option"]')]
if (!options.length) return
const current = getCurrentDesignTheme()
const currentIndex = Math.max(
0,
options.findIndex((el) => el.getAttribute("data-value") === current),
)
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
e.preventDefault()
const delta = e.key === "ArrowDown" ? 1 : -1
const nextIndex =
(currentIndex + delta + options.length) % options.length
const nextValue = options[nextIndex].getAttribute("data-value")
setDesignTheme(nextValue, themeToggle)
setSelectedDesignThemeUI({
designThemeList,
designThemeButton,
designTheme: nextValue,
getLabel: getThemeLabel,
})
return
}
if (e.key === "Enter" || e.key === " ") {
e.preventDefault()
setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open: false,
})
designThemeButton.focus()
}
})
}
if (languageButton && languageList) {
languageButton.addEventListener("click", () => {
const isOpen = languageButton.getAttribute("aria-expanded") === "true"
setLanguageMenuOpen(!isOpen)
})
languageList.addEventListener("click", (e) => {
const option = e.target.closest?.('[role="option"][data-value]')
if (!option) return
const value = option.getAttribute("data-value")
setLanguage(value)
setLanguageMenuOpen(false)
})
document.addEventListener("click", (e) => {
if (!languageButton || !languageList) return
const clickedInside =
languageButton.contains(e.target) || languageList.contains(e.target)
if (!clickedInside) setLanguageMenuOpen(false)
})
document.addEventListener("keydown", (e) => {
const isOpen = languageButton.getAttribute("aria-expanded") === "true"
if (!isOpen) return
if (e.key === "Escape") {
e.preventDefault()
setLanguageMenuOpen(false)
languageButton.focus()
return
}
const options = [...languageList.querySelectorAll('[role="option"]')]
if (!options.length) return
const currentIndex = Math.max(
0,
options.findIndex(
(el) => el.getAttribute("data-value") === currentLanguage,
),
)
if (e.key === "ArrowDown" || e.key === "ArrowUp") {
e.preventDefault()
const delta = e.key === "ArrowDown" ? 1 : -1
const nextIndex =
(currentIndex + delta + options.length) % options.length
const nextValue = options[nextIndex].getAttribute("data-value")
setLanguage(nextValue)
return
}
if (e.key === "Enter" || e.key === " ") {
e.preventDefault()
setLanguageMenuOpen(false)
languageButton.focus()
}
})
}
window
.matchMedia("(prefers-color-scheme: dark)")
.addEventListener("change", (e) => {
if (!localStorage.getItem("theme")) {
setTheme(e.matches ? "dark" : "light")
}
})
if (themeToggle) {
themeToggle.addEventListener("click", toggleTheme)
}
}

189
data.js
View File

@@ -1,189 +0,0 @@
export const pins = [
// {
// url: "https://code.xuyue.cc?query=30",
// description: "示例代码",
// },
]
export const sites = [
{
url: import.meta.env.VITE_OJ,
title: {
"zh-Hans": "判题狗",
"zh-Hant": "判題狗",
en: "Judge Dog",
ja: "判定犬",
ko: "판정개",
meow: "喵喵喵",
},
description: {
"zh-Hans": "在线判题网站",
"zh-Hant": "在線判題網站",
en: "Online judge platform",
ja: "オンライン判定サイト",
ko: "온라인 판정 사이트",
meow: "喵喵喵喵喵喵",
},
icon: "noto--dog-face.svg",
},
{
url: import.meta.env.VITE_CODE,
title: {
"zh-Hans": "自测猫",
"zh-Hant": "自測貓",
en: "Self Test Cat",
ja: "自テスト猫",
ko: "자가테스트猫",
meow: "喵喵喵",
},
description: {
"zh-Hans": "代码运行网站",
"zh-Hant": "代碼運行網站",
en: "Code runner",
ja: "コード実行サイト",
ko: "코드 실행 사이트",
meow: "喵喵喵喵喵喵",
},
icon: "noto--cat-face.svg",
},
{
url: import.meta.env.VITE_WEB,
title: {
"zh-Hans": "哈基米",
"zh-Hant": "哈基米",
en: "Hakimi",
ja: "ハキミ",
ko: "하키미",
meow: "喵喵喵",
},
description: {
"zh-Hans": "Web 前端开发",
"zh-Hant": "Web 前端開發",
en: "Web frontend development",
ja: "Webフロントエンド開発",
ko: "웹 프론트엔드 개발",
meow: "喵喵喵喵喵喵喵喵",
},
icon: "noto--honeybee.svg",
},
{
url: import.meta.env.VITE_SHUATI,
title: {
"zh-Hans": "刷题鸭",
"zh-Hant": "刷題鴨",
en: "Practice Duck",
ja: "演習アヒル",
ko: "문제풀이오리",
meow: "喵喵喵",
},
description: {
"zh-Hans": "梁老师的刷题网站",
"zh-Hant": "梁老師的刷題網站",
en: "Practice problems by Mr. Liang",
ja: "梁先生の演習サイト",
ko: "량 선생님의 문제풀이 사이트",
meow: "喵喵喵喵喵喵喵喵",
},
icon: "noto--paintbrush.svg",
},
{
url: import.meta.env.VITE_BOOK,
title: {
"zh-Hans": "编程书",
"zh-Hant": "編程書",
en: "Coding Books",
ja: "プログラミング書",
ko: "프로그래밍 책",
meow: "喵喵喵",
},
description: {
"zh-Hans": "编程和计算机相关知识汇总",
"zh-Hant": "編程和計算機相關知識匯總",
en: "CS knowledge summary",
ja: "プログラミング/コンピュータ知識まとめ",
ko: "프로그래밍/컴퓨터 지식 모음",
meow: "喵喵喵喵喵喵喵喵喵喵喵喵",
},
icon: "noto--bookmark-tabs.svg",
},
{
url: import.meta.env.VITE_BLOCKLY,
title: {
"zh-Hans": "小方块",
"zh-Hant": "小方塊",
en: "Little Blocks",
ja: "小さなブロック",
ko: "작은 블록",
meow: "喵喵喵",
},
description: {
"zh-Hans": "搭积木,学编程",
"zh-Hant": "搭積木,學編程",
en: "Learn coding with blocks",
ja: "ブロックでプログラミング",
ko: "블록으로 프로그래밍 배우기",
meow: "喵喵喵喵喵喵喵",
},
icon: "twemoji--brick.svg",
},
{
url: import.meta.env.VITE_HUABU,
title: {
"zh-Hans": "白板",
"zh-Hant": "白板",
en: "Whiteboard",
ja: "ホワイトボード",
ko: "화이트보드",
meow: "喵喵",
},
description: {
"zh-Hans": "在线板书",
"zh-Hant": "在線板書",
en: "Online whiteboard",
ja: "オンライン板書",
ko: "온라인 판서",
meow: "喵喵喵喵",
},
icon: "noto--artist-palette.svg",
},
{
url: import.meta.env.VITE_PPT,
title: {
"zh-Hans": "Python PPT",
"zh-Hant": "Python PPT",
en: "Python PPT",
ja: "Python PPT",
ko: "Python PPT",
meow: "喵喵喵喵喵喵",
},
description: {
"zh-Hans": "Python 第一学期上课用",
"zh-Hant": "Python 第一學期上課用",
en: "Python semester 1 materials",
ja: "Python 1学期授業用",
ko: "Python 1학기 수업용",
meow: "喵喵喵喵喵喵喵喵喵喵喵喵喵喵",
},
icon: "material-icon-theme--python.svg",
},
{
url: import.meta.env.VITE_PY,
title: {
"zh-Hans": "Python 项目",
"zh-Hant": "Python 項目",
en: "Python Projects",
ja: "Python プロジェクト",
ko: "Python 프로젝트",
meow: "喵喵喵喵喵喵喵喵",
},
description: {
"zh-Hans": "Python 第二学期上课用",
"zh-Hant": "Python 第二學期上課用",
en: "Python semester 2 materials",
ja: "Python 2学期授業用",
ko: "Python 2학기 수업용",
meow: "喵喵喵喵喵喵喵",
},
icon: "material-icon-theme--folder-python-open.svg",
},
].filter((site) => !!site.url)

158
i18n.js
View File

@@ -1,158 +0,0 @@
export const I18N = {
"zh-Hans": {
appTitle: "物联网专业在线学习平台",
pinnedSubtitle: "置顶内容",
designThemeLabel: "设计主题",
themeToggleLabel: "切换主题",
themeToggleTitle: "切换深色/浅色模式",
moonAlt: "月亮",
sunAlt: "太阳",
languageLabel: "语言",
beianIcp: "浙ICP备2023044109号",
beianMps: "浙公网安备33100402331786号",
},
"zh-Hant": {
appTitle: "物聯網專業在線學習平台",
pinnedSubtitle: "置頂內容",
designThemeLabel: "設計主題",
themeToggleLabel: "切換主題",
themeToggleTitle: "切換深色/淺色模式",
moonAlt: "月亮",
sunAlt: "太陽",
languageLabel: "語言",
beianIcp: "浙ICP備2023044109號",
beianMps: "浙公網安備33100402331786號",
},
en: {
appTitle: "IoT Program Online Learning Hub",
pinnedSubtitle: "Pinned",
designThemeLabel: "Design theme",
themeToggleLabel: "Toggle theme",
themeToggleTitle: "Toggle dark/light mode",
moonAlt: "Moon",
sunAlt: "Sun",
languageLabel: "Language",
beianIcp: "Zhejiang ICP 2023044109",
beianMps: "Zhejiang Public Security 33100402331786",
},
ja: {
appTitle: "IoT専攻オンライン学習プラットフォーム",
pinnedSubtitle: "ピン留め",
designThemeLabel: "デザインテーマ",
themeToggleLabel: "テーマ切替",
themeToggleTitle: "ダーク/ライト切替",
moonAlt: "月",
sunAlt: "太陽",
languageLabel: "言語",
beianIcp: "浙江ICP 2023044109",
beianMps: "浙江公安 33100402331786",
},
ko: {
appTitle: "IoT 전공 온라인 학습 플랫폼",
pinnedSubtitle: "고정",
designThemeLabel: "디자인 테마",
themeToggleLabel: "테마 전환",
themeToggleTitle: "다크/라이트 전환",
moonAlt: "달",
sunAlt: "태양",
languageLabel: "언어",
beianIcp: "저장 ICP 2023044109",
beianMps: "저장 공안 33100402331786",
},
meow: {
appTitle: "喵喵喵喵喵喵喵喵喵喵喵喵",
pinnedSubtitle: "喵喵喵喵",
designThemeLabel: "喵喵喵喵",
themeToggleLabel: "喵喵喵喵",
themeToggleTitle: "喵喵喵喵喵喵喵喵喵",
moonAlt: "喵喵",
sunAlt: "喵喵",
languageLabel: "喵喵",
beianIcp: "喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵",
beianMps: "喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵喵",
},
}
export const DESIGN_THEME_LABELS = {
"zh-Hans": {
fluent: "Fluent",
"material-you": "Material You",
terminal: "终端",
cyberpunk: "赛博朋克",
},
"zh-Hant": {
fluent: "Fluent",
"material-you": "Material You",
terminal: "終端",
cyberpunk: "賽博龐克",
},
en: {
fluent: "Fluent",
"material-you": "Material You",
terminal: "Terminal",
cyberpunk: "Cyberpunk",
},
ja: {
fluent: "Fluent",
"material-you": "Material You",
terminal: "ターミナル",
cyberpunk: "サイバーパンク",
},
ko: {
fluent: "Fluent",
"material-you": "Material You",
terminal: "터미널",
cyberpunk: "사이버펑크",
},
meow: {
fluent: "喵喵",
"material-you": "喵喵喵",
terminal: "喵喵",
cyberpunk: "喵喵喵喵",
},
}
export const LANGUAGE_NAMES = {
"zh-Hans": "简体中文",
"zh-Hant": "繁體中文",
en: "English",
ja: "日本語",
ko: "한국어",
meow: "喵喵喵",
}
export const LANGUAGE_KEY = "language"
export const SUPPORTED_LANGUAGES = Object.keys(LANGUAGE_NAMES)
export function getLocalizedText(value, language) {
if (!value) return ""
if (typeof value === "object") {
return (
value[language] || value["zh-Hans"]
)
}
return value
}
export function getInitialLanguage() {
const saved = localStorage.getItem(LANGUAGE_KEY)
if (saved && SUPPORTED_LANGUAGES.includes(saved)) return saved
const normalized = (navigator.language || "").toLowerCase()
if (normalized.startsWith("zh")) {
return normalized.includes("hant") || normalized.includes("tw")
? "zh-Hant"
: "zh-Hans"
}
if (normalized.startsWith("ja")) return "ja"
if (normalized.startsWith("ko")) return "ko"
return "zh-Hans"
}
export function t(key, language) {
return I18N[language]?.[key] || I18N["zh-Hans"][key] || ""
}
export function getDesignThemeLabel(designTheme, language) {
const labels = DESIGN_THEME_LABELS[language] || DESIGN_THEME_LABELS["zh-Hans"]
return labels[designTheme] || labels.fluent
}

View File

@@ -1,120 +1,37 @@
<!doctype html>
<!DOCTYPE html>
<html lang="zh-Hans">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>物联网专业の在线学习平台</title>
<link rel="stylesheet" href="./style.css" />
<title>徐越的在线学习平台</title>
</head>
<body>
<div class="theme-controls">
<label class="design-theme">
<span class="visually-hidden" data-i18n="designThemeLabel"
>设计主题</span
>
<button
class="design-theme-button"
id="designThemeButton"
type="button"
aria-label="设计主题"
aria-haspopup="listbox"
aria-expanded="false"
aria-controls="designThemeList"
>
流光
</button>
<ul
class="design-theme-list"
id="designThemeList"
role="listbox"
tabindex="-1"
hidden
>
<li role="option" data-value="fluent" aria-selected="true">Fluent</li>
<li role="option" data-value="material-you" aria-selected="false">
Material You
</li>
<li role="option" data-value="terminal" aria-selected="false">
Terminal
</li>
<li role="option" data-value="cyberpunk" aria-selected="false">
Cyberpunk
</li>
</ul>
</label>
<label class="design-theme language-switch">
<span class="visually-hidden" data-i18n="languageLabel">语言</span>
<button
class="design-theme-button"
id="languageButton"
type="button"
aria-label="语言"
aria-haspopup="listbox"
aria-expanded="false"
aria-controls="languageList"
>
中文
</button>
<ul
class="design-theme-list"
id="languageList"
role="listbox"
tabindex="-1"
hidden
>
<li role="option" data-value="zh-Hans" aria-selected="true">
简体中文
</li>
<li role="option" data-value="zh-Hant" aria-selected="false">
繁體中文
</li>
<li role="option" data-value="ja" aria-selected="false">日本語</li>
<li role="option" data-value="ko" aria-selected="false">한국어</li>
<li role="option" data-value="en" aria-selected="false">English</li>
<li role="option" data-value="meow" aria-selected="false">喵喵喵</li>
</ul>
</label>
<button
class="theme-toggle"
id="themeToggle"
aria-label="切换主题"
title="切换深色/浅色模式"
>
<img
src="/icons/moon.svg"
alt="月亮"
class="theme-icon theme-icon-moon"
/>
<img
src="/icons/sun.svg"
alt="太阳"
class="theme-icon theme-icon-sun"
/>
</button>
</div>
<div id="app">
<div class="container">
<main class="main">
<h1 class="title" data-i18n="appTitle">物联网专业の在线学习平台</h1>
<h1 class="title gradient">♥️ 徐越的在线学习平台 ♥️</h1>
<h2 class="subtitle"></h2>
<div class="grid" id="sites"></div>
</main>
<div class="beian">
<a href="https://beian.miit.gov.cn" target="_blank" rel="noreferrer">
<span data-i18n="beianIcp">浙ICP备2023044109号</span>
浙ICP备2023044109号
</a>
<div>
<img src="/备案图标.png" alt="备案图标" />
<a
href="https://beian.mps.gov.cn/#/query/webSearch?code=33100402331786"
rel="noreferrer"
target="_blank"
>
<span data-i18n="beianMps">浙公网安备33100402331786号</span>
浙公网安备33100402331786号
</a>
</div>
</div>
</div>
</div>
<script type="module" src="/main.js"></script>
</body>
</html>

102
main.js
View File

@@ -1,3 +1,101 @@
import { initApp } from "./app.js"
import "./style.css"
initApp()
const pins = [
// {
// url: "https://code.xuyue.cc?query=30",
// description: "示例代码",
// },
// {
// url: "https://lc.xuyue.cc/public-forms/do0zqi0xlpe",
// description: "数据记录单",
// },
// {
// url: "https://lc.xuyue.cc/",
// description: "账号 stu 密码 123456",
// },
// {
// url: "https://play.xuyue.cc/",
// description: "选择自己的名字做小测试",
// },
]
const sites = [
{
url: import.meta.env.VITE_OJ,
title: "判题狗",
description: "在线判题网站",
icon: "noto--dog-face.svg",
},
{
url: import.meta.env.VITE_CODE,
title: "自测猫",
description: "代码运行网站",
icon: "noto--cat-face.svg",
},
{
url: import.meta.env.VITE_WEB,
title: "哈基米",
description: "Web 前端开发",
icon: "noto--honeybee.svg",
},
{
url: import.meta.env.VITE_SHUATI,
title: "刷题鸭",
description: "梁老师的刷题网站",
icon: "noto--paintbrush.svg",
},
{
url: import.meta.env.VITE_PLAY,
title: "限时鸭",
description: "用来练习基本的代码格式",
icon: "noto--duck.svg",
},
{
url: import.meta.env.VITE_BOOK,
title: "编程书",
description: "编程和计算机相关知识汇总",
icon: "noto--bookmark-tabs.svg",
},
{
url: import.meta.env.VITE_HUABU,
title: "白板",
description: "在线板书",
icon: "noto--artist-palette.svg",
},
{
url: import.meta.env.VITE_PPT,
title: "Python PPT",
description: "Python 第一学期上课用",
icon: "material-icon-theme--python.svg",
},
{
url: import.meta.env.VITE_PY,
title: "Python 项目",
description: "Python 第二学期上课用",
icon: "material-icon-theme--folder-python-open.svg",
},
].filter((i) => !!i.url)
const item = (site) => `
<a href="${site.url}" target="_blank" class="card">
<div class="title-icon">
${site.icon ? `<img src="/icons/${site.icon}" alt="${site.title}" class="icon" />` : ""}
<h2>${site.title} &rarr;</h2>
</div>
<p>${site.description}</p>
<p class="single">${site.url}</p>
</a>
`
const pin = (site) => `
<a href="${site.url}" target="_blank" class="card pin">
<p>${site.description}</p>
</a>
`
if (pins.length) {
document.querySelector(".subtitle").innerHTML = "置顶内容"
}
document.querySelector("#sites").innerHTML =
pins.map(pin).join("") + sites.map(item).join("")

502
package-lock.json generated
View File

@@ -1,21 +1,21 @@
{
"name": "hyyz-home",
"version": "2.0.0",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "hyyz-home",
"version": "2.0.0",
"version": "1.0.0",
"devDependencies": {
"prettier": "^3.7.4",
"vite": "^7.3.0"
"prettier": "^3.6.2",
"vite": "^7.1.3"
}
},
"node_modules/@esbuild/aix-ppc64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
"integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
"integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
"cpu": [
"ppc64"
],
@@ -30,9 +30,9 @@
}
},
"node_modules/@esbuild/android-arm": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
"integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
"integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
"cpu": [
"arm"
],
@@ -47,9 +47,9 @@
}
},
"node_modules/@esbuild/android-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
"integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
"integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
"cpu": [
"arm64"
],
@@ -64,9 +64,9 @@
}
},
"node_modules/@esbuild/android-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
"integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
"integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
"cpu": [
"x64"
],
@@ -81,9 +81,9 @@
}
},
"node_modules/@esbuild/darwin-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
"integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
"integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
"cpu": [
"arm64"
],
@@ -98,9 +98,9 @@
}
},
"node_modules/@esbuild/darwin-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
"integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
"integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
"cpu": [
"x64"
],
@@ -115,9 +115,9 @@
}
},
"node_modules/@esbuild/freebsd-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
"integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
"integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
"cpu": [
"arm64"
],
@@ -132,9 +132,9 @@
}
},
"node_modules/@esbuild/freebsd-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
"integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
"integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
"cpu": [
"x64"
],
@@ -149,9 +149,9 @@
}
},
"node_modules/@esbuild/linux-arm": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
"integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
"integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
"cpu": [
"arm"
],
@@ -166,9 +166,9 @@
}
},
"node_modules/@esbuild/linux-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
"integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
"integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
"cpu": [
"arm64"
],
@@ -183,9 +183,9 @@
}
},
"node_modules/@esbuild/linux-ia32": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
"integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
"integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
"cpu": [
"ia32"
],
@@ -200,9 +200,9 @@
}
},
"node_modules/@esbuild/linux-loong64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
"integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
"integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
"cpu": [
"loong64"
],
@@ -217,9 +217,9 @@
}
},
"node_modules/@esbuild/linux-mips64el": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
"integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
"integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
"cpu": [
"mips64el"
],
@@ -234,9 +234,9 @@
}
},
"node_modules/@esbuild/linux-ppc64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
"integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
"integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
"cpu": [
"ppc64"
],
@@ -251,9 +251,9 @@
}
},
"node_modules/@esbuild/linux-riscv64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
"integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
"integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
"cpu": [
"riscv64"
],
@@ -268,9 +268,9 @@
}
},
"node_modules/@esbuild/linux-s390x": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
"integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
"integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
"cpu": [
"s390x"
],
@@ -285,9 +285,9 @@
}
},
"node_modules/@esbuild/linux-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
"integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
"integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
"cpu": [
"x64"
],
@@ -302,9 +302,9 @@
}
},
"node_modules/@esbuild/netbsd-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
"integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
"integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
"cpu": [
"arm64"
],
@@ -319,9 +319,9 @@
}
},
"node_modules/@esbuild/netbsd-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
"integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
"integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
"cpu": [
"x64"
],
@@ -336,9 +336,9 @@
}
},
"node_modules/@esbuild/openbsd-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
"integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
"integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
"cpu": [
"arm64"
],
@@ -353,9 +353,9 @@
}
},
"node_modules/@esbuild/openbsd-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
"integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
"integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
"cpu": [
"x64"
],
@@ -369,27 +369,10 @@
"node": ">=18"
}
},
"node_modules/@esbuild/openharmony-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
"integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
"cpu": [
"arm64"
],
"dev": true,
"license": "MIT",
"optional": true,
"os": [
"openharmony"
],
"engines": {
"node": ">=18"
}
},
"node_modules/@esbuild/sunos-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
"integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
"integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
"cpu": [
"x64"
],
@@ -404,9 +387,9 @@
}
},
"node_modules/@esbuild/win32-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
"integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
"integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
"cpu": [
"arm64"
],
@@ -421,9 +404,9 @@
}
},
"node_modules/@esbuild/win32-ia32": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
"integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
"integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
"cpu": [
"ia32"
],
@@ -438,9 +421,9 @@
}
},
"node_modules/@esbuild/win32-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
"integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
"integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
"cpu": [
"x64"
],
@@ -742,9 +725,9 @@
"license": "MIT"
},
"node_modules/esbuild": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz",
"integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
"integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
"dev": true,
"hasInstallScript": true,
"license": "MIT",
@@ -755,32 +738,31 @@
"node": ">=18"
},
"optionalDependencies": {
"@esbuild/aix-ppc64": "0.27.2",
"@esbuild/android-arm": "0.27.2",
"@esbuild/android-arm64": "0.27.2",
"@esbuild/android-x64": "0.27.2",
"@esbuild/darwin-arm64": "0.27.2",
"@esbuild/darwin-x64": "0.27.2",
"@esbuild/freebsd-arm64": "0.27.2",
"@esbuild/freebsd-x64": "0.27.2",
"@esbuild/linux-arm": "0.27.2",
"@esbuild/linux-arm64": "0.27.2",
"@esbuild/linux-ia32": "0.27.2",
"@esbuild/linux-loong64": "0.27.2",
"@esbuild/linux-mips64el": "0.27.2",
"@esbuild/linux-ppc64": "0.27.2",
"@esbuild/linux-riscv64": "0.27.2",
"@esbuild/linux-s390x": "0.27.2",
"@esbuild/linux-x64": "0.27.2",
"@esbuild/netbsd-arm64": "0.27.2",
"@esbuild/netbsd-x64": "0.27.2",
"@esbuild/openbsd-arm64": "0.27.2",
"@esbuild/openbsd-x64": "0.27.2",
"@esbuild/openharmony-arm64": "0.27.2",
"@esbuild/sunos-x64": "0.27.2",
"@esbuild/win32-arm64": "0.27.2",
"@esbuild/win32-ia32": "0.27.2",
"@esbuild/win32-x64": "0.27.2"
"@esbuild/aix-ppc64": "0.25.1",
"@esbuild/android-arm": "0.25.1",
"@esbuild/android-arm64": "0.25.1",
"@esbuild/android-x64": "0.25.1",
"@esbuild/darwin-arm64": "0.25.1",
"@esbuild/darwin-x64": "0.25.1",
"@esbuild/freebsd-arm64": "0.25.1",
"@esbuild/freebsd-x64": "0.25.1",
"@esbuild/linux-arm": "0.25.1",
"@esbuild/linux-arm64": "0.25.1",
"@esbuild/linux-ia32": "0.25.1",
"@esbuild/linux-loong64": "0.25.1",
"@esbuild/linux-mips64el": "0.25.1",
"@esbuild/linux-ppc64": "0.25.1",
"@esbuild/linux-riscv64": "0.25.1",
"@esbuild/linux-s390x": "0.25.1",
"@esbuild/linux-x64": "0.25.1",
"@esbuild/netbsd-arm64": "0.25.1",
"@esbuild/netbsd-x64": "0.25.1",
"@esbuild/openbsd-arm64": "0.25.1",
"@esbuild/openbsd-x64": "0.25.1",
"@esbuild/sunos-x64": "0.25.1",
"@esbuild/win32-arm64": "0.25.1",
"@esbuild/win32-ia32": "0.25.1",
"@esbuild/win32-x64": "0.25.1"
}
},
"node_modules/fdir": {
@@ -848,7 +830,6 @@
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"license": "MIT",
"peer": true,
"engines": {
"node": ">=12"
},
@@ -886,9 +867,9 @@
}
},
"node_modules/prettier": {
"version": "3.7.4",
"resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.7.4.tgz",
"integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
"dev": true,
"license": "MIT",
"bin": {
@@ -952,14 +933,14 @@
}
},
"node_modules/tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
"integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
"fdir": "^6.4.4",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=12.0.0"
@@ -969,18 +950,18 @@
}
},
"node_modules/vite": {
"version": "7.3.0",
"resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.0.tgz",
"integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz",
"integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==",
"dev": true,
"license": "MIT",
"dependencies": {
"esbuild": "^0.27.0",
"esbuild": "^0.25.0",
"fdir": "^6.5.0",
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rollup": "^4.43.0",
"tinyglobby": "^0.2.15"
"tinyglobby": "^0.2.14"
},
"bin": {
"vite": "bin/vite.js"
@@ -1046,184 +1027,177 @@
},
"dependencies": {
"@esbuild/aix-ppc64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz",
"integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.1.tgz",
"integrity": "sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==",
"dev": true,
"optional": true
},
"@esbuild/android-arm": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz",
"integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.1.tgz",
"integrity": "sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==",
"dev": true,
"optional": true
},
"@esbuild/android-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz",
"integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.1.tgz",
"integrity": "sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==",
"dev": true,
"optional": true
},
"@esbuild/android-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz",
"integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.1.tgz",
"integrity": "sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==",
"dev": true,
"optional": true
},
"@esbuild/darwin-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz",
"integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.1.tgz",
"integrity": "sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==",
"dev": true,
"optional": true
},
"@esbuild/darwin-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz",
"integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.1.tgz",
"integrity": "sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==",
"dev": true,
"optional": true
},
"@esbuild/freebsd-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz",
"integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.1.tgz",
"integrity": "sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==",
"dev": true,
"optional": true
},
"@esbuild/freebsd-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz",
"integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.1.tgz",
"integrity": "sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==",
"dev": true,
"optional": true
},
"@esbuild/linux-arm": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz",
"integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.1.tgz",
"integrity": "sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz",
"integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.1.tgz",
"integrity": "sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-ia32": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz",
"integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.1.tgz",
"integrity": "sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-loong64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz",
"integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.1.tgz",
"integrity": "sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==",
"dev": true,
"optional": true
},
"@esbuild/linux-mips64el": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz",
"integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.1.tgz",
"integrity": "sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==",
"dev": true,
"optional": true
},
"@esbuild/linux-ppc64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz",
"integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.1.tgz",
"integrity": "sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==",
"dev": true,
"optional": true
},
"@esbuild/linux-riscv64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz",
"integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.1.tgz",
"integrity": "sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-s390x": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz",
"integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.1.tgz",
"integrity": "sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==",
"dev": true,
"optional": true
},
"@esbuild/linux-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz",
"integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.1.tgz",
"integrity": "sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==",
"dev": true,
"optional": true
},
"@esbuild/netbsd-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz",
"integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.1.tgz",
"integrity": "sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==",
"dev": true,
"optional": true
},
"@esbuild/netbsd-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz",
"integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.1.tgz",
"integrity": "sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==",
"dev": true,
"optional": true
},
"@esbuild/openbsd-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz",
"integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.1.tgz",
"integrity": "sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==",
"dev": true,
"optional": true
},
"@esbuild/openbsd-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz",
"integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==",
"dev": true,
"optional": true
},
"@esbuild/openharmony-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz",
"integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.1.tgz",
"integrity": "sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==",
"dev": true,
"optional": true
},
"@esbuild/sunos-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz",
"integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.1.tgz",
"integrity": "sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==",
"dev": true,
"optional": true
},
"@esbuild/win32-arm64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz",
"integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.1.tgz",
"integrity": "sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==",
"dev": true,
"optional": true
},
"@esbuild/win32-ia32": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz",
"integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.1.tgz",
"integrity": "sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==",
"dev": true,
"optional": true
},
"@esbuild/win32-x64": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz",
"integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.1.tgz",
"integrity": "sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==",
"dev": true,
"optional": true
},
@@ -1374,37 +1348,36 @@
"dev": true
},
"esbuild": {
"version": "0.27.2",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.27.2.tgz",
"integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==",
"version": "0.25.1",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.1.tgz",
"integrity": "sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==",
"dev": true,
"requires": {
"@esbuild/aix-ppc64": "0.27.2",
"@esbuild/android-arm": "0.27.2",
"@esbuild/android-arm64": "0.27.2",
"@esbuild/android-x64": "0.27.2",
"@esbuild/darwin-arm64": "0.27.2",
"@esbuild/darwin-x64": "0.27.2",
"@esbuild/freebsd-arm64": "0.27.2",
"@esbuild/freebsd-x64": "0.27.2",
"@esbuild/linux-arm": "0.27.2",
"@esbuild/linux-arm64": "0.27.2",
"@esbuild/linux-ia32": "0.27.2",
"@esbuild/linux-loong64": "0.27.2",
"@esbuild/linux-mips64el": "0.27.2",
"@esbuild/linux-ppc64": "0.27.2",
"@esbuild/linux-riscv64": "0.27.2",
"@esbuild/linux-s390x": "0.27.2",
"@esbuild/linux-x64": "0.27.2",
"@esbuild/netbsd-arm64": "0.27.2",
"@esbuild/netbsd-x64": "0.27.2",
"@esbuild/openbsd-arm64": "0.27.2",
"@esbuild/openbsd-x64": "0.27.2",
"@esbuild/openharmony-arm64": "0.27.2",
"@esbuild/sunos-x64": "0.27.2",
"@esbuild/win32-arm64": "0.27.2",
"@esbuild/win32-ia32": "0.27.2",
"@esbuild/win32-x64": "0.27.2"
"@esbuild/aix-ppc64": "0.25.1",
"@esbuild/android-arm": "0.25.1",
"@esbuild/android-arm64": "0.25.1",
"@esbuild/android-x64": "0.25.1",
"@esbuild/darwin-arm64": "0.25.1",
"@esbuild/darwin-x64": "0.25.1",
"@esbuild/freebsd-arm64": "0.25.1",
"@esbuild/freebsd-x64": "0.25.1",
"@esbuild/linux-arm": "0.25.1",
"@esbuild/linux-arm64": "0.25.1",
"@esbuild/linux-ia32": "0.25.1",
"@esbuild/linux-loong64": "0.25.1",
"@esbuild/linux-mips64el": "0.25.1",
"@esbuild/linux-ppc64": "0.25.1",
"@esbuild/linux-riscv64": "0.25.1",
"@esbuild/linux-s390x": "0.25.1",
"@esbuild/linux-x64": "0.25.1",
"@esbuild/netbsd-arm64": "0.25.1",
"@esbuild/netbsd-x64": "0.25.1",
"@esbuild/openbsd-arm64": "0.25.1",
"@esbuild/openbsd-x64": "0.25.1",
"@esbuild/sunos-x64": "0.25.1",
"@esbuild/win32-arm64": "0.25.1",
"@esbuild/win32-ia32": "0.25.1",
"@esbuild/win32-x64": "0.25.1"
}
},
"fdir": {
@@ -1437,8 +1410,7 @@
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
"dev": true,
"peer": true
"dev": true
},
"postcss": {
"version": "8.5.6",
@@ -1452,9 +1424,9 @@
}
},
"prettier": {
"version": "3.7.4",
"resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.7.4.tgz",
"integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==",
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz",
"integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==",
"dev": true
},
"rollup": {
@@ -1494,28 +1466,28 @@
"dev": true
},
"tinyglobby": {
"version": "0.2.15",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
"integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==",
"dev": true,
"requires": {
"fdir": "^6.5.0",
"picomatch": "^4.0.3"
"fdir": "^6.4.4",
"picomatch": "^4.0.2"
}
},
"vite": {
"version": "7.3.0",
"resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.0.tgz",
"integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==",
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.1.3.tgz",
"integrity": "sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==",
"dev": true,
"requires": {
"esbuild": "^0.27.0",
"esbuild": "^0.25.0",
"fdir": "^6.5.0",
"fsevents": "~2.3.3",
"picomatch": "^4.0.3",
"postcss": "^8.5.6",
"rollup": "^4.43.0",
"tinyglobby": "^0.2.15"
"tinyglobby": "^0.2.14"
}
}
}

View File

@@ -1,7 +1,7 @@
{
"name": "hyyz-home",
"private": true,
"version": "2.0.0",
"version": "1.0.0",
"type": "module",
"scripts": {
"start": "vite --mode=production",
@@ -10,7 +10,7 @@
"fmt": "prettier --write *.js style.css index.html"
},
"devDependencies": {
"prettier": "^3.7.4",
"vite": "^7.3.0"
"prettier": "^3.6.2",
"vite": "^7.1.3"
}
}

View File

@@ -1,2 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none"><path fill="#fcd53f" d="M23.41 5.632c.5 2.04.56 4.26.02 6.56c-1.26 5.33-5.64 9.51-11.02 10.48c-2.91.53-5.68.13-8.09-.92c-.56-.25-1.09.39-.8.93c2.65 4.88 8.11 8 14.22 7.19c6.23-.83 11.22-5.91 11.97-12.15c.6-5.18-1.6-9.86-5.28-12.75c-.47-.36-1.16.08-1.02.66"/><path fill="#f9c23c" d="M27.87 12.562a1.57 1.57 0 1 1-3.14 0a1.57 1.57 0 0 1 3.14 0m-12.92 12.88a1.57 1.57 0 1 1-3.14 0a1.57 1.57 0 0 1 3.14 0m11.85-6.47a.99.99 0 1 0 0-1.98a.99.99 0 0 0 0 1.98m-2 3.01a3 3 0 1 1-6 0a3 3 0 0 1 6 0"/></g></svg>

Before

Width:  |  Height:  |  Size: 602 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128"><radialGradient id="SVG6bAUKdJt" cx="68.884" cy="124.296" r="70.587" gradientTransform="matrix(-1 -.00434 -.00713 1.6408 131.986 -79.345)" gradientUnits="userSpaceOnUse"><stop offset=".314" stop-color="#ff9800"/><stop offset=".662" stop-color="#ff6d00"/><stop offset=".972" stop-color="#f44336"/></radialGradient><path fill="url(#SVG6bAUKdJt)" d="M35.56 40.73c-.57 6.08-.97 16.84 2.62 21.42c0 0-1.69-11.82 13.46-26.65c6.1-5.97 7.51-14.09 5.38-20.18c-1.21-3.45-3.42-6.3-5.34-8.29c-1.12-1.17-.26-3.1 1.37-3.03c9.86.44 25.84 3.18 32.63 20.22c2.98 7.48 3.2 15.21 1.78 23.07c-.9 5.02-4.1 16.18 3.2 17.55c5.21.98 7.73-3.16 8.86-6.14c.47-1.24 2.1-1.55 2.98-.56c8.8 10.01 9.55 21.8 7.73 31.95c-3.52 19.62-23.39 33.9-43.13 33.9c-24.66 0-44.29-14.11-49.38-39.65c-2.05-10.31-1.01-30.71 14.89-45.11c1.18-1.08 3.11-.12 2.95 1.5"/><radialGradient id="SVG5R9TgbPb" cx="64.921" cy="54.062" r="73.86" gradientTransform="matrix(-.0101 .9999 .7525 .0076 26.154 -11.267)" gradientUnits="userSpaceOnUse"><stop offset=".214" stop-color="#fff176"/><stop offset=".328" stop-color="#fff27d"/><stop offset=".487" stop-color="#fff48f"/><stop offset=".672" stop-color="#fff7ad"/><stop offset=".793" stop-color="#fff9c4"/><stop offset=".822" stop-color="#fff8bd" stop-opacity="0.804"/><stop offset=".863" stop-color="#fff6ab" stop-opacity="0.529"/><stop offset=".91" stop-color="#fff38d" stop-opacity="0.209"/><stop offset=".941" stop-color="#fff176" stop-opacity="0"/></radialGradient><path fill="url(#SVG5R9TgbPb)" d="M76.11 77.42c-9.09-11.7-5.02-25.05-2.79-30.37c.3-.7-.5-1.36-1.13-.93c-3.91 2.66-11.92 8.92-15.65 17.73c-5.05 11.91-4.69 17.74-1.7 24.86c1.8 4.29-.29 5.2-1.34 5.36c-1.02.16-1.96-.52-2.71-1.23a16.1 16.1 0 0 1-4.44-7.6c-.16-.62-.97-.79-1.34-.28c-2.8 3.87-4.25 10.08-4.32 14.47C40.47 113 51.68 124 65.24 124c17.09 0 29.54-18.9 19.72-34.7c-2.85-4.6-5.53-7.61-8.85-11.88"/></svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128"><path fill="#c33" d="M64 4C30.86 4 4 30.86 4 64s26.86 60 60 60s60-26.86 60-60S97.14 4 64 4m50 60a49.37 49.37 0 0 1-11.3 31.6L32.4 25.3A49.37 49.37 0 0 1 64 14c27.61 0 50 22.39 50 50M14 64a49.37 49.37 0 0 1 11.3-31.6l70.3 70.3A49.37 49.37 0 0 1 64 114c-27.61 0-50-22.39-50-50"/><circle cx="60.1" cy="63.1" r="56.1" fill="#f44336"/><path fill="#fff" d="M95.6 102.7A49.37 49.37 0 0 1 64 114c-27.61 0-50-22.39-50-50a49.37 49.37 0 0 1 11.3-31.6l7.1-7.1A49.37 49.37 0 0 1 64 14c27.61 0 50 22.39 50 50a49.37 49.37 0 0 1-11.3 31.6"/><path fill="#231f20" d="M95.6 102.7A49.37 49.37 0 0 1 64 114c-27.61 0-50-22.39-50-50a49.37 49.37 0 0 1 11.3-31.6l7.1-7.1A49.37 49.37 0 0 1 64 14c27.61 0 50 22.39 50 50a49.37 49.37 0 0 1-11.3 31.6"/><path fill="#414042" d="M96.4 103.2c-20.49 16.74-50.66 13.7-67.4-6.79c-14.41-17.63-14.41-42.97 0-60.61l6.8-6.8a47.3 47.3 0 0 1 30.3-10.8c26.45 0 47.9 21.44 47.9 47.9a47.93 47.93 0 0 1-10.8 30.3"/><path fill="#fafafa" d="M93 58.3c.04 2.74-.77 5.43-2.3 7.7a15.3 15.3 0 0 1-6.2 5.3c2.88 1.2 5.37 3.18 7.2 5.7c1.79 2.47 2.74 5.45 2.7 8.5c.19 4.56-1.68 8.97-5.1 12c-3.4 3-7.9 4.5-13.4 4.5s-10.1-1.5-13.4-4.5a15.19 15.19 0 0 1-5.1-12c-.01-3.03.89-5.99 2.6-8.5c1.79-2.55 4.25-4.55 7.1-5.8a15.04 15.04 0 0 1-6.1-5.3a13.57 13.57 0 0 1-2.2-7.7c0-4.9 1.6-8.8 4.7-11.7s7.3-4.3 12.4-4.3s9.2 1.4 12.4 4.3A15.67 15.67 0 0 1 93 58.3m-6.1 27.1c.13-2.98-1-5.88-3.1-8c-2.18-2.07-5.1-3.18-8.1-3.1c-5.69-.39-10.61 3.91-11 9.59q-.045.705 0 1.41c-.14 2.89.91 5.71 2.9 7.8c1.9 1.9 4.7 2.8 8.2 2.8S82 95 83.9 93c2-1.7 3-4.3 3-7.6m-11.1-37c-2.61-.13-5.15.85-7 2.7a9.8 9.8 0 0 0-2.7 7.3c-.11 2.67.87 5.26 2.7 7.2a9.48 9.48 0 0 0 7.1 2.7c2.64.13 5.21-.85 7.1-2.7a9.72 9.72 0 0 0 2.7-7.2c.14-2.69-.88-5.31-2.8-7.2a10.05 10.05 0 0 0-7.1-2.8M49.1 43l-14.3 5.4c-.68.23-1.13.88-1.1 1.6v3.2c0 .94.77 1.71 1.71 1.71c.2 0 .4-.04.59-.11l4.9-1.8a1.7 1.7 0 0 1 2.19 1.01c.07.19.1.39.11.59v45.1c.03.93.77 1.67 1.7 1.7H49c.93-.03 1.67-.77 1.7-1.7V44.1c0-.67-.55-1.22-1.23-1.21c-.06 0-.12 0-.17.01zm35.5-8.3h-1.1a.675.675 0 0 0-.7.66v3.04c.01.38-.28.69-.66.7h-.54a.675.675 0 0 1-.7-.66V28.3c-.01-.38.28-.69.66-.7h3.34c1.11-.07 2.2.25 3.1.9c.74.66 1.14 1.61 1.1 2.6c.02.71-.19 1.41-.6 2c-.26.38-.6.68-1 .9c-.3.24-.42.64-.3 1l2.3 4.2v.1h-1.7a1 1 0 0 1-.7-.4l-1.9-3.7c-.1-.4-.3-.5-.6-.5m-1.8-2.4c-.01.38.28.69.66.7h1.34c.57.02 1.14-.16 1.6-.5c.41-.34.64-.86.6-1.4c.02-.51-.16-1.01-.5-1.4c-.46-.34-1.03-.52-1.6-.5h-1.4a.675.675 0 0 0-.7.66zM77.3 34h-3.9a.43.43 0 0 0-.4.4v2.7c.01.21.19.39.4.4H78c.21.01.39.19.4.4v.8a.43.43 0 0 1-.4.4h-6.6a.43.43 0 0 1-.4-.4V28.1a.43.43 0 0 1 .4-.4H78c.21.01.39.19.4.4v.8a.43.43 0 0 1-.4.4h-4.6a.43.43 0 0 0-.4.4V32c.01.21.19.39.4.4h3.9c.21.01.39.19.4.4v.8c.02.2-.13.38-.34.4zm-16.8 4.7V28.1a.43.43 0 0 1 .4-.4h2.9c.95-.03 1.88.22 2.7.7c.79.42 1.42 1.09 1.8 1.9c.41.88.61 1.83.6 2.8v.6c.03.97-.18 1.93-.6 2.8c-.41.79-1.03 1.45-1.8 1.9c-.83.44-1.76.68-2.7.7h-2.9a.43.43 0 0 1-.4-.4m2-9v7.4c.01.21.19.39.4.4h.9c.91.05 1.79-.32 2.4-1c.62-.8.9-1.8.8-2.8v-.6a4.5 4.5 0 0 0-.8-2.8a2.93 2.93 0 0 0-2.3-1h-1a.43.43 0 0 0-.4.4m-16-2c.21.01.39.19.4.4v7.2c.05 1.1-.39 2.16-1.2 2.9c-.86.74-1.96 1.14-3.1 1.1c-1.12.07-2.23-.29-3.1-1a3.62 3.62 0 0 1-1.1-2.9v-7.2a.43.43 0 0 1 .4-.4H40c.21.01.39.19.4.4v7.2c-.05.63.17 1.25.6 1.7c.46.42 1.08.63 1.7.6c1.15.13 2.18-.69 2.31-1.84c.02-.19.02-.37-.01-.56v-7.1a.43.43 0 0 1 .4-.4c0-.1 1.1-.1 1.1-.1m11 11.4h-1.3c-.1 0-.3-.1-.3-.2l-4.2-6.7c-.2-.3-.8-.2-.8.2v6.2a.43.43 0 0 1-.4.4h-1.2a.43.43 0 0 1-.4-.4V28.1a.43.43 0 0 1 .4-.4h1.3c.1 0 .3.1.3.2l4.2 6.7c.2.3.8.2.8-.2v-6.3a.43.43 0 0 1 .4-.4h1.1c.21.01.39.19.4.4v10.5c.08.17.01.38-.17.47c-.04.02-.08.03-.13.03"/><path fill="#231f20" d="M23.4 35.6L95 102.1l2-1.9l-66.4-66.8" opacity="0.8"/><path fill="#f44336" d="M103.9 96.8L25.3 18.9L18.2 26l78.6 77.9"/><path fill="#ff8a80" d="M45 10.9c1.7-.4 4.2-1.6 5.9-1.1c1.09.3 1.75 1.4 1.5 2.5a2.61 2.61 0 0 1-2 1.5c-3.9.97-7.68 2.35-11.3 4.1A52 52 0 0 0 21 33.7c-1.9 2.7-3.4 5.5-5.8 7.8c-.21.23-.49.37-.8.4a.74.74 0 0 1-.5-.1c-1.2-.5-1.4-1.1-1.2-2.3c.18-1.01.52-1.99 1-2.9q1.515-2.64 3.3-5.1c1.89-2.91 4.11-5.59 6.6-8c6.8-6.3 15.6-11.1 21.4-12.6"/><path fill="#c33" d="m32.4 25.3l-2 2l71.1 71.1l1.8-2.2z"/></svg>

Before

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="128" height="128" viewBox="0 0 128 128"><path fill="#464c4f" d="M19.64 35.33c.09-.26-.09-4.82 2.45-8.41s5.87-4.12 8.33-4.56c2.98-.53 10.17-1.4 11.31 1.05s.26 3.77 2.1 4.47s-1.49 4.82-1.49 4.82zm88.25-.09s.72-4.43-1.81-7.42c-3.8-4.51-9.75-5.97-15.38-5.97c-1.81 0-3.98.35-4.68 2.51c-.4 1.25-.68 2.77-1.56 2.94c-.87.18 17.73 5.93 23.43 7.94"/><path fill="#5e6268" d="M39.04 81.29c-2.99 2.32-6.96 18.32-13.17 22.55s-20.28 1.97-21.34-6.66c-.93-7.61.76-23.61 5-39.96s7.5-24.45 17.41-27.1c7.95-2.13 23.53-3.63 38.66-3.48c15.14.15 28.39.15 36.72 3.33c7.47 2.85 12.56 10.6 16.05 25.73c3.48 15.14 6.17 33.34 5.75 39.36c-.61 8.78-13.02 14.38-22.25 7.57c-7.35-5.42-8.78-19.22-12.56-21.19s-47.55-2.27-50.27-.15"/><path fill="#9e9e9e" d="M93.25 77.17c-.72.9.94 2.24 2.12 5.17s4.22 12.63 7.17 15.34c3.68 3.37 6.55 2.74 7.11 1.68s-2.62-3.8-6.36-9.91s-8.54-14.15-10.04-12.28m-82.73-2.49c-1.11.2-4.05 14.96-1.87 21.2c1.82 5.2 8.79 5.49 11.41 4.74c5.22-1.49 6.86-6.55 5.67-7.11c-1.18-.56-5.32 3.4-9.23 1.56c-4.36-2.06-4.3-7.86-4.86-13.72c-.5-5.28-.06-6.86-1.12-6.67m27.49-32.73c-.41 0-4.01-.02-4.01-.02l.02-4.35s.08-3.51-3.68-3.43c-3.37.07-3.3 2.88-3.3 3.43s-.02 4.32-.02 4.32s-3.82-.04-4.53-.02s-3.37.06-3.37 3.49c0 3.24 2.75 3.47 3.37 3.49s4.51.02 4.51.02s-.03 3.63-.02 4.22s.12 3.37 3.49 3.37c3.68 0 3.49-3.37 3.49-3.37l.02-4.19s3.44.03 4.04.02c.86-.02 3.39-.25 3.43-3.68c.03-3.39-3.02-3.3-3.44-3.3"/><circle cx="48.4" cy="62.42" r="8.54" fill="#afafaf"/><circle cx="77.75" cy="62.55" r="8.54" fill="#afafaf"/><circle cx="48.39" cy="62.21" r="5.71" fill="#c8c8c8"/><circle cx="77.75" cy="62.4" r="5.71" fill="#c8c8c8"/><circle cx="85.82" cy="45.67" r="4.6" fill="#2086fa"/><circle cx="94.94" cy="54.48" r="4.6" fill="#06ac48"/><circle cx="104.12" cy="46.4" r="4.6" fill="#f72e26"/><circle cx="95.02" cy="37.01" r="4.6" fill="#fdb700"/></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -1,2 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32"><g fill="none"><path fill="#ff822d" d="M13.638 3.202a2.936 2.936 0 0 1 4.724 0a2.94 2.94 0 0 0 3.25 1.055a2.936 2.936 0 0 1 3.822 2.778a2.94 2.94 0 0 0 2.008 2.763a2.936 2.936 0 0 1 1.46 4.494a2.94 2.94 0 0 0 0 3.416a2.936 2.936 0 0 1-1.46 4.494a2.94 2.94 0 0 0-2.008 2.763a2.936 2.936 0 0 1-3.823 2.778a2.94 2.94 0 0 0-3.249 1.055a2.936 2.936 0 0 1-4.724 0a2.94 2.94 0 0 0-3.25-1.055a2.936 2.936 0 0 1-3.822-2.778a2.94 2.94 0 0 0-2.008-2.763a2.936 2.936 0 0 1-1.46-4.494a2.94 2.94 0 0 0 0-3.416a2.936 2.936 0 0 1 1.46-4.494a2.94 2.94 0 0 0 2.008-2.763a2.936 2.936 0 0 1 3.823-2.778a2.94 2.94 0 0 0 3.249-1.055"/><path fill="#fcd53f" d="M25.062 21.232c-2.89 5.005-9.29 6.72-14.294 3.83s-6.72-9.29-3.83-14.294s9.29-6.72 14.294-3.83s6.72 9.29 3.83 14.294"/></g></svg>

Before

Width:  |  Height:  |  Size: 852 B

View File

@@ -1 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 36 36"><path fill="#c1694f" d="M35.627 10.826L.373 16.56v9.722h.004c-.012.149.129.295.443.473c.727.412 9.835 5.286 10.553 5.639c.895.439 1.441.493 2.206.112c.626-.312 19.236-10.173 20.932-11.074c.863-.459 1.146-.711 1.099-.919h.018z"/><path fill="#a0041e" d="M.373 16.56v9.722h.004c-.012.149.129.295.443.473c.727.412 9.835 5.286 10.553 5.639c.432.212.781.329 1.114.356V16.56z"/><path fill="#d99e82" d="M22.224 4.682c1.076-.558 1.113-.628 2.249-.024s9.846 5.248 10.487 5.589c.814.434 1.112.591-.449 1.421c-1.696.902-20.306 10.763-20.932 11.074c-.765.381-1.311.327-2.206-.112c-.718-.352-9.826-5.226-10.553-5.639c-.82-.465-.482-.706.769-1.37z"/><ellipse cx="11.189" cy="17.191" fill="#c1694f" rx="3.679" ry="1.84"/><path fill="#a0041e" d="M11.642 16.734c-1.569-.516-3.352-.369-4.108.339c-.005.04-.024.078-.024.118c0 1.016 1.647 1.84 3.679 1.84c1.063 0 2.013-.229 2.684-.589c-.333-.692-1.086-1.332-2.231-1.708"/><ellipse cx="18" cy="13.639" fill="#c1694f" rx="3.679" ry="1.84"/><path fill="#a0041e" d="M18.453 13.182c-1.569-.516-3.352-.369-4.108.339c-.005.04-.024.078-.024.118c0 1.016 1.647 1.84 3.679 1.84c1.063 0 2.013-.229 2.684-.589c-.333-.692-1.086-1.332-2.231-1.708"/><ellipse cx="24.811" cy="10.087" fill="#c1694f" rx="3.679" ry="1.84"/><path fill="#a0041e" d="M25.264 9.63c-1.569-.516-3.352-.369-4.108.339c-.005.04-.024.078-.024.118c0 1.016 1.647 1.84 3.679 1.84c1.063 0 2.012-.229 2.684-.589c-.333-.692-1.086-1.332-2.231-1.708"/></svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

BIN
public/备案图标.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,34 +0,0 @@
import { getLocalizedText } from "./i18n.js"
const renderItem = (site, language) => {
const title = getLocalizedText(site.title, language)
const description = getLocalizedText(site.description, language)
const iconName =
language === "meow" ? "noto--cat-face.svg" : site.icon
return `
<a href="${site.url}" target="_blank" class="card">
<div class="title-icon">
${iconName ? `<img src="/icons/${iconName}" alt="${title}" class="icon" />` : ""}
<h2>${title} &rarr;</h2>
</div>
<p>${description}</p>
<p class="single">${site.url}</p>
</a>
`
}
const renderPin = (site, language) => {
const description = getLocalizedText(site.description, language)
return `
<a href="${site.url}" target="_blank" class="card pin">
<p>${description}</p>
</a>
`
}
export function renderSites({ container, sites, pins, language }) {
if (!container) return
container.innerHTML =
pins.map((site) => renderPin(site, language)).join("") +
sites.map((site) => renderItem(site, language)).join("")
}

1549
style.css

File diff suppressed because it is too large Load Diff

122
theme.js
View File

@@ -1,122 +0,0 @@
const DESIGN_THEMES = ["fluent", "material-you", "terminal", "cyberpunk"]
const FORCED_DARK_DESIGN_THEMES = new Set(["terminal", "cyberpunk"])
const THEME_BEFORE_FORCED_KEY = "themeBeforeForcedDark"
export function getInitialTheme() {
const savedTheme = localStorage.getItem("theme")
if (savedTheme) {
return savedTheme
}
return window.matchMedia("(prefers-color-scheme: dark)").matches
? "dark"
: "light"
}
export function setTheme(theme) {
document.documentElement.setAttribute("data-theme", theme)
localStorage.setItem("theme", theme)
}
export function toggleTheme() {
const designTheme =
document.documentElement.getAttribute("data-design-theme") || "fluent"
if (FORCED_DARK_DESIGN_THEMES.has(designTheme)) return
const currentTheme =
document.documentElement.getAttribute("data-theme") || "light"
const newTheme = currentTheme === "dark" ? "light" : "dark"
setTheme(newTheme)
}
export function getInitialDesignTheme() {
const savedDesignTheme = localStorage.getItem("designTheme")
if (savedDesignTheme && DESIGN_THEMES.includes(savedDesignTheme)) {
return savedDesignTheme
}
return "fluent"
}
export function setDesignTheme(designTheme, themeToggle) {
const safeDesignTheme = DESIGN_THEMES.includes(designTheme)
? designTheme
: "fluent"
const previousDesignTheme =
document.documentElement.getAttribute("data-design-theme") || "fluent"
document.documentElement.setAttribute("data-design-theme", safeDesignTheme)
localStorage.setItem("designTheme", safeDesignTheme)
const willForceDark = FORCED_DARK_DESIGN_THEMES.has(safeDesignTheme)
const didForceDark = FORCED_DARK_DESIGN_THEMES.has(previousDesignTheme)
if (willForceDark) {
if (!didForceDark) {
const currentTheme =
document.documentElement.getAttribute("data-theme") || "light"
localStorage.setItem(THEME_BEFORE_FORCED_KEY, currentTheme)
}
setTheme("dark")
} else if (didForceDark) {
const restoreTheme =
localStorage.getItem(THEME_BEFORE_FORCED_KEY) ||
localStorage.getItem("themeBeforeTerminal")
if (restoreTheme === "dark" || restoreTheme === "light") {
setTheme(restoreTheme)
}
localStorage.removeItem(THEME_BEFORE_FORCED_KEY)
localStorage.removeItem("themeBeforeTerminal")
}
if (themeToggle) {
themeToggle.disabled = willForceDark
themeToggle.setAttribute("aria-disabled", willForceDark ? "true" : "false")
themeToggle.tabIndex = willForceDark ? -1 : 0
}
}
export function setSelectedDesignThemeUI({
designThemeList,
designThemeButton,
designTheme,
getLabel,
}) {
if (!designThemeList) return
const options = [...designThemeList.querySelectorAll('[role="option"]')]
options.forEach((el) => {
el.setAttribute(
"aria-selected",
el.getAttribute("data-value") === designTheme ? "true" : "false",
)
})
if (designThemeButton) {
designThemeButton.textContent = getLabel(designTheme)
}
}
export function setDesignThemeMenuOpen({
designThemeButton,
designThemeList,
open,
}) {
if (!designThemeButton || !designThemeList) return
designThemeButton.setAttribute("aria-expanded", open ? "true" : "false")
designThemeList.hidden = !open
if (open) {
designThemeList.focus()
}
}
export function getCurrentDesignTheme() {
return document.documentElement.getAttribute("data-design-theme") || "fluent"
}
export function updateDesignThemeOptions({
designThemeList,
getLabel,
language,
}) {
if (!designThemeList) return
const options = [...designThemeList.querySelectorAll('[role="option"]')]
options.forEach((el) => {
const value = el.getAttribute("data-value")
el.textContent = getLabel(value, language)
})
}