From 1214e487330ebd330c58bc88298b427ea5650c84 Mon Sep 17 00:00:00 2001 From: Snowflake Date: Wed, 8 Jul 2026 16:14:01 +0800 Subject: [PATCH] Rebuild site with Hugo: unified dark theme, SVG logo, data-driven content --- .gitignore | 3 + 404.html | 11 - XAGuarder/index.html | 24 - XAGuarder/warning.html | 25 -- content/_index.md | 4 + content/res/_index.md | 8 + content/res/filelist.md | 6 + content/softwares/_index.md | 5 + content/softwares/btcli.md | 9 + content/softwares/minesentinel.md | 8 + content/softwares/mint.md | 8 + content/softwares/reverberation.md | 8 + content/xaguarder/_index.md | 5 + content/xaguarder/warning.md | 6 + data/projects.toml | 91 ++++ data/subjects.toml | 53 +++ hugo.toml | 18 + index.html | 325 -------------- index.old.html | 23 - layouts/404.html | 11 + layouts/_default/baseof.html | 21 + layouts/_default/list.html | 9 + layouts/_default/single.html | 9 + layouts/index.html | 22 + layouts/partials/footer.html | 5 + layouts/partials/nav.html | 13 + layouts/partials/project-card.html | 12 + layouts/partials/subject-card.html | 11 + layouts/res/filelist.html | 13 + layouts/res/list.html | 34 ++ layouts/softwares/list.html | 18 + layouts/softwares/single.html | 82 ++++ layouts/xaguarder/list.html | 14 + layouts/xaguarder/warning.html | 17 + projects.txt | 31 -- res/filelist.html | 355 --------------- res/index.html | 208 --------- res/indexold.html | 10 - softwares/btcli/index.html | 688 ----------------------------- softwares/index.html | 438 ------------------ softwares/minesentinel/index.html | 371 ---------------- softwares/projects.txt | 31 -- softwares/reverberation/index.html | 226 ---------- static/css/style.css | 454 +++++++++++++++++++ static/js/drag-ball.js | 77 ++++ static/js/stars.js | 68 +++ static/logo.svg | 47 ++ 47 files changed, 1169 insertions(+), 2766 deletions(-) create mode 100644 .gitignore delete mode 100644 404.html delete mode 100644 XAGuarder/index.html delete mode 100644 XAGuarder/warning.html create mode 100644 content/_index.md create mode 100644 content/res/_index.md create mode 100644 content/res/filelist.md create mode 100644 content/softwares/_index.md create mode 100644 content/softwares/btcli.md create mode 100644 content/softwares/minesentinel.md create mode 100644 content/softwares/mint.md create mode 100644 content/softwares/reverberation.md create mode 100644 content/xaguarder/_index.md create mode 100644 content/xaguarder/warning.md create mode 100644 data/projects.toml create mode 100644 data/subjects.toml create mode 100644 hugo.toml delete mode 100644 index.html delete mode 100644 index.old.html create mode 100644 layouts/404.html create mode 100644 layouts/_default/baseof.html create mode 100644 layouts/_default/list.html create mode 100644 layouts/_default/single.html create mode 100644 layouts/index.html create mode 100644 layouts/partials/footer.html create mode 100644 layouts/partials/nav.html create mode 100644 layouts/partials/project-card.html create mode 100644 layouts/partials/subject-card.html create mode 100644 layouts/res/filelist.html create mode 100644 layouts/res/list.html create mode 100644 layouts/softwares/list.html create mode 100644 layouts/softwares/single.html create mode 100644 layouts/xaguarder/list.html create mode 100644 layouts/xaguarder/warning.html delete mode 100644 projects.txt delete mode 100644 res/filelist.html delete mode 100644 res/index.html delete mode 100644 res/indexold.html delete mode 100644 softwares/btcli/index.html delete mode 100644 softwares/index.html delete mode 100644 softwares/minesentinel/index.html delete mode 100644 softwares/projects.txt delete mode 100644 softwares/reverberation/index.html create mode 100644 static/css/style.css create mode 100644 static/js/drag-ball.js create mode 100644 static/js/stars.js create mode 100644 static/logo.svg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d092f2c --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +public/ +.hugo_build.lock +.idea/ diff --git a/404.html b/404.html deleted file mode 100644 index 32c38cf..0000000 --- a/404.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - 错误 - - -

请求的页面未找到

-

请检查大小写/url是否打错

