diff --git a/messages/en.json b/messages/en.json
index 5f4dc28..a45f9c2 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -1,11 +1,18 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"nav_homepage": "Homepage",
+ "nav_download": "Download",
"nav_packages": "Packages",
+ "nav_wiki": "Wiki",
+ "foot_social": "Social",
+ "homepage_slogan": "Modern, fast and secure operating system.",
+ "homepage_slogan_detailed": "SemiOS is a general purposed operating system with redesigned system components that strive to be fast, secure and flexible.\n\nIt is available for a variety of platforms, from desktop PCs to embedded boards.",
+ "homepage_get": "Get SemiOS",
"packages_search_title": "Search Packages",
"packages_mirror_select": "Select an Mirror",
+ "packages_repo_select": "Select an Repository",
"packages_search_keyword": "Keyword",
- "packages_arch_select": "Architecture",
+ "packages_arch_select": "Filtering Architecture",
"packages_show_latest_only": "Show latest only",
"packages_search_action": "Search",
"packages_name": "Package Name",
@@ -14,16 +21,36 @@
"pkginfo_version": "Version",
"pkginfo_arch": "Architecture",
"pkginfo_installed_size": "Installed Size",
+ "pkginfo_install_title": "Install Package",
+ "pkginfo_install_download": "Download File",
+ "pkginfo_install_packie_prompt_terminal": "To install this package via Packie in the default environment, execute the following command in the terminal:",
+ "pkginfo_install_packie_pasted": "Command pasted!",
"pkginfo_download_size": "Download Size",
- "pkginfo_download_title": "Download Package",
"pkginfo_download_action": "Download",
"pkginfo_download_filename": "Download Filename",
+ "pkginfo_download_checksum": "File Checksum",
"pkginfo_dependency_title": "Dependencies",
"pkginfo_dependency_description": "This will list the dependencies and recommended packages for this package.",
"pkginfo_dependency_pkgspec": "Package Specification",
"pkginfo_dependency_type": "Type",
"pkginfo_dependency_type_required": "Required",
"pkginfo_dependency_type_recommended": "Recommended",
- "homepage_slogan": "The innovative operating system for the next generation of computing.",
- "homepage_get": "Get SemiOS"
+ "pkginfo_maintainers": "Maintainers",
+ "download_iso_image": "Get ISO Image",
+ "download_iso_image_description": "Select and get the latest LiveCD images for general devices, like workstations and servers.",
+ "download_iso_arch": "Architecture",
+ "download_iso_image_ty": "Image Type",
+ "download_iso_manual": "Wondering how to install it? Click ",
+ "download_now": "Download Now",
+ "download_mirrors_title": "Mirrors",
+ "download_mirrors_description": "Maybe choosing a mirror site manually speeds up your download.",
+ "download_mirrors_region": "Region",
+ "download_mirrors_server": "Server",
+ "download_mirrors_access": "Access",
+ "download_container_title": "Running SemiOS in a Container",
+ "download_container_direct_deploy": "Deploy Directly",
+ "download_container_arch": "Architecture",
+ "download_embedded_title": "Embedded Devices",
+ "download_embedded_text": "To install SemiOS on an embedded device (e.g. demo boards), view our wiki to see supported devices and flashing guides.",
+ "download_embedded_go": "Go to the Wiki Page"
}
diff --git a/messages/ja.json b/messages/ja.json
index fe051b4..438a215 100644
--- a/messages/ja.json
+++ b/messages/ja.json
@@ -1,9 +1,16 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"nav_homepage": "ホームページ",
+ "nav_download": "ダウンロード",
"nav_packages": "パッケージ",
+ "nav_wiki": "ウィキ",
+ "foot_social": "ソーシャル",
+ "homepage_slogan": "現代的で、高速かつ安全なオペレーティングシステム。",
+ "homepage_slogan_detailed": "SemiOSは、高速性・安全性・柔軟性を追求して再設計されたシステムコンポーネントを備えた、汎用オペレーティングシステムです。\n\nデスクトップPCから組み込みボードまで、多様なプラットフォームで利用可能です。",
+ "homepage_get": "SemiOS を入手",
"packages_search_title": "パッケージを検索",
"packages_mirror_select": "ミラーを選択",
+ "packages_repo_select": "リポジトリを選択",
"packages_search_keyword": "キーワード",
"packages_arch_select": "アーキテクチャ",
"packages_show_latest_only": "最新のみ表示",
@@ -14,16 +21,36 @@
"pkginfo_version": "バージョン",
"pkginfo_arch": "アーキテクチャ",
"pkginfo_installed_size": "インストールサイズ",
+ "pkginfo_install_title": "インストール",
+ "pkginfo_install_download": "ファイルをダウンロード",
+ "pkginfo_install_packie_prompt_terminal": "このパッケージをPackieを使ってデフォルト環境にインストールするには、ターミナルで以下のコマンドを実行してください:",
+ "pkginfo_install_packie_pasted": "コマンドを貼り付けました!",
"pkginfo_download_size": "ダウンロードサイズ",
- "pkginfo_download_title": "パッケージをダウンロード",
"pkginfo_download_action": "ダウンロード",
"pkginfo_download_filename": "ダウンロードファイル名",
+ "pkginfo_download_checksum": "チェックサム値",
"pkginfo_dependency_title": "依存関係",
"pkginfo_dependency_description": "これにより、このパッケージの依存関係と推奨パッケージが一覧表示されます。",
"pkginfo_dependency_pkgspec": "パッケージ仕様",
"pkginfo_dependency_type": "タイプ",
"pkginfo_dependency_type_required": "必須",
"pkginfo_dependency_type_recommended": "推奨",
- "homepage_slogan": "次世代コンピューティングのための革新的なオペレーティングシステム。",
- "homepage_get": "SemiOS を入手"
+ "pkginfo_maintainers": "メンテナー",
+ "download_iso_image": "ISO イメージを入手",
+ "download_iso_image_description": "ワークステーションやサーバーなどの一般デバイス向けの最新 LiveCD イメージを選択して入手してください。",
+ "download_iso_arch": "アーキテクチャ",
+ "download_iso_image_ty": "イメージタイプ",
+ "download_iso_manual": "インストール方法がわからない場合は、クリック ",
+ "download_now": "今すぐ入手",
+ "download_mirrors_title": "ミラー",
+ "download_mirrors_description": "手動でミラーサイトを選択すると、ダウンロードが高速化される場合があります。",
+ "download_mirrors_region": "リージョン",
+ "download_mirrors_server": "サーバー",
+ "download_mirrors_access": "アクセス",
+ "download_container_title": "コンテナでSemiOSを実行する",
+ "download_container_direct_deploy": "直接デプロイ",
+ "download_container_arch": "アーキテクチャ",
+ "download_embedded_title": "組み込みデバイス",
+ "download_embedded_text": "組み込みデバイス(例:デモボード)にSemiOSをインストールするには、ウィキを参照して、サポートされているデバイスとフラッシュ書き込みガイドをご確認ください。",
+ "download_embedded_go": "ウィキページへ進む"
}
diff --git a/messages/zh-cn.json b/messages/zh-cn.json
index c1d00cf..ecc9841 100644
--- a/messages/zh-cn.json
+++ b/messages/zh-cn.json
@@ -1,11 +1,18 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"nav_homepage": "首页",
+ "nav_download": "下载",
"nav_packages": "软件包",
+ "nav_wiki": "文档",
+ "foot_social": "社交媒体",
+ "homepage_slogan": "现代、快速、安全的操作系统。",
+ "homepage_slogan_detailed": "SemiOS 是一款通用操作系统,其系统组件经过重新设计,力求实现高速、安全与灵活。\n\n从桌面电脑到嵌入式开发板,它支持多种平台。",
+ "homepage_get": "获取 SemiOS",
"packages_search_title": "搜索软件包",
"packages_mirror_select": "选择镜像站",
+ "packages_repo_select": "选择仓库",
"packages_search_keyword": "关键字",
- "packages_arch_select": "架构",
+ "packages_arch_select": "筛选架构",
"packages_show_latest_only": "仅显示最新版",
"packages_search_action": "搜索",
"packages_name": "软件包名称",
@@ -14,16 +21,36 @@
"pkginfo_version": "版本",
"pkginfo_arch": "架构",
"pkginfo_installed_size": "安装大小",
+ "pkginfo_install_title": "安装软件包",
+ "pkginfo_install_download": "下载文件",
+ "pkginfo_install_packie_prompt_terminal": "要通过Packie在默认环境中安装此软件包,请在终端中执行以下命令:",
+ "pkginfo_install_packie_pasted": "内容已复制!",
"pkginfo_download_size": "下载大小",
- "pkginfo_download_title": "下载软件包",
"pkginfo_download_action": "立即下载",
"pkginfo_download_filename": "下载文件名",
+ "pkginfo_download_checksum": "文件校验码",
"pkginfo_dependency_title": "依赖关系",
"pkginfo_dependency_description": "这里将会列举出此包依赖和建议安装的包。",
"pkginfo_dependency_pkgspec": "软件包",
"pkginfo_dependency_type": "类型",
"pkginfo_dependency_type_required": "必需",
"pkginfo_dependency_type_recommended": "建议",
- "homepage_slogan": "面向下一代计算的创新操作系统。",
- "homepage_get": "获取 SemiOS"
+ "pkginfo_maintainers": "维护者",
+ "download_iso_image": "获取 ISO 镜像",
+ "download_iso_image_description": "选择并获取适用于工作站和服务器等通用设备的最新版本 LiveCD 镜像。",
+ "download_iso_arch": "架构",
+ "download_iso_image_ty": "镜像类型",
+ "download_iso_manual": "想要获取安装指南?点击 ",
+ "download_now": "立即下载",
+ "download_mirrors_title": "镜像站",
+ "download_mirrors_description": "有时手动选择一个镜像站可能提高下载软件的速度。",
+ "download_mirrors_region": "地区",
+ "download_mirrors_server": "服务器",
+ "download_mirrors_access": "访问镜像站",
+ "download_container_title": "在容器中运行 SemiOS",
+ "download_container_direct_deploy": "直接部署",
+ "download_container_arch": "架构",
+ "download_embedded_title": "嵌入式设备",
+ "download_embedded_text": "要在嵌入式设备(例如演示板)上安装SemiOS,请查看我们的维基页面,了解支持的设备和烧录指南。",
+ "download_embedded_go": "前往维基页面"
}
diff --git a/package-lock.json b/package-lock.json
index b77e64d..b445532 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,7 +17,7 @@
"@fontsource-variable/inter": "^5.3.0",
"@inlang/paraglide-js": "^2.18.2",
"@internationalized/date": "^3.12.3",
- "@lucide/svelte": "^1.29.0",
+ "@lucide/svelte": "^1.31.0",
"@storybook/addon-a11y": "^10.5.7",
"@storybook/addon-docs": "^10.5.7",
"@storybook/addon-svelte-csf": "latest",
@@ -49,6 +49,7 @@
"storybook": "^10.5.7",
"svelte": "^5.56.1",
"svelte-check": "^4.6.0",
+ "svelte-sonner": "^1.2.1",
"tailwind-merge": "^3.6.0",
"tailwind-variants": "^3.3.1",
"tailwindcss": "^4.3.0",
@@ -1033,9 +1034,9 @@
"license": "Apache-2.0"
},
"node_modules/@lucide/svelte": {
- "version": "1.29.0",
- "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-1.29.0.tgz",
- "integrity": "sha512-qzpfzxG8WZiAnyjh1qaQCtG4MA5R6HOyvb3c+LezexgFf69ptBdK3PjvGYGCWHKgTIVZMsOU9fqfczjsZAJl0A==",
+ "version": "1.31.0",
+ "resolved": "https://registry.npmjs.org/@lucide/svelte/-/svelte-1.31.0.tgz",
+ "integrity": "sha512-pgPuLEJdF0UpsajG9eSw0YvqXVuDxB+/x58BRiC4xE/KEHiopOqT1id3KCUvRN/PUmQkN1F26sslcs/1jutlBQ==",
"dev": true,
"license": "ISC",
"peerDependencies": {
@@ -6558,6 +6559,36 @@
"node": ">=4"
}
},
+ "node_modules/svelte-sonner": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-1.2.1.tgz",
+ "integrity": "sha512-N00LOWb60fjKXULbpngku+7E9Krb16KpNq4/Eax5Vu7o1Dpbca55QpaLPsB+yp82JIEdFhfJuv5cVXLoe0ZtVA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "runed": "^0.28.0"
+ },
+ "peerDependencies": {
+ "svelte": "^5.0.0"
+ }
+ },
+ "node_modules/svelte-sonner/node_modules/runed": {
+ "version": "0.28.0",
+ "resolved": "https://registry.npmjs.org/runed/-/runed-0.28.0.tgz",
+ "integrity": "sha512-k2xx7RuO9hWcdd9f+8JoBeqWtYrm5CALfgpkg2YDB80ds/QE4w0qqu34A7fqiAwiBBSBQOid7TLxwxVC27ymWQ==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/huntabyte",
+ "https://github.com/sponsors/tglide"
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "esm-env": "^1.0.0"
+ },
+ "peerDependencies": {
+ "svelte": "^5.7.0"
+ }
+ },
"node_modules/svelte-toolbelt": {
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.7.1.tgz",
diff --git a/package.json b/package.json
index 470513a..d1a4084 100644
--- a/package.json
+++ b/package.json
@@ -21,7 +21,7 @@
"@fontsource-variable/inter": "^5.3.0",
"@inlang/paraglide-js": "^2.18.2",
"@internationalized/date": "^3.12.3",
- "@lucide/svelte": "^1.29.0",
+ "@lucide/svelte": "^1.31.0",
"@storybook/addon-a11y": "^10.5.7",
"@storybook/addon-docs": "^10.5.7",
"@storybook/addon-svelte-csf": "latest",
@@ -53,6 +53,7 @@
"storybook": "^10.5.7",
"svelte": "^5.56.1",
"svelte-check": "^4.6.0",
+ "svelte-sonner": "^1.2.1",
"tailwind-merge": "^3.6.0",
"tailwind-variants": "^3.3.1",
"tailwindcss": "^4.3.0",
diff --git a/src/components/Pagefoot.svelte b/src/components/Pagefoot.svelte
new file mode 100644
index 0000000..1ea3c8c
--- /dev/null
+++ b/src/components/Pagefoot.svelte
@@ -0,0 +1,27 @@
+
+
+
+
+
diff --git a/src/components/Topbar.svelte b/src/components/Topbar.svelte
index 1fd3fce..06cfc39 100644
--- a/src/components/Topbar.svelte
+++ b/src/components/Topbar.svelte
@@ -3,6 +3,7 @@
import { Label } from "$lib/components/ui/label/index.js";
import * as m from "$lib/paraglide/messages";
+ import { resolve } from '$app/paths';
@@ -16,10 +17,22 @@
-
+
{m.nav_packages()}
+
+
+
+ {m.nav_download()}
+
+
+
+
+
+ {m.nav_wiki()}
+
+
diff --git a/src/lib/components/ui/avatar/avatar-badge.svelte b/src/lib/components/ui/avatar/avatar-badge.svelte
new file mode 100644
index 0000000..2df847a
--- /dev/null
+++ b/src/lib/components/ui/avatar/avatar-badge.svelte
@@ -0,0 +1,26 @@
+
+
+svg]:hidden",
+ "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
+ "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
+ className
+ )}
+ {...restProps}
+>
+ {@render children?.()}
+
diff --git a/src/lib/components/ui/avatar/avatar-fallback.svelte b/src/lib/components/ui/avatar/avatar-fallback.svelte
new file mode 100644
index 0000000..62f28d9
--- /dev/null
+++ b/src/lib/components/ui/avatar/avatar-fallback.svelte
@@ -0,0 +1,20 @@
+
+
+
diff --git a/src/lib/components/ui/avatar/avatar-group-count.svelte b/src/lib/components/ui/avatar/avatar-group-count.svelte
new file mode 100644
index 0000000..0a0aeb4
--- /dev/null
+++ b/src/lib/components/ui/avatar/avatar-group-count.svelte
@@ -0,0 +1,23 @@
+
+
+svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3 relative flex shrink-0 items-center justify-center ring-2 ring-background",
+ className
+ )}
+ {...restProps}
+>
+ {@render children?.()}
+
diff --git a/src/lib/components/ui/avatar/avatar-group.svelte b/src/lib/components/ui/avatar/avatar-group.svelte
new file mode 100644
index 0000000..e558356
--- /dev/null
+++ b/src/lib/components/ui/avatar/avatar-group.svelte
@@ -0,0 +1,23 @@
+
+
+
+ {@render children?.()}
+
diff --git a/src/lib/components/ui/avatar/avatar-image.svelte b/src/lib/components/ui/avatar/avatar-image.svelte
new file mode 100644
index 0000000..f41cf8f
--- /dev/null
+++ b/src/lib/components/ui/avatar/avatar-image.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/ui/avatar/avatar.svelte b/src/lib/components/ui/avatar/avatar.svelte
new file mode 100644
index 0000000..7464798
--- /dev/null
+++ b/src/lib/components/ui/avatar/avatar.svelte
@@ -0,0 +1,26 @@
+
+
+
diff --git a/src/lib/components/ui/avatar/index.ts b/src/lib/components/ui/avatar/index.ts
new file mode 100644
index 0000000..963a923
--- /dev/null
+++ b/src/lib/components/ui/avatar/index.ts
@@ -0,0 +1,22 @@
+import Badge from "./avatar-badge.svelte";
+import Fallback from "./avatar-fallback.svelte";
+import GroupCount from "./avatar-group-count.svelte";
+import Group from "./avatar-group.svelte";
+import Image from "./avatar-image.svelte";
+import Root from "./avatar.svelte";
+
+export {
+ Root,
+ Image,
+ Fallback,
+ Badge,
+ Group,
+ GroupCount,
+ //
+ Root as Avatar,
+ Image as AvatarImage,
+ Fallback as AvatarFallback,
+ Badge as AvatarBadge,
+ Group as AvatarGroup,
+ GroupCount as AvatarGroupCount,
+};
diff --git a/src/lib/components/ui/sonner/index.ts b/src/lib/components/ui/sonner/index.ts
new file mode 100644
index 0000000..1ad9f4a
--- /dev/null
+++ b/src/lib/components/ui/sonner/index.ts
@@ -0,0 +1 @@
+export { default as Toaster } from "./sonner.svelte";
diff --git a/src/lib/components/ui/sonner/sonner.svelte b/src/lib/components/ui/sonner/sonner.svelte
new file mode 100644
index 0000000..33161a6
--- /dev/null
+++ b/src/lib/components/ui/sonner/sonner.svelte
@@ -0,0 +1,34 @@
+
+
+
+ {#snippet loadingIcon()}
+
+ {/snippet}
+ {#snippet successIcon()}
+
+ {/snippet}
+ {#snippet errorIcon()}
+
+ {/snippet}
+ {#snippet infoIcon()}
+
+ {/snippet}
+ {#snippet warningIcon()}
+
+ {/snippet}
+
diff --git a/src/lib/components/ui/tabs/index.ts b/src/lib/components/ui/tabs/index.ts
new file mode 100644
index 0000000..581b188
--- /dev/null
+++ b/src/lib/components/ui/tabs/index.ts
@@ -0,0 +1,18 @@
+import Content from "./tabs-content.svelte";
+import Trigger from "./tabs-trigger.svelte";
+import Root from "./tabs.svelte";
+import List, { tabsListVariants, type TabsListVariant } from "./tabs-list.svelte";
+
+export {
+ Root,
+ Content,
+ List,
+ Trigger,
+ tabsListVariants,
+ type TabsListVariant,
+ //
+ Root as Tabs,
+ Content as TabsContent,
+ List as TabsList,
+ Trigger as TabsTrigger,
+};
diff --git a/src/lib/components/ui/tabs/tabs-content.svelte b/src/lib/components/ui/tabs/tabs-content.svelte
new file mode 100644
index 0000000..394ab3e
--- /dev/null
+++ b/src/lib/components/ui/tabs/tabs-content.svelte
@@ -0,0 +1,17 @@
+
+
+
diff --git a/src/lib/components/ui/tabs/tabs-list.svelte b/src/lib/components/ui/tabs/tabs-list.svelte
new file mode 100644
index 0000000..d77f438
--- /dev/null
+++ b/src/lib/components/ui/tabs/tabs-list.svelte
@@ -0,0 +1,40 @@
+
+
+
+
+
diff --git a/src/lib/components/ui/tabs/tabs-trigger.svelte b/src/lib/components/ui/tabs/tabs-trigger.svelte
new file mode 100644
index 0000000..afeb306
--- /dev/null
+++ b/src/lib/components/ui/tabs/tabs-trigger.svelte
@@ -0,0 +1,23 @@
+
+
+
diff --git a/src/lib/components/ui/tabs/tabs.svelte b/src/lib/components/ui/tabs/tabs.svelte
new file mode 100644
index 0000000..bfb900d
--- /dev/null
+++ b/src/lib/components/ui/tabs/tabs.svelte
@@ -0,0 +1,19 @@
+
+
+
diff --git a/src/lib/mirrors.ts b/src/lib/mirrors.ts
new file mode 100644
index 0000000..8846a45
--- /dev/null
+++ b/src/lib/mirrors.ts
@@ -0,0 +1,15 @@
+export const MIRRORS: Record = {
+ "Global": [
+ "mirror1.semilabs.org",
+ ],
+ "East Asia": [
+ "mirror2.semilabs.org",
+ ],
+};
+
+export const MAINTAINERS: Record = {
+ "sisungo ": {
+ "name": "sisungo",
+ "avatar": "https://github.com/sisungo.png",
+ },
+}
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 04992d5..33d2d04 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -6,12 +6,15 @@
import './layout.css';
import { ModeWatcher } from 'mode-watcher';
import favicon from '$lib/assets/favicon.svg';
- import Topbar from '../components/Topbar.svelte';
import { setLocale } from "$lib/paraglide/runtime";
+ import { Toaster } from "$lib/components/ui/sonner/index.js";
+
+ import Topbar from '../components/Topbar.svelte';
+ import Pagefoot from '../components/Pagefoot.svelte';
let { children } = $props();
- function normalizeLanguage(lang) {
+ function normalizeLanguage(lang: string): 'zh-cn' | 'ja' | 'en' | null {
if (!lang) return null;
lang = lang.toLowerCase();
@@ -28,8 +31,10 @@
+
{@render children()}
+
{#each locales as locale (locale)}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index eef2577..a1e4930 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,5 +1,6 @@
@@ -9,9 +10,12 @@
{m.homepage_slogan()}
-
-
- {m.homepage_get()}
-
+
{m.homepage_slogan_detailed()}
+
+
+
+ {m.homepage_get()}
+
+
\ No newline at end of file
diff --git a/src/routes/download/+page.svelte b/src/routes/download/+page.svelte
new file mode 100644
index 0000000..8676938
--- /dev/null
+++ b/src/routes/download/+page.svelte
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
+ {m.download_iso_image()}
+
+ {m.download_iso_image_description()}
+
+
+
+
+ {m.download_iso_arch()}
+
+ {isoImageArch}
+
+ x86_64
+ aarch64
+ riscv64
+
+
+
+
+ {m.download_iso_image_ty()}
+
+ {isoImageTy}
+
+ NetBoot
+ Minimal LiveCD
+ GUI LiveCD
+
+
+
+
+
+
+
+
+
+ {m.download_now()}
+
+
+
+
+
+
+
+
+
+
+ {m.download_container_title()}
+
+
+
+
+
+ {m.download_container_direct_deploy()}
+ Docker
+
+
+
+ {m.download_container_arch()}
+
+ {containerArch}
+
+ x86_64-semios-linux
+ aarch64-semios-linux
+ riscv64-semios-linux
+
+
+
+
+
+ {m.download_now()}
+
+
+ Not yet available.
+
+
+
+
+
+
+
+
+ {m.download_mirrors_title()}
+
+ {m.download_mirrors_description()}
+
+
+
+
+ {m.download_mirrors_region()}
+
+ {mirrorRegion}
+
+ {#each Object.keys(MIRRORS) as region (region)}
+ {
+ mirrorServer = MIRRORS[region][0];
+ }}>{region}
+ {/each}
+
+
+
+
+ {m.download_mirrors_server()}
+
+ {mirrorServer}
+
+ {#each MIRRORS[mirrorRegion] as server (server)}
+ {server}
+ {/each}
+
+
+
+
+
+
+
+
+
+ {m.download_mirrors_access()}
+
+
+
+
+
+
+
+
+
diff --git a/src/routes/packages/+page.svelte b/src/routes/packages/+page.svelte
index a2c9fab..f584359 100644
--- a/src/routes/packages/+page.svelte
+++ b/src/routes/packages/+page.svelte
@@ -1,96 +1,149 @@
-
-
-
- {m.packages_search_title()}
-
-
-
- {m.packages_mirror_select()}
-
- mirror1.semilabs.org
- mirror2.semilabs.org
-
-
-
-
-
- {m.packages_arch_select()}
-
- aarch64-semios-linux
- x86_64-semios-linux
-
-
-
-
- {m.packages_show_latest_only()}
-
-
-
-
-
- {m.packages_search_action()}
-
-
-
+
+
+
+
+
+ {m.packages_search_title()}
+
+
+
+
+
+
+ {m.packages_mirror_select()}
+
+ {selectedMirror}
+
+ mirror1.semilabs.org
+ mirror2.semilabs.org
+
+
+
+
+ {m.packages_repo_select()}
+
+ {selectedRepo}
+
+ official
+ unofficial
+
+
+
+
+ {m.packages_arch_select()}
+
+ {filterArchitecture}
+
+ none
+ aarch64-semios-linux
+ x86_64-semios-linux
+
+
+
+
+
+
+
+
+ {m.packages_show_latest_only()}
+
+
+
+
+
+ {m.packages_search_action()}
+
+
+
+
-
-
-
-
-
- {m.packages_name()}
- {m.packages_version()}
- {m.packages_arch()}
-
-
-
- {#each results as item}
-
- {item.name}
- {item.version}
- {item.arch}
-
- {/each}
-
-
-
-
\ No newline at end of file
+
+
+
+
+ {m.packages_name()}
+ {m.packages_version()}
+ {m.packages_arch()}
+
+
+
+ {#each results as item (strPkgIdent(item))}
+
+
+
+ {item.name}
+
+
+ {item.version}
+ {item.arch}
+
+ {/each}
+
+
+
+
diff --git a/src/routes/packages/helper.ts b/src/routes/packages/helper.ts
index 4cb3e16..307c88c 100644
--- a/src/routes/packages/helper.ts
+++ b/src/routes/packages/helper.ts
@@ -41,7 +41,9 @@ export function baseUrlForMirror(mirror: string): string {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export async function getRepoDb(url: string): Promise {
- const sqlPromise = initSqlJs();
+ const sqlPromise = initSqlJs({
+ locateFile: () => "/sql-wasm-browser.wasm",
+ });
const dataPromise = fetch(url).then((res) => res.arrayBuffer());
const [SQL, data] = await Promise.all([sqlPromise, dataPromise]);
return new SQL.Database(new Uint8Array(data));
@@ -64,14 +66,15 @@ export function searchPackages(db: any, keyword: string): PkgIdent[] {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
export function getPkgInfo(db: any, pkg: PkgIdent): any {
const stmt = db.prepare(
- `SELECT pkg_manifest, download_size, installed_size FROM package WHERE pkg_name = ? AND pkg_version = ? AND pkg_arch = ?`
+ `SELECT pkg_manifest, download_size, installed_size, checksum FROM package WHERE pkg_name = ? AND pkg_version = ? AND pkg_arch = ?`
);
stmt.bind([pkg.name, pkg.version, pkg.arch]);
if (stmt.step()) {
- const [sManifest, downloadSize, installedSize] = stmt.get();
+ const [sManifest, downloadSize, installedSize, checksum] = stmt.get();
const manifest = JSON.parse(sManifest);
manifest['download_size'] = downloadSize;
manifest['installed_size'] = installedSize;
+ manifest['checksum'] = checksum
return manifest;
}
return null;
diff --git a/src/routes/packages/pkginfo/+page.svelte b/src/routes/packages/pkginfo/+page.svelte
index 48cda9f..eb6307c 100644
--- a/src/routes/packages/pkginfo/+page.svelte
+++ b/src/routes/packages/pkginfo/+page.svelte
@@ -1,116 +1,206 @@
-
-
-
-
-
-
- {pkgInfo ? pkgInfo['name'] : ""}
-
- {pkgInfo ? pkgInfo['description'] : null}
-
-
- {m.pkginfo_version()}: {pkgInfo ? pkgInfo['version'] : ""}
- {m.pkginfo_arch()}: {pkgInfo ? pkgInfo['arch'] : ""}
- {m.pkginfo_installed_size()}: {pkgInfo ? formatSize(pkgInfo['installed_size']) : ""}
-
-
-
-
-
-
- {m.pkginfo_download_title()}
-
-
-
- {m.pkginfo_download_filename()}: {(pkgIdent ? strPkgIdent(pkgIdent) : "") + ".pkg"}
- {m.pkginfo_download_size()}: {pkgInfo ? formatSize(pkgInfo['download_size']) : ""}
-
-
- {
- window.location.href = `${baseUrl}/${(pkgIdent ? strPkgIdent(pkgIdent) : '') + '.pkg'}`;
- }}>{m.pkginfo_download_action()}
-
-
-
-
-
-
-
-
- {m.pkginfo_dependency_title()}
-
- {m.pkginfo_dependency_description()}
-
-
-
-
-
- {m.pkginfo_dependency_pkgspec()}
- {m.pkginfo_dependency_type()}
-
-
-
- {#each pkgInfo ? pkgInfo['dependencies'] : [] as item}
-
- {item}
- {m.pkginfo_dependency_type_required()}
-
- {/each}
- {#each pkgInfo ? pkgInfo['recommendations'] : [] as item}
-
- {item}
- {m.pkginfo_dependency_type_recommended()}
-
- {/each}
-
-
-
-
-
+
+
+
+
+
+
+ {pkgInfo ? pkgInfo['name'] : ''}
+
+ {pkgInfo ? pkgInfo['description'] : null}
+
+
+
+ {m.pkginfo_version()}:
+ {pkgInfo ? pkgInfo['version'] : ''}
+
+
+ {m.pkginfo_arch()}:
+ {pkgInfo ? pkgInfo['arch'] : ''}
+
+
+ {m.pkginfo_installed_size()}:
+ {pkgInfo ? formatSize(pkgInfo['installed_size']) : ''}
+
+
+
+
+
+
+
+ {m.pkginfo_install_title()}
+
+
+
+
+
+ {m.pkginfo_install_download()}
+ Packie
+
+
+
+ {m.pkginfo_download_filename()}:
+
+ {(pkgIdent ? strPkgIdent(pkgIdent) : '') + '.pkg'}
+
+
+
+ {m.pkginfo_download_size()}:
+ {pkgInfo ? formatSize(pkgInfo['download_size']) : ''}
+
+
+ {m.pkginfo_download_checksum()}:
+
+ {pkgInfo ? pkgInfo['checksum'] : ''}
+
+
+ {
+ window.location.href = `${baseUrl}/${(pkgIdent ? strPkgIdent(pkgIdent) : '') + '.pkg'}`;
+ }}>{m.pkginfo_download_action()}
+
+
+ {m.pkginfo_install_packie_prompt_terminal()}
+
+
+
+ $
+
+ packie install '{pkgIdent ? strPkgIdent(pkgIdent) : ''}'
+
+
+
+
+ {
+ const command = `packie install '${pkgIdent ? strPkgIdent(pkgIdent) : ''}'`;
+ navigator.clipboard.writeText(command);
+ toast(m.pkginfo_install_packie_pasted(), { description: command });
+ }}
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {m.pkginfo_dependency_title()}
+
+ {m.pkginfo_dependency_description()}
+
+
+
+
+
+ {m.pkginfo_dependency_pkgspec()}
+ {m.pkginfo_dependency_type()}
+
+
+
+ {#each pkgInfo ? pkgInfo['dependencies'] : [] as item (item)}
+
+ {item}
+ {m.pkginfo_dependency_type_required()}
+
+ {/each}
+ {#each pkgInfo ? pkgInfo['recommendations'] : [] as item (item)}
+
+ {item}
+ {m.pkginfo_dependency_type_recommended()}
+
+ {/each}
+
+
+
+
+
+
+
+
+ {m.pkginfo_maintainers()}
+
+
+
+ {#each pkgInfo ? pkgInfo['maintainers'] : [] as item (item)}
+
+ {/each}
+
+
+
diff --git a/src/routes/policy/privacy/+page.svelte b/src/routes/policy/privacy/+page.svelte
new file mode 100644
index 0000000..f2703c2
--- /dev/null
+++ b/src/routes/policy/privacy/+page.svelte
@@ -0,0 +1,10 @@
+
+
+
Privacy Policy
+
Updated: 2026-08-18
+
+ This privacy policy describes how we use your personal data collected when you access our website.
+
\ No newline at end of file