- 回到主页 - - diff --git a/XAGuarder/index.html b/XAGuarder/index.html deleted file mode 100644 index 712f2e1..0000000 --- a/XAGuarder/index.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - S.A. XAGuarder - - - -
- Logo Source:atomgit::user_head - 先占个位,XAGuarder还要一段时间才能上线,当前已有ip,域名拦截能力 - 拦截页面式样 - Copyright(C) 2025 S.A. All rights received. -
- - - diff --git a/XAGuarder/warning.html b/XAGuarder/warning.html deleted file mode 100644 index 1d2c777..0000000 --- a/XAGuarder/warning.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - S.A. XA Defended! - - - -
- Logo Source:atomgit::user_head - - 发现不良网站!XAGuarder保护了您。 - 如果这是正常的网站,请检查是否通过当地公安机关备案。 - Copyright(C) 2025 S.A. All rights received. -
- - - diff --git a/content/_index.md b/content/_index.md new file mode 100644 index 0000000..49acca0 --- /dev/null +++ b/content/_index.md @@ -0,0 +1,4 @@ +--- +title: "SNOWARE" +layout: "home" +--- diff --git a/content/res/_index.md b/content/res/_index.md new file mode 100644 index 0000000..fea4b46 --- /dev/null +++ b/content/res/_index.md @@ -0,0 +1,8 @@ +--- +title: "ISS 资源下载" +description: "一班 · 自学支持 · 资源下载" +accent: "#1565c0" +--- +帮助学生查漏补缺、习题重练、预习复习。所有资源仅供自学使用。 + +提示:蓝奏云链接密码会自动填入,无需手动输入。 diff --git a/content/res/filelist.md b/content/res/filelist.md new file mode 100644 index 0000000..8c1009b --- /dev/null +++ b/content/res/filelist.md @@ -0,0 +1,6 @@ +--- +title: "文件列表" +description: "学科资源文件列表" +accent: "#1565c0" +layout: "filelist" +--- diff --git a/content/softwares/_index.md b/content/softwares/_index.md new file mode 100644 index 0000000..f1d0419 --- /dev/null +++ b/content/softwares/_index.md @@ -0,0 +1,5 @@ +--- +title: "我的作品" +description: "S.A. 的开源项目与作品展示" +accent: "#009688" +--- diff --git a/content/softwares/btcli.md b/content/softwares/btcli.md new file mode 100644 index 0000000..9270be9 --- /dev/null +++ b/content/softwares/btcli.md @@ -0,0 +1,9 @@ +--- +title: "btcli" +description: "命令行翻译工具,配备 TUI 界面" +accent: "#ff8f00" +slug: "btcli" +layout: "software-detail" +project: "btcli" +has_drag_ball: true +--- diff --git a/content/softwares/minesentinel.md b/content/softwares/minesentinel.md new file mode 100644 index 0000000..0c64dcb --- /dev/null +++ b/content/softwares/minesentinel.md @@ -0,0 +1,8 @@ +--- +title: "MineSentinel" +description: "Minecraft 服务器智能守护进程" +accent: "#00bcd4" +slug: "minesentinel" +layout: "software-detail" +project: "minesentinel" +--- diff --git a/content/softwares/mint.md b/content/softwares/mint.md new file mode 100644 index 0000000..8f2b189 --- /dev/null +++ b/content/softwares/mint.md @@ -0,0 +1,8 @@ +--- +title: "Mint Runtime" +description: "安全特性驱动的 Lua 运行时" +accent: "#7c4dff" +slug: "mint" +layout: "software-detail" +project: "mint" +--- diff --git a/content/softwares/reverberation.md b/content/softwares/reverberation.md new file mode 100644 index 0000000..6f3f8fa --- /dev/null +++ b/content/softwares/reverberation.md @@ -0,0 +1,8 @@ +--- +title: "Reverberation" +description: "轻量级文本阅读器" +accent: "#607d8b" +slug: "reverberation" +layout: "software-detail" +project: "reverberation" +--- diff --git a/content/xaguarder/_index.md b/content/xaguarder/_index.md new file mode 100644 index 0000000..c093618 --- /dev/null +++ b/content/xaguarder/_index.md @@ -0,0 +1,5 @@ +--- +title: "XAGuarder" +description: "网站安全拦截服务" +accent: "#f44336" +--- diff --git a/content/xaguarder/warning.md b/content/xaguarder/warning.md new file mode 100644 index 0000000..b179ab4 --- /dev/null +++ b/content/xaguarder/warning.md @@ -0,0 +1,6 @@ +--- +title: "XA Defended!" +description: "XAGuarder 拦截警告页面" +layout: "warning" +accent: "#f44336" +--- diff --git a/data/projects.toml b/data/projects.toml new file mode 100644 index 0000000..fca9b7e --- /dev/null +++ b/data/projects.toml @@ -0,0 +1,91 @@ +[[projects]] +name = "MineSentinel" +slug = "minesentinel" +description = "Minecraft 服务器智能守护进程,TCP 端口检测 + 崩溃自动重启 + 防循环冷却期" +accent = "#00bcd4" +repo_url = "https://gitee.com/snoware/minesentinel" +demo_url = "/softwares/minesentinel/" +doc_url = "https://gitee.com/snoware/minesentinel/blob/master/DEPLOY.md" +tags = ["Ruby", "Minecraft", "Daemon"] +features = [ + { title = "TCP 端口检测", desc = "实时监控服务器端口状态,及时发现异常" }, + { title = "崩溃自动重启", desc = "服务器崩溃后自动重启,无需人工干预" }, + { title = "防循环冷却期", desc = "连续崩溃时进入冷却期,防止无限重启循环" }, + { title = "灵活配置", desc = "通过配置文件自定义检测间隔、重启策略等" }, + { title = "日志记录", desc = "完整的运行日志,方便排查问题" }, + { title = "轻量部署", desc = "Ruby 实现,依赖少,部署简单" } +] +install = "从 Gitee 获取源码后按 DEPLOY.md 文档部署" +license = "开源" +author = "S.A. (@snoware)" + +[[projects]] +name = "btcli" +slug = "btcli" +description = "一款命令行翻译工具,支持中文及其他语言,配备 TUI 界面" +accent = "#ff8f00" +repo_url = "https://gitee.com/ironbayberry/btcli" +demo_url = "/softwares/btcli/" +doc_url = "https://docs.rs/btcli" +tags = ["Rust", "CLI", "Translation", "TUI"] +features = [ + { title = "CLI 界面", desc = "简洁的命令行翻译,一行命令即可使用" }, + { title = "TUI 界面", desc = "交互式终端 UI,实时翻译体验" }, + { title = "多语言支持", desc = "支持中文及其他多种语言互译" }, + { title = "纯 CLI 模式", desc = "无需 TUI,适合脚本和自动化场景" }, + { title = "安全可靠", desc = "Rust 实现,内存安全,无运行时恐慌" }, + { title = "跨平台", desc = "支持 Linux、macOS、Windows" } +] +install = "cargo install btcli 或从源码构建" +usage = [ + { cmd = "btcli hello", desc = "基础翻译" }, + { cmd = "btcli --lang en 你好世界", desc = "指定目标语言" }, + { cmd = "btcli --tui", desc = "启动 TUI 界面" } +] +license = "MPL-2.0" +author = "S.A. (@snoware)" +has_drag_ball = true + +[[projects]] +name = "Reverberation" +slug = "reverberation" +description = "轻量级文本阅读器,逐字显示文本内容" +accent = "#607d8b" +repo_url = "https://gitee.com/ironbayberry/reverberation" +demo_url = "/softwares/reverberation/" +doc_url = "https://docs.rs/reverberation" +tags = ["Rust", "CLI", "Chinese"] +features = [ + { title = "轻量极简", desc = "比 nano 更轻量,比 echo 更实用" }, + { title = "逐字显示", desc = "以指定延迟逐字展示文本,适合叙事场景" }, + { title = "简单易用", desc = "一行命令即可运行" }, + { title = "跨平台", desc = "支持主流操作系统" }, + { title = "Rust 实现", desc = "高性能,内存安全" } +] +install = "cargo install reverberation 或从源码构建" +usage = [ + { cmd = "reverberation ", desc = "逐字显示文本文件" } +] +license = "MPL-2.0" +author = "S.A. (@snoware)" + +[[projects]] +name = "Mint Runtime" +slug = "mint" +description = "安全特性驱动的 Lua 运行时,支持 i18n、字节码验证与细粒度访问控制" +accent = "#7c4dff" +repo_url = "https://gitee.com/snoware/mint" +demo_url = "/softwares/mint/" +doc_url = "https://docs.rs/mintrt" +tags = ["Rust", "Lua", "Runtime", "Security", "i18n"] +features = [ + { title = "字节码验证", desc = "加载前验证 Lua 字节码,防止恶意代码注入" }, + { title = "细粒度访问控制", desc = "精确控制脚本可访问的系统资源" }, + { title = "i18n 支持", desc = "内置国际化,轻松适配多语言环境" }, + { title = "高性能", desc = "Rust 实现,低开销运行 Lua 脚本" }, + { title = "易集成", desc = "简洁 API,可快速嵌入到任何 Rust 项目" }, + { title = "动态加载", desc = "支持运行时动态加载和卸载脚本模块" } +] +install = "从 Gitee 获取源码构建,或查看 docs.rs/mintrt 文档" +license = "开源" +author = "S.A. (@snoware)" diff --git a/data/subjects.toml b/data/subjects.toml new file mode 100644 index 0000000..7ae9d30 --- /dev/null +++ b/data/subjects.toml @@ -0,0 +1,53 @@ +[[subjects]] +name = "语文" +password = "d1iq" +url = "https://snowcloud.lanzoum.com/b0zkfchxi" +color = "#e91e63" + +[[subjects]] +name = "数学" +password = "6rp9" +url = "https://snowcloud.lanzoum.com/b0zkf9u4j" +color = "#2196f3" + +[[subjects]] +name = "英语" +password = "4wxy" +url = "https://snowcloud.lanzoum.com/b0zkfchyj" +color = "#4caf50" + +[[subjects]] +name = "物理" +password = "4n48" +url = "https://snowcloud.lanzoum.com/b0zkf9u5a" +color = "#ff9800" + +[[subjects]] +name = "化学" +password = "kc1b" +url = "https://snowcloud.lanzoum.com/b0zkf9tyd" +color = "#9c27b0" + +[[subjects]] +name = "生物" +password = "dn3m" +url = "https://snowcloud.lanzoum.com/b0zkf9u0f" +color = "#00bcd4" + +[[subjects]] +name = "政治" +password = "4xej" +url = "https://snowcloud.lanzoum.com/b0zkf9u6b" +color = "#f44336" + +[[subjects]] +name = "历史" +password = "i757" +url = "https://snowcloud.lanzoum.com/b0zkf9u3i" +color = "#795548" + +[[subjects]] +name = "地理" +password = "dwrz" +url = "https://snowcloud.lanzoum.com/b0zkf9u2h" +color = "#009688" diff --git a/hugo.toml b/hugo.toml new file mode 100644 index 0000000..3f8b131 --- /dev/null +++ b/hugo.toml @@ -0,0 +1,18 @@ +baseURL = 'https://swe-iss.rth1.xyz/' +locale = 'zh-CN' +title = 'SNOWARE' +copyright = '© 2026 S.A. | SNOWARE' + +[params] + author = 'S.A.' + description = 'SNOWARE — S.A. 个人站点' + logo = '/logo.svg' + navLinks = [ + { name = '资源下载', url = '/res/', icon = 'download' }, + { name = '我的作品', url = '/softwares/', icon = 'code' }, + { name = 'B站空间', url = 'https://bilibili.com/1875249243', icon = 'play', external = true }, + { name = 'XAGuarder', url = '/xaguarder/', icon = 'shield' } + ] + +[markup.goldmark.renderer] + unsafe = true diff --git a/index.html b/index.html deleted file mode 100644 index 4c8b75b..0000000 --- a/index.html +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - S.A. MainPage - - - - - - - - - -
-
- -
SNOWARE
-
- - -
- - - - - - diff --git a/index.old.html b/index.old.html deleted file mode 100644 index 2e6e08a..0000000 --- a/index.old.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - S.A. Mainpage - - - -
- Logo Source:atomgit::user_head - 资源下载/n - Copyright(C) 2025 S.A. All rights received. -
- - - diff --git a/layouts/404.html b/layouts/404.html new file mode 100644 index 0000000..6ef7a98 --- /dev/null +++ b/layouts/404.html @@ -0,0 +1,11 @@ +{{ define "body" }} +
+
+ +

404

+

请求的页面未找到

+

请检查 URL 是否正确

+ 返回主页 +
+
+{{ end }} diff --git a/layouts/_default/baseof.html b/layouts/_default/baseof.html new file mode 100644 index 0000000..fa921f3 --- /dev/null +++ b/layouts/_default/baseof.html @@ -0,0 +1,21 @@ + + + + + + {{ if .IsHome }}{{ .Site.Title }}{{ else }}{{ .Title }} — {{ .Site.Title }}{{ end }} + + + {{ with .Params.accent }}{{ end }} + + {{ block "extra_head" . }}{{ end }} + + + {{ partial "nav.html" . }} +
+ {{ block "body" . }}{{ end }} +
+ {{ partial "footer.html" . }} + {{ block "extra_scripts" . }}{{ end }} + + diff --git a/layouts/_default/list.html b/layouts/_default/list.html new file mode 100644 index 0000000..5fe5422 --- /dev/null +++ b/layouts/_default/list.html @@ -0,0 +1,9 @@ +{{ define "body" }} +
+

{{ .Title }}

+ {{ with .Description }}

{{ . }}

{{ end }} +
+
+ {{ .Content }} +
+{{ end }} diff --git a/layouts/_default/single.html b/layouts/_default/single.html new file mode 100644 index 0000000..7b8a19b --- /dev/null +++ b/layouts/_default/single.html @@ -0,0 +1,9 @@ +{{ define "body" }} +
+

{{ .Title }}

+ {{ with .Params.subtitle }}

{{ . }}

{{ end }} +
+
+ {{ .Content }} +
+{{ end }} diff --git a/layouts/index.html b/layouts/index.html new file mode 100644 index 0000000..fa52cef --- /dev/null +++ b/layouts/index.html @@ -0,0 +1,22 @@ +{{ define "body" }} +
+ +
+
+ +
+

SNOWARE

+ +
+
+{{ end }} + +{{ define "extra_scripts" }} + +{{ end }} diff --git a/layouts/partials/footer.html b/layouts/partials/footer.html new file mode 100644 index 0000000..1181d41 --- /dev/null +++ b/layouts/partials/footer.html @@ -0,0 +1,5 @@ +
+
+

{{ .Site.Copyright }}

+
+
diff --git a/layouts/partials/nav.html b/layouts/partials/nav.html new file mode 100644 index 0000000..eca4048 --- /dev/null +++ b/layouts/partials/nav.html @@ -0,0 +1,13 @@ + diff --git a/layouts/partials/project-card.html b/layouts/partials/project-card.html new file mode 100644 index 0000000..e7e037e --- /dev/null +++ b/layouts/partials/project-card.html @@ -0,0 +1,12 @@ + +
+

{{ .name }}

+
+ {{ range .tags }}{{ . }}{{ end }} +
+
+

{{ .description }}

+ +
diff --git a/layouts/partials/subject-card.html b/layouts/partials/subject-card.html new file mode 100644 index 0000000..a75520b --- /dev/null +++ b/layouts/partials/subject-card.html @@ -0,0 +1,11 @@ + +
+ + + + + +
+

{{ .name }}

+

密码: {{ .password }}

+
diff --git a/layouts/res/filelist.html b/layouts/res/filelist.html new file mode 100644 index 0000000..8efd8a4 --- /dev/null +++ b/layouts/res/filelist.html @@ -0,0 +1,13 @@ +{{ define "body" }} +
+

学科资源列表

+

蓝奏云下载 · 点击学科即可跳转

+
+
+
+ {{ range hugo.Data.subjects.subjects }} + {{ partial "subject-card.html" . }} + {{ end }} +
+
+{{ end }} diff --git a/layouts/res/list.html b/layouts/res/list.html new file mode 100644 index 0000000..5f0a9bc --- /dev/null +++ b/layouts/res/list.html @@ -0,0 +1,34 @@ +{{ define "body" }} +
+

{{ .Title }}

+

{{ .Description }}

+
+
+
+

{{ .Content }}

+
+ + + +
+
+
📋
+

查漏补缺

+

针对性复习薄弱知识点

+
+
+
🔄
+

习题重练

+

反复练习巩固学习成果

+
+
+
📖
+

预习复习

+

提前预习,高效复习

+
+
+
+{{ end }} diff --git a/layouts/softwares/list.html b/layouts/softwares/list.html new file mode 100644 index 0000000..00347cc --- /dev/null +++ b/layouts/softwares/list.html @@ -0,0 +1,18 @@ +{{ define "body" }} +
+

{{ .Title }}

+

{{ .Description }}

+
+
+
+

S.A. (@snoware) — 开源爱好者,Rust / Ruby 开发者。致力于构建实用、安全、优雅的命令行工具与服务端软件。

+ Gitee 主页 +
+ +
+ {{ range hugo.Data.projects.projects }} + {{ partial "project-card.html" . }} + {{ end }} +
+
+{{ end }} diff --git a/layouts/softwares/single.html b/layouts/softwares/single.html new file mode 100644 index 0000000..20a8735 --- /dev/null +++ b/layouts/softwares/single.html @@ -0,0 +1,82 @@ +{{ define "body" }} +{{ $slug := .Params.project }} +{{ $matched := where hugo.Data.projects.projects "slug" $slug }} +{{ with index $matched 0 }} + +
+

{{ .name }}

+

{{ .description }}

+
+ +
+ + + + +
+ {{ range .features }} +
+

{{ .title }}

+

{{ .desc }}

+
+ {{ end }} +
+ + + {{ with .install }} +
+

安装

+
{{ . }}
+
+ {{ end }} + + + {{ with .usage }} +
+

使用

+
+ {{ range . }} +
+ {{ .cmd }} + {{ .desc }} +
+ {{ end }} +
+
+ {{ end }} + + + {{ with .license }} +
+

许可证

+

{{ . }}

+
+ {{ end }} + + + {{ if .has_drag_ball }} +
+ +

拖动小球试试 (¬‿¬)

+
+ {{ end }} +
+ +{{ end }} +{{ end }} + +{{ define "extra_scripts" }} +{{ $slug := .Params.project }} +{{ $matched := where hugo.Data.projects.projects "slug" $slug }} +{{ with index $matched 0 }} +{{ if .has_drag_ball }} + +{{ end }} +{{ end }} +{{ end }} diff --git a/layouts/xaguarder/list.html b/layouts/xaguarder/list.html new file mode 100644 index 0000000..68beb8b --- /dev/null +++ b/layouts/xaguarder/list.html @@ -0,0 +1,14 @@ +{{ define "body" }} +
+

{{ .Title }}

+

{{ .Description }}

+
+
+
+ +

XAGuarder

+

先占个位,XAGuarder 还要一段时间才能上线。当前已具备 IP、域名拦截能力。

+ 查看拦截页面预览 +
+
+{{ end }} diff --git a/layouts/xaguarder/warning.html b/layouts/xaguarder/warning.html new file mode 100644 index 0000000..8972a3c --- /dev/null +++ b/layouts/xaguarder/warning.html @@ -0,0 +1,17 @@ +{{ define "body" }} +
+
+ +

发现不良网站!

+

XAGuarder 保护了您。

+

如果这是正常的网站,请检查是否通过当地公安机关备案。

+ 返回主页 +
+
+{{ end }} + +{{ define "extra_head" }} + +{{ end }} diff --git a/projects.txt b/projects.txt deleted file mode 100644 index b2f675e..0000000 --- a/projects.txt +++ /dev/null @@ -1,31 +0,0 @@ -[[projects]] -name = "MineSentinel" -description = "Minecraft 服务器智能守护进程,TCP 端口检测 + 崩溃自动重启 + 防循环冷却期" -repo_url = "https://gitee.com/snoware/minesentinel" -demo_url = "https://swe-iss.rth1.xyz/softwares/minesentinel" -doc_url = "https://gitee.com/snoware/minesentinel/blob/master/DEPLOY.md" -tags = ["Ruby", "Minecraft", "Server", "Monitoring", "Daemon", "SNOWARE"] - -[[projects]] -name = "btcli" -description = "一款在线命令行翻译工具,支持中文及其他语言,配备TUI界面" -repo_url = "https://gitee.com/ironbayberry/btcli" -demo_url = "https://swe-iss.rth1.xyz/softwares/btcli" -doc_url = "https://docs.rs/btcli" -tags = ["Rust", "CLI", "Translation", "TUI", "SASWE"] - -[[projects]] -name = "Reverberation" -description = "Story teller, it's more lightweight than nano and more convenient to use than echo." -repo_url = "https://gitee.com/ironbayberry/reverberation" -demo_url = "https://swe-iss.rth1.xyz/softwares/reverberation" -doc_url = "https://docs.rs/reverberation" -tags = ["CLI", "Chinese", "open-source", "SASWE", "Rust"] - -[[projects]] -name = "Mint Runtime" -description = "Security-featured runtime for Lua with i18n support, bytecode verification, and fine-grained access control." -repo_url = "https://gitee.com/snoware/mint" -demo_url = "https://swe-iss.rth1.xyz/softwares/mint" -doc_url = "https://docs.rs/mintrt" -tags = ["CLI", "Chinese", "open-source", "SASWE", "Rust", "Lua", "Runtime", "Security", "i18n"] diff --git a/res/filelist.html b/res/filelist.html deleted file mode 100644 index 4e8f155..0000000 --- a/res/filelist.html +++ /dev/null @@ -1,355 +0,0 @@ - - - - - - [ISS] Filelist - - - -
-
-

学科文件

-

点击学科文件夹查看相关内容,下载源:蓝奏云

-
- -
-
- -
- -
- 页数: 1 / 3 -
-
- - -
- - - - - - diff --git a/res/index.html b/res/index.html deleted file mode 100644 index dd3f537..0000000 --- a/res/index.html +++ /dev/null @@ -1,208 +0,0 @@ - - - - - - SWE-ISS - - - -
-

一班_自学支持_资源下载

-

不是每位学生都可以在校内完成全部任务,当学业繁重时,这个页面或许会成为你查漏补缺的好帮手。注意:点击后需等待几秒,密码会自行解开

- - - -
-
-

查漏补缺

-

在课上放心紧跟老师思路,笔记可以慢慢补

-
-
-

习题重练

-

课上来不及,没做完的题可以现在练

-
-
-

预习复习

-

在未来,我有时间的话,老师们也可以把预习课件,提优资源放在这里,欲穷千里目,更上一层楼

-
-
-
- - - - diff --git a/res/indexold.html b/res/indexold.html deleted file mode 100644 index 79ed610..0000000 --- a/res/indexold.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - 下载您所需要的资源 - - -

仅自学使用

- 点此跳转 - - diff --git a/softwares/btcli/index.html b/softwares/btcli/index.html deleted file mode 100644 index 6957690..0000000 --- a/softwares/btcli/index.html +++ /dev/null @@ -1,688 +0,0 @@ - - - - - - - btcli - 命令行翻译工具 - - - - - -
- -
- -
- -
- -
-
-
-

btcli

-

一款在线命令行翻译工具,支持中文及其他语言,配备TUI界面

-
-
- - - - -
-
-

功能特性

-
-
-

命令行界面 (CLI)

-

支持丰富的命令行参数,可直接在终端中快速翻译,无需打开图形界面,提高工作效率

-
    -
  • 支持 -s/--source 指定源语言
  • -
  • 支持 -t/--target 指定目标语言
  • -
  • 支持 -h/--help 查看帮助信息
  • -
  • 支持 -v/--version 查看版本信息
  • -
-
-
-

文本用户界面 (TUI)

-

直观的文本用户界面,提供友好的交互体验,支持多窗口操作和实时翻译

-
    -
  • 支持多语言配置
  • -
  • 支持设置页面
  • -
  • 支持快捷键操作
  • -
  • 支持剪贴板功能
  • -
-
-
-

多语言支持

-

支持中文、英文及多种国际语言之间的互译,覆盖全球主要语系

-
    -
  • 自动检测源语言
  • -
  • 支持主流语种翻译
  • -
  • 持续添加新语言
  • -
  • 高质量翻译引擎
  • -
-
-
-

纯CLI模式

-

支持纯命令行操作,适合脚本集成和自动化任务,可无缝集成到各类工作流中

-
    -
  • 无头模式运行
  • -
  • 支持管道输入
  • -
  • 支持批处理操作
  • -
  • 适合CI/CD集成
  • -
-
-
-

安全可靠

-

采用百度翻译API,保障翻译质量和数据安全,本地配置文件加密存储

-
    -
  • API密钥本地存储
  • -
  • HTTPS加密传输
  • -
  • 无数据记录
  • -
  • 开源可验证
  • -
-
-
-

跨平台支持

-

基于Rust开发,支持Windows、macOS、Linux等多种操作系统

-
    -
  • Windows x86_64
  • -
  • Linux x86_64
  • -
  • macOS Intel/Apple Silicon
  • -
  • ARM架构支持
  • -
-
-
-
-
- -
-
-

安装

-
-
-

通过Cargo安装

-
cargo install btcli
-
-
-

从源码构建

-
git clone https://gitee.com/Ironbayberry/btcli.git
-cd btcli
-cargo build --release
-
-
-
-
- -
-
-

使用方法

-
-
-

基础翻译

-
btcli "Hello, world!"
-
-
-

指定语言

-
btcli -s en -t zh "Hello, world!"
-							(默认会保存到设置)
-
-
-

启动TUI界面

-
btcli
-
-
-

显示帮助

-
btcli --help
-
-
-
-
- -
-
-

关于项目

-

btcli是一个开源的命令行翻译工具,专为中文和其他语言的翻译而设计。项目采用Rust语言编写,注重性能和安全性。

-

作者: S.A. (@snoware)

-

许可证: MPL-2.0

-

项目主页: https://gitee.com/Ironbayberry/btcli

-
-
- - -
-
-
-
- - - - - - - - diff --git a/softwares/index.html b/softwares/index.html deleted file mode 100644 index c7278da..0000000 --- a/softwares/index.html +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - S.A. - 我的作品 - - - - -
- -
- -
-
-
-

S.A. - 我的作品

-

欢迎来到 S.A. 的开源项目展示页面

-
-
- -
-
-

我的作品

-
- -
-
-
--> - -
-
-

关于

-

这里展示了 S.A. (@snoware) 的个人作品集。所有项目都采用了现代化的技术栈。

-

欢迎访问我的 Gitee 个人主页 查看更多项目。

-
-
-
- -
-
-

© 2026 S.A. (@snoware). All rights reserved.

-
-
- - - - diff --git a/softwares/minesentinel/index.html b/softwares/minesentinel/index.html deleted file mode 100644 index 9851f37..0000000 --- a/softwares/minesentinel/index.html +++ /dev/null @@ -1,371 +0,0 @@ - - - - - - - Mint Runtime - 安全的 Lua 运行时 - - - - -
-
-
- - - - - - - - - - -
-

🍃 Mint Runtime

-

安全特性驱动的 Lua 运行时环境

-

开放 · 平等 · 共享

-
- - -
-
-
- -
-
-

🔒 安全保障

-

提供强大的安全隔离机制,支持字节码限制、环境修改防护、深度外部调用钩子等多层次安全特性,确保代码执行的安全性。

-
- -
-

⚡ 高性能

-

基于 Rust 构建,结合 Lua 5.5 的高性能引擎,通过 LTO 链接时优化和代码生成单元优化,提供卓越的执行效率。

-
- -
-

🌍 国际化支持

-

内置 i10n 国际化框架,支持多语言日志和输出翻译,让全球开发者都能轻松使用。

-
- -
-

📦 易于集成

-

简洁的 API 设计,完善的文档支持,可快速集成到您的项目中。支持 Cargo 包管理,一键安装使用。

-
- -
-

🛠️ 灵活配置

-

支持 RON 配置文件格式,可自定义运行时行为、安全策略、日志级别等参数,满足各种使用场景。

-
- -
-

📊 动态加载

-

支持模块动态加载和日志速率限制,提供更细粒度的控制和资源管理能力。

-
-
- -
- - 📖 查看文档 - ⭐ Gitee 源码 -
- - - - - -
- - - diff --git a/softwares/projects.txt b/softwares/projects.txt deleted file mode 100644 index b2f675e..0000000 --- a/softwares/projects.txt +++ /dev/null @@ -1,31 +0,0 @@ -[[projects]] -name = "MineSentinel" -description = "Minecraft 服务器智能守护进程,TCP 端口检测 + 崩溃自动重启 + 防循环冷却期" -repo_url = "https://gitee.com/snoware/minesentinel" -demo_url = "https://swe-iss.rth1.xyz/softwares/minesentinel" -doc_url = "https://gitee.com/snoware/minesentinel/blob/master/DEPLOY.md" -tags = ["Ruby", "Minecraft", "Server", "Monitoring", "Daemon", "SNOWARE"] - -[[projects]] -name = "btcli" -description = "一款在线命令行翻译工具,支持中文及其他语言,配备TUI界面" -repo_url = "https://gitee.com/ironbayberry/btcli" -demo_url = "https://swe-iss.rth1.xyz/softwares/btcli" -doc_url = "https://docs.rs/btcli" -tags = ["Rust", "CLI", "Translation", "TUI", "SASWE"] - -[[projects]] -name = "Reverberation" -description = "Story teller, it's more lightweight than nano and more convenient to use than echo." -repo_url = "https://gitee.com/ironbayberry/reverberation" -demo_url = "https://swe-iss.rth1.xyz/softwares/reverberation" -doc_url = "https://docs.rs/reverberation" -tags = ["CLI", "Chinese", "open-source", "SASWE", "Rust"] - -[[projects]] -name = "Mint Runtime" -description = "Security-featured runtime for Lua with i18n support, bytecode verification, and fine-grained access control." -repo_url = "https://gitee.com/snoware/mint" -demo_url = "https://swe-iss.rth1.xyz/softwares/mint" -doc_url = "https://docs.rs/mintrt" -tags = ["CLI", "Chinese", "open-source", "SASWE", "Rust", "Lua", "Runtime", "Security", "i18n"] diff --git a/softwares/reverberation/index.html b/softwares/reverberation/index.html deleted file mode 100644 index a22bda5..0000000 --- a/softwares/reverberation/index.html +++ /dev/null @@ -1,226 +0,0 @@ - - - - - - Reverberation - 轻量级文本阅读器 - - - -
-
-

Reverberation

-
轻量级文本阅读器,比nano更轻便,比echo更实用
-
- -
- -
-
- - - -
-
-

项目简介

-

Reverberation 是一款轻量级的命令行工具,可以逐字显示文本内容,并带有可配置的延迟时间。它设计简洁,易于使用,适合展示文本内容或逐步阅读文本。

-
- -
-

功能特性

-
    -
  • 逐字显示文本内容
  • -
  • 可配置字符显示间隔时间
  • -
  • 轻量级设计,资源占用少
  • -
  • 简单易用的命令行界面
  • -
  • 支持任意文本文件格式
  • -
-
- -
-

使用方法

-

在命令行中运行以下命令:

-
- reverberation <filename> <delay_ms> -
- -
    -
  • filename: 要逐字显示的文本文件
  • -
  • delay_ms: 每个字符之间的延迟时间(毫秒)
  • -
- -

获取帮助信息:

-
- reverberation --help -
-
- -
-

构建方法

-

使用 Cargo 构建发布版本:

-
- cargo build --release -
-
-
-

安装方法

-

使用 Cargo 一键安装:

-
- cargo install reverberation -
-
- -
-

许可证

-

此项目采用 Mozilla Public License Version 2.0 许可证。

-

完整的许可证文本可在项目根目录下的 LICENSE 文件中找到。

-
-
- -
- Designed by S.A. | (C) SNOWARE 2026 -
-
- - diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..16820ef --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,454 @@ +/* ===== SNOWARE Unified Dark Theme ===== */ + +:root { + --bg-deep: #060612; + --bg-card: rgba(15, 25, 55, 0.6); + --bg-glass: rgba(20, 35, 70, 0.35); + --accent: #4fc3f7; + --accent-alt: #7c4dff; + --text: #e8eaf6; + --text-muted: #90a4ae; + --radius: 12px; + --font: 'Segoe UI', system-ui, -apple-system, sans-serif; + --transition: 0.3s ease; +} + +*, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; } + +html { scroll-behavior: smooth; } + +body { + font-family: var(--font); + background: var(--bg-deep); + color: var(--text); + min-height: 100vh; + display: flex; + flex-direction: column; + line-height: 1.6; +} + +.container { max-width: 960px; margin: 0 auto; padding: 0 24px; } + +/* ===== Navigation ===== */ +.site-nav { + position: sticky; + top: 0; + z-index: 100; + background: rgba(6, 6, 18, 0.85); + backdrop-filter: blur(12px); + border-bottom: 1px solid rgba(79, 195, 247, 0.1); + padding: 12px 0; +} +.nav-inner { + display: flex; + align-items: center; + justify-content: space-between; +} +.nav-brand { + display: flex; + align-items: center; + gap: 10px; + color: var(--text); + font-weight: 700; + font-size: 18px; + text-decoration: none; +} +.nav-logo { border-radius: 50%; } +.nav-links { display: flex; gap: 20px; } +.nav-links a { + color: var(--text-muted); + text-decoration: none; + font-size: 14px; + transition: color var(--transition); + position: relative; +} +.nav-links a:hover { color: var(--accent); } +.nav-links a::after { + content: ''; + position: absolute; + bottom: -4px; + left: 0; + width: 0; + height: 2px; + background: var(--accent); + transition: width var(--transition); +} +.nav-links a:hover::after { width: 100%; } + +/* ===== Homepage ===== */ +#star-canvas-wrap { + position: relative; + min-height: 100vh; + display: flex; + align-items: center; + justify-content: center; +} +#star-canvas { + position: absolute; + inset: 0; + width: 100%; + height: 100%; +} +.home-overlay { + position: relative; + z-index: 2; + text-align: center; + padding: 40px 20px; +} +.logo-wrap { + position: relative; + display: inline-block; + margin-bottom: 20px; +} +.logo-wrap::before { + content: ''; + position: absolute; + inset: -8px; + border-radius: 50%; + background: radial-gradient(circle, rgba(79,195,247,0.25), transparent 70%); +} +.home-logo { + border-radius: 50%; + border: 2px solid rgba(79,195,247,0.5); + background: rgba(15,25,55,0.6); + backdrop-filter: blur(8px); +} +.home-title { + font-size: 48px; + font-weight: 800; + letter-spacing: 8px; + color: var(--accent); + text-shadow: 0 0 30px rgba(79,195,247,0.4), 0 0 60px rgba(79,195,247,0.2); + margin-bottom: 32px; +} +.home-nav { + display: flex; + flex-wrap: wrap; + gap: 14px; + justify-content: center; +} +.home-btn { + display: inline-block; + padding: 12px 28px; + border-radius: 50px; + background: var(--bg-glass); + border: 1px solid rgba(79,195,247,0.3); + color: var(--text); + text-decoration: none; + font-size: 15px; + font-weight: 500; + transition: all var(--transition); + backdrop-filter: blur(8px); +} +.home-btn:hover { + background: rgba(79,195,247,0.15); + border-color: var(--accent); + transform: translateY(-2px); + box-shadow: 0 4px 20px rgba(79,195,247,0.2); +} + +/* ===== Page Hero ===== */ +.page-hero { + text-align: center; + padding: 80px 24px 40px; + background: linear-gradient(180deg, rgba(6,6,18,0) 0%, rgba(6,6,18,1) 100%); +} +.page-hero h1 { + font-size: 40px; + font-weight: 800; + color: var(--accent); + text-shadow: 0 0 20px color-mix(in srgb, var(--accent) 30%, transparent); + margin-bottom: 8px; +} +.page-hero .subtitle { + color: var(--text-muted); + font-size: 18px; +} + +/* ===== Page Content ===== */ +.page-content { padding: 20px 24px 60px; } + +/* ===== Buttons ===== */ +.btn { + display: inline-block; + padding: 10px 24px; + border-radius: 8px; + font-size: 15px; + font-weight: 500; + text-decoration: none; + transition: all var(--transition); + cursor: pointer; + border: 1px solid transparent; +} +.btn-primary { + background: var(--accent); + color: #0a0a2e; + border-color: var(--accent); +} +.btn-primary:hover { opacity: 0.85; transform: translateY(-1px); } +.btn-accent { + background: color-mix(in srgb, var(--accent) 20%, var(--bg-card)); + color: var(--accent); + border-color: color-mix(in srgb, var(--accent) 40%, transparent); +} +.btn-accent:hover { background: color-mix(in srgb, var(--accent) 30%, var(--bg-card)); } +.btn-outline { + background: transparent; + color: var(--text-muted); + border-color: rgba(144,164,174,0.3); +} +.btn-outline:hover { border-color: var(--text-muted); color: var(--text); } +.btn-lg { padding: 14px 32px; font-size: 17px; } + +/* ===== Glass Cards ===== */ +.feature-card { + background: var(--bg-glass); + border: 1px solid rgba(79,195,247,0.1); + border-radius: var(--radius); + padding: 24px; + text-align: center; + backdrop-filter: blur(8px); + transition: border-color var(--transition); +} +.feature-card:hover { border-color: rgba(79,195,247,0.3); } +.feature-card h3 { color: var(--accent); margin-bottom: 8px; } +.feature-card p { color: var(--text-muted); font-size: 14px; } +.feature-icon { font-size: 32px; margin-bottom: 12px; } + +/* ===== Resources Section ===== */ +.res-intro { + text-align: center; + margin-bottom: 32px; +} +.res-intro-text { color: var(--text); font-size: 16px; } +.res-intro-note { color: var(--text-muted); font-size: 14px; margin-top: 8px; } +.res-actions { + display: flex; + gap: 16px; + justify-content: center; + margin-bottom: 40px; + flex-wrap: wrap; +} +.res-features { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20px; + margin-top: 32px; +} + +/* ===== File List ===== */ +.filelist-grid { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 20px; +} +.subject-card { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; + padding: 28px 20px; + background: var(--bg-glass); + border: 1px solid color-mix(in srgb, var(--color) 25%, transparent); + border-radius: var(--radius); + text-decoration: none; + color: var(--text); + backdrop-filter: blur(8px); + transition: all var(--transition); +} +.subject-card:hover { + border-color: var(--color); + transform: translateY(-3px); + box-shadow: 0 8px 24px color-mix(in srgb, var(--color) 15%, transparent); +} +.subject-icon { color: var(--color); } +.subject-card h3 { font-size: 18px; } +.subject-pw { font-size: 13px; color: var(--text-muted); } +.subject-pw code { + background: rgba(255,255,255,0.08); + padding: 2px 8px; + border-radius: 4px; + color: var(--color); +} + +/* ===== Software Section ===== */ +.about-intro { + text-align: center; + margin-bottom: 40px; + padding: 24px; + background: var(--bg-glass); + border-radius: var(--radius); +} +.about-intro p { color: var(--text-muted); margin-bottom: 16px; } +.project-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 24px; +} +.project-card { + display: flex; + flex-direction: column; + gap: 12px; + padding: 28px; + background: var(--bg-glass); + border: 1px solid color-mix(in srgb, var(--accent) 20%, transparent); + border-radius: var(--radius); + text-decoration: none; + color: var(--text); + backdrop-filter: blur(8px); + transition: all var(--transition); +} +.project-card:hover { + border-color: var(--accent); + transform: translateY(-3px); + box-shadow: 0 8px 30px color-mix(in srgb, var(--accent) 12%, transparent); +} +.card-header { display: flex; justify-content: space-between; align-items: flex-start; } +.card-header h3 { font-size: 20px; color: var(--accent); } +.card-tags { display: flex; gap: 6px; flex-wrap: wrap; } +.tag { + font-size: 11px; + padding: 3px 10px; + border-radius: 50px; + background: color-mix(in srgb, var(--accent) 15%, var(--bg-card)); + color: var(--accent); + border: 1px solid color-mix(in srgb, var(--accent) 30%, transparent); +} +.card-desc { color: var(--text-muted); font-size: 14px; } +.card-links { margin-top: auto; } +.card-link { font-size: 14px; color: var(--accent); } + +/* ===== Software Detail ===== */ +.sw-links { + display: flex; + gap: 12px; + justify-content: center; + margin-bottom: 40px; + flex-wrap: wrap; +} +.sw-features { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 16px; + margin-bottom: 40px; +} +.sw-section { + margin-bottom: 32px; + padding: 24px; + background: var(--bg-glass); + border-radius: var(--radius); +} +.sw-section h2 { + color: var(--accent); + margin-bottom: 12px; + font-size: 22px; +} +.sw-code { + background: rgba(255,255,255,0.06); + padding: 12px 18px; + border-radius: 8px; + font-family: 'Cascadia Code', 'Fira Code', monospace; + font-size: 14px; + overflow-x: auto; +} +.usage-list { display: flex; flex-direction: column; gap: 12px; } +.usage-item { + display: flex; + gap: 12px; + align-items: center; +} +.usage-item code { + background: rgba(255,255,255,0.06); + padding: 6px 12px; + border-radius: 6px; + font-family: 'Cascadia Code', 'Fira Code', monospace; + font-size: 13px; + white-space: nowrap; +} +.usage-item span { color: var(--text-muted); } + +/* ===== Drag Ball ===== */ +.drag-ball-area { + text-align: center; + padding: 24px; + margin: 40px 0; + background: var(--bg-glass); + border-radius: var(--radius); +} +.drag-hint { color: var(--text-muted); font-size: 14px; margin-top: 8px; } + +/* ===== XAGuarder ===== */ +.xag-intro { + text-align: center; + padding: 40px; + background: var(--bg-glass); + border-radius: var(--radius); + max-width: 600px; + margin: 0 auto; +} +.xag-logo { border-radius: 50%; margin-bottom: 16px; } +.xag-intro h2 { margin-bottom: 16px; color: var(--accent); } +.xag-intro p { color: var(--text-muted); margin-bottom: 20px; } + +/* ===== Warning Page ===== */ +.warning-page { + min-height: 80vh; + display: flex; + align-items: center; + justify-content: center; +} +.warning-content { + text-align: center; + padding: 60px; + background: rgba(244,67,54,0.08); + border: 2px solid rgba(244,67,54,0.3); + border-radius: var(--radius); + max-width: 500px; +} +.warning-logo { border-radius: 50%; margin-bottom: 20px; } +.warning-content h1 { color: #f44336; font-size: 28px; margin-bottom: 16px; } +.warning-text { font-size: 18px; color: var(--text); margin-bottom: 8px; } +.warning-sub { color: var(--text-muted); font-size: 14px; margin-bottom: 24px; } + +/* ===== Error Page ===== */ +.error-page { + min-height: 80vh; + display: flex; + align-items: center; + justify-content: center; +} +.error-content { text-align: center; } +.error-logo { border-radius: 50%; margin-bottom: 20px; } +.error-content h1 { font-size: 72px; color: var(--accent); margin-bottom: 12px; } +.error-content p { color: var(--text-muted); } +.error-hint { font-size: 14px; margin-bottom: 24px; } + +/* ===== Footer ===== */ +.site-footer { + text-align: center; + padding: 24px; + border-top: 1px solid rgba(79,195,247,0.08); + color: var(--text-muted); + font-size: 13px; + margin-top: auto; +} + +/* ===== Responsive ===== */ +@media (max-width: 768px) { + .nav-inner { flex-direction: column; gap: 12px; } + .nav-links { gap: 12px; } + .home-title { font-size: 32px; letter-spacing: 4px; } + .home-logo { width: 140px; height: 140px; } + .home-nav { gap: 10px; } + .home-btn { padding: 10px 22px; font-size: 14px; } + .page-hero h1 { font-size: 28px; } + .project-grid { grid-template-columns: 1fr; } + .filelist-grid { grid-template-columns: repeat(2, 1fr); } + .res-features, .sw-features { grid-template-columns: 1fr 1fr; } +} + +@media (max-width: 480px) { + .filelist-grid { grid-template-columns: 1fr; } + .res-features, .sw-features { grid-template-columns: 1fr; } + .sw-links { flex-direction: column; align-items: center; } +} diff --git a/static/js/drag-ball.js b/static/js/drag-ball.js new file mode 100644 index 0000000..f49d06b --- /dev/null +++ b/static/js/drag-ball.js @@ -0,0 +1,77 @@ +(function () { + const canvas = document.getElementById('drag-ball'); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + const W = 200, H = 200; + canvas.width = W; + canvas.height = H; + + let ballX = W / 2, ballY = H / 2; + let dragging = false; + let offsetX = 0, offsetY = 0; + + function drawBall() { + ctx.clearRect(0, 0, W, H); + const r = 30; + const grad = ctx.createRadialGradient(ballX, ballY, 0, ballX, ballY, r); + grad.addColorStop(0, '#ffb300'); + grad.addColorStop(1, '#ff6f00'); + ctx.beginPath(); + ctx.arc(ballX, ballY, r, 0, Math.PI * 2); + ctx.fillStyle = grad; + ctx.fill(); + ctx.fillStyle = '#fff'; + ctx.font = '14px sans-serif'; + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillText('(¬‿¬)', ballX, ballY); + } + + function getPos(e) { + const rect = canvas.getBoundingClientRect(); + const scaleX = W / rect.width; + const scaleY = H / rect.height; + if (e.touches) { + return { + x: (e.touches[0].clientX - rect.left) * scaleX, + y: (e.touches[0].clientY - rect.top) * scaleY + }; + } + return { + x: (e.clientX - rect.left) * scaleX, + y: (e.clientY - rect.top) * scaleY + }; + } + + canvas.addEventListener('mousedown', (e) => { + const pos = getPos(e); + const dist = Math.hypot(pos.x - ballX, pos.y - ballY); + if (dist < 30) { dragging = true; offsetX = pos.x - ballX; offsetY = pos.y - ballY; } + }); + canvas.addEventListener('touchstart', (e) => { + e.preventDefault(); + const pos = getPos(e); + const dist = Math.hypot(pos.x - ballX, pos.y - ballY); + if (dist < 30) { dragging = true; offsetX = pos.x - ballX; offsetY = pos.y - ballY; } + }, { passive: false }); + + window.addEventListener('mousemove', (e) => { + if (!dragging) return; + const pos = getPos(e); + ballX = Math.max(30, Math.min(W - 30, pos.x - offsetX)); + ballY = Math.max(30, Math.min(H - 30, pos.y - offsetY)); + drawBall(); + }); + window.addEventListener('touchmove', (e) => { + if (!dragging) return; + const pos = getPos(e); + ballX = Math.max(30, Math.min(W - 30, pos.x - offsetX)); + ballY = Math.max(30, Math.min(H - 30, pos.y - offsetY)); + drawBall(); + }); + + window.addEventListener('mouseup', () => { dragging = false; }); + window.addEventListener('touchend', () => { dragging = false; }); + + drawBall(); +})(); diff --git a/static/js/stars.js b/static/js/stars.js new file mode 100644 index 0000000..d8dfccf --- /dev/null +++ b/static/js/stars.js @@ -0,0 +1,68 @@ +(function () { + const canvas = document.getElementById('star-canvas'); + if (!canvas) return; + const ctx = canvas.getContext('2d'); + let w, h; + + function resize() { + w = canvas.width = canvas.parentElement.clientWidth; + h = canvas.height = canvas.parentElement.clientHeight; + } + resize(); + window.addEventListener('resize', resize); + + const STAR_COUNT = 300; + const colors = ['#ffffff', '#e0f7fa', '#fff9c4', '#fce4ec', '#4fc3f7']; + const stars = []; + + for (let i = 0; i < STAR_COUNT; i++) { + stars.push({ + x: Math.random() * w, + y: Math.random() * h, + baseR: Math.random() * 1.5 + 0.3, + phase: Math.random() * Math.PI * 2, + speed: Math.random() * 0.02 + 0.005, + color: colors[Math.floor(Math.random() * colors.length)], + glow: Math.random() > 0.7 + }); + } + + function draw() { + ctx.clearRect(0, 0, w, h); + const t = performance.now() * 0.001; + + for (const s of stars) { + const r = s.baseR + Math.sin(t * s.speed * 10 + s.phase) * s.baseR * 0.6; + const alpha = 0.4 + Math.sin(t * s.speed * 8 + s.phase) * 0.35; + + ctx.globalAlpha = Math.max(0.1, alpha); + ctx.beginPath(); + ctx.arc(s.x, s.y, Math.max(0.1, r), 0, Math.PI * 2); + ctx.fillStyle = s.color; + ctx.fill(); + + if (s.glow) { + const gr = ctx.createRadialGradient(s.x, s.y, 0, s.x, s.y, r * 3); + gr.addColorStop(0, s.color); + gr.addColorStop(1, 'transparent'); + ctx.globalAlpha = alpha * 0.15; + ctx.beginPath(); + ctx.arc(s.x, s.y, r * 3, 0, Math.PI * 2); + ctx.fillStyle = gr; + ctx.fill(); + } + } + ctx.globalAlpha = 1; + requestAnimationFrame(draw); + } + + draw(); + + // reposition on resize + window.addEventListener('resize', () => { + for (const s of stars) { + s.x = (s.x / w) * canvas.width; + s.y = (s.y / h) * canvas.height; + } + }); +})(); diff --git a/static/logo.svg b/static/logo.svg new file mode 100644 index 0000000..37cbf1c --- /dev/null +++ b/static/logo.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + S.A. +