Compare commits

...

No commits in common. "master" and "archive/svelte" have entirely different histories.

57 changed files with 714 additions and 1446 deletions

33
.gitignore vendored
View File

@ -1,24 +1,11 @@
# build output
dist/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store
# jetbrains setting folder
.idea/
node_modules
/build
/dist
/.svelte-kit
/package
.env
.env.*
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*

8
.idea/.gitignore generated vendored Normal file
View File

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

12
.idea/Capital.iml generated Normal file
View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<excludeFolder url="file://$MODULE_DIR$/.tmp" />
<excludeFolder url="file://$MODULE_DIR$/temp" />
<excludeFolder url="file://$MODULE_DIR$/tmp" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

63
.idea/codeStyles/Project.xml generated Normal file
View File

@ -0,0 +1,63 @@
<component name="ProjectCodeStyleConfiguration">
<code_scheme name="Project" version="173">
<HTMLCodeStyleSettings>
<option name="HTML_SPACE_INSIDE_EMPTY_TAG" value="true" />
</HTMLCodeStyleSettings>
<JSCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="USE_DOUBLE_QUOTES" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
</JSCodeStyleSettings>
<TypeScriptCodeStyleSettings version="0">
<option name="FORCE_SEMICOLON_STYLE" value="true" />
<option name="SPACE_BEFORE_FUNCTION_LEFT_PARENTH" value="false" />
<option name="USE_DOUBLE_QUOTES" value="false" />
<option name="FORCE_QUOTE_STYlE" value="true" />
<option name="ENFORCE_TRAILING_COMMA" value="Remove" />
<option name="SPACES_WITHIN_OBJECT_LITERAL_BRACES" value="true" />
<option name="SPACES_WITHIN_IMPORTS" value="true" />
</TypeScriptCodeStyleSettings>
<VueCodeStyleSettings>
<option name="INTERPOLATION_NEW_LINE_AFTER_START_DELIMITER" value="false" />
<option name="INTERPOLATION_NEW_LINE_BEFORE_END_DELIMITER" value="false" />
</VueCodeStyleSettings>
<codeStyleSettings language="HTML">
<option name="SOFT_MARGINS" value="120" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="JavaScript">
<option name="SOFT_MARGINS" value="120" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="TypeScript">
<option name="SOFT_MARGINS" value="120" />
<indentOptions>
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="TAB_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
<codeStyleSettings language="Vue">
<option name="SOFT_MARGINS" value="120" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="2" />
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
</code_scheme>
</component>

5
.idea/codeStyles/codeStyleConfig.xml generated Normal file
View File

@ -0,0 +1,5 @@
<component name="ProjectCodeStyleConfiguration">
<state>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</state>
</component>

View File

@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="Eslint" enabled="true" level="WARNING" enabled_by_default="true" />
</profile>
</component>

8
.idea/modules.xml generated Normal file
View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/Capital.iml" filepath="$PROJECT_DIR$/.idea/Capital.iml" />
</modules>
</component>
</project>

6
.idea/vcs.xml generated Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

1
.npmrc Normal file
View File

@ -0,0 +1 @@
engine-strict=true

4
.prettierignore Normal file
View File

@ -0,0 +1,4 @@
# Ignore files for PNPM, NPM and YARN
pnpm-lock.yaml
package-lock.json
yarn.lock

View File

@ -1,6 +1,8 @@
{
"tabWidth": 2,
"singleQuote": true,
"semi": false,
"trailingComma": "es5"
"useTabs": true,
"singleQuote": true,
"trailingComma": "none",
"printWidth": 120,
"plugins": ["prettier-plugin-svelte"],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }]
}

View File

@ -1,4 +0,0 @@
{
"recommendations": ["astro-build.astro-vscode"],
"unwantedRecommendations": []
}

11
.vscode/launch.json vendored
View File

@ -1,11 +0,0 @@
{
"version": "0.2.0",
"configurations": [
{
"command": "./node_modules/.bin/astro dev",
"name": "Development server",
"request": "launch",
"type": "node-terminal"
}
]
}

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# Capital
Solsynth LLC Official Website and some Users Portal.

View File

@ -1,40 +0,0 @@
// @ts-check
import { defineConfig } from 'astro/config'
import tailwind from '@astrojs/tailwind'
import icon from 'astro-icon'
import mdx from '@astrojs/mdx'
import sitemap from '@astrojs/sitemap'
import vercel from '@astrojs/vercel';
// https://astro.build/config
export default defineConfig({
site: 'https://solsynth.dev',
integrations: [
tailwind(),
icon(),
mdx(),
sitemap({
xslURL: '/sitemap.xsl',
i18n: { defaultLocale: 'en', locales: { en: 'en-US', 'zh-cn': 'zh-CN' } },
}),
],
prefetch: true,
i18n: {
locales: ['en', 'zh-cn'],
defaultLocale: 'en',
routing: {
fallbackType: 'rewrite',
prefixDefaultLocale: false,
},
},
adapter: vercel(),
})

BIN
bun.lockb

Binary file not shown.

36
eslint.config.js Normal file
View File

@ -0,0 +1,36 @@
import js from '@eslint/js';
import ts from 'typescript-eslint';
import svelte from 'eslint-plugin-svelte';
import prettier from 'eslint-config-prettier';
import globals from 'globals';
/** @type {import('eslint').Linter.FlatConfig[]} */
export default [
js.configs.recommended,
...ts.configs.recommended,
...svelte.configs['flat/recommended'],
prettier,
...svelte.configs['flat/prettier'],
{
languageOptions: {
globals: {
...globals.browser,
...globals.node
}
}
},
{
files: ['**/*.svelte'],
languageOptions: {
parserOptions: {
parser: ts.parser
}
},
rules: {
'css-unused-selector': 'off',
},
},
{
ignores: ['build/', '.svelte-kit/', 'dist/']
},
];

3
netifly.toml Normal file
View File

@ -0,0 +1,3 @@
[build]
command = "npm run build"
publish = "build"

View File

@ -1,30 +1,59 @@
{
"name": "capital",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
"dev": "vite dev",
"build": "vite build && npm run package",
"preview": "vite preview",
"package": "svelte-kit sync && svelte-package && publint",
"prepublishOnly": "npm run package",
"check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
"lint": "prettier --check . && eslint .",
"format": "prettier --write ."
},
"dependencies": {
"@astrojs/mdx": "^4.0.2",
"@astrojs/sitemap": "^3.2.1",
"@astrojs/tailwind": "^5.1.3",
"@astrojs/vercel": "^8.0.1",
"@iconify-json/material-symbols": "^1.2.10",
"@iconify-json/simple-icons": "^1.2.16",
"astro": "^5.0.5",
"astro-icon": "^1.1.4",
"astro-seo": "^0.8.4",
"marked": "^15.0.4",
"sanitize-html": "^2.13.1",
"tailwindcss": "^3.4.16"
"exports": {
".": {
"types": "./dist/index.d.ts",
"svelte": "./dist/index.js"
}
},
"files": [
"dist",
"!dist/**/*.test.*",
"!dist/**/*.spec.*"
],
"peerDependencies": {
"svelte": "^4.0.0"
},
"devDependencies": {
"@tailwindcss/typography": "^0.5.15",
"@types/sanitize-html": "^2.13.0",
"daisyui": "^4.12.22"
}
"@sveltejs/adapter-auto": "^3.0.0",
"@sveltejs/adapter-netlify": "^4.2.0",
"@sveltejs/enhanced-img": "^0.2.1",
"@sveltejs/kit": "^2.0.0",
"@sveltejs/package": "^2.0.0",
"@sveltejs/vite-plugin-svelte": "^3.0.0",
"@tailwindcss/typography": "^0.5.13",
"@types/eslint": "^8.56.7",
"autoprefixer": "^10.4.19",
"daisyui": "^4.12.2",
"eslint": "^9.0.0",
"eslint-config-prettier": "^9.1.0",
"eslint-plugin-svelte": "^2.36.0",
"globals": "^15.0.0",
"postcss": "^8.4.38",
"prettier": "^3.1.1",
"prettier-plugin-svelte": "^3.1.2",
"publint": "^0.1.9",
"svelte": "^4.2.7",
"svelte-check": "^3.6.0",
"tailwindcss": "^3.4.4",
"tslib": "^2.4.1",
"typescript": "^5.0.0",
"typescript-eslint": "^8.0.0-alpha.20",
"vite": "^5.0.11"
},
"svelte": "./dist/index.js",
"types": "./dist/index.d.ts",
"type": "module"
}

6
postcss.config.js Normal file
View File

@ -0,0 +1,6 @@
export default {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

View File

@ -1,4 +0,0 @@
User-agent: *
Allow: /
Sitemap: https://solsynth.dev/sitemap-index.xml

3
src/app.css Normal file
View File

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

13
src/app.d.ts vendored Normal file
View File

@ -0,0 +1,13 @@
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
export {};

12
src/app.html Normal file
View File

@ -0,0 +1,12 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%sveltekit.assets%/favicon.png" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
%sveltekit.head%
</head>
<body data-sveltekit-preload-data="hover">
<div>%sveltekit.body%</div>
</body>
</html>

View File

@ -1,46 +0,0 @@
<svg id="livetype" xmlns="http://www.w3.org/2000/svg" width="119.66407" height="40" viewBox="0 0 119.66407 40">
<title>Download_on_the_App_Store_Badge_US-UK_RGB_blk_4SVG_092917</title>
<g>
<g>
<g>
<path d="M110.13477,0H9.53468c-.3667,0-.729,0-1.09473.002-.30615.002-.60986.00781-.91895.0127A13.21476,13.21476,0,0,0,5.5171.19141a6.66509,6.66509,0,0,0-1.90088.627A6.43779,6.43779,0,0,0,1.99757,1.99707,6.25844,6.25844,0,0,0,.81935,3.61816a6.60119,6.60119,0,0,0-.625,1.90332,12.993,12.993,0,0,0-.1792,2.002C.00587,7.83008.00489,8.1377,0,8.44434V31.5586c.00489.3105.00587.6113.01515.9219a12.99232,12.99232,0,0,0,.1792,2.0019,6.58756,6.58756,0,0,0,.625,1.9043A6.20778,6.20778,0,0,0,1.99757,38.001a6.27445,6.27445,0,0,0,1.61865,1.1787,6.70082,6.70082,0,0,0,1.90088.6308,13.45514,13.45514,0,0,0,2.0039.1768c.30909.0068.6128.0107.91895.0107C8.80567,40,9.168,40,9.53468,40H110.13477c.3594,0,.7246,0,1.084-.002.3047,0,.6172-.0039.9219-.0107a13.279,13.279,0,0,0,2-.1768,6.80432,6.80432,0,0,0,1.9082-.6308,6.27742,6.27742,0,0,0,1.6172-1.1787,6.39482,6.39482,0,0,0,1.1816-1.6143,6.60413,6.60413,0,0,0,.6191-1.9043,13.50643,13.50643,0,0,0,.1856-2.0019c.0039-.3106.0039-.6114.0039-.9219.0078-.3633.0078-.7246.0078-1.0938V9.53613c0-.36621,0-.72949-.0078-1.09179,0-.30664,0-.61426-.0039-.9209a13.5071,13.5071,0,0,0-.1856-2.002,6.6177,6.6177,0,0,0-.6191-1.90332,6.46619,6.46619,0,0,0-2.7988-2.7998,6.76754,6.76754,0,0,0-1.9082-.627,13.04394,13.04394,0,0,0-2-.17676c-.3047-.00488-.6172-.01074-.9219-.01269-.3594-.002-.7246-.002-1.084-.002Z" style="fill: #a6a6a6"/>
<path d="M8.44483,39.125c-.30468,0-.602-.0039-.90429-.0107a12.68714,12.68714,0,0,1-1.86914-.1631,5.88381,5.88381,0,0,1-1.65674-.5479,5.40573,5.40573,0,0,1-1.397-1.0166,5.32082,5.32082,0,0,1-1.02051-1.3965,5.72186,5.72186,0,0,1-.543-1.6572,12.41351,12.41351,0,0,1-.1665-1.875c-.00634-.2109-.01464-.9131-.01464-.9131V8.44434S.88185,7.75293.8877,7.5498a12.37039,12.37039,0,0,1,.16553-1.87207,5.7555,5.7555,0,0,1,.54346-1.6621A5.37349,5.37349,0,0,1,2.61183,2.61768,5.56543,5.56543,0,0,1,4.01417,1.59521a5.82309,5.82309,0,0,1,1.65332-.54394A12.58589,12.58589,0,0,1,7.543.88721L8.44532.875H111.21387l.9131.0127a12.38493,12.38493,0,0,1,1.8584.16259,5.93833,5.93833,0,0,1,1.6709.54785,5.59374,5.59374,0,0,1,2.415,2.41993,5.76267,5.76267,0,0,1,.5352,1.64892,12.995,12.995,0,0,1,.1738,1.88721c.0029.2832.0029.5874.0029.89014.0079.375.0079.73193.0079,1.09179V30.4648c0,.3633,0,.7178-.0079,1.0752,0,.3252,0,.6231-.0039.9297a12.73126,12.73126,0,0,1-.1709,1.8535,5.739,5.739,0,0,1-.54,1.67,5.48029,5.48029,0,0,1-1.0156,1.3857,5.4129,5.4129,0,0,1-1.3994,1.0225,5.86168,5.86168,0,0,1-1.668.5498,12.54218,12.54218,0,0,1-1.8692.1631c-.2929.0068-.5996.0107-.8974.0107l-1.084.002Z"/>
</g>
<g id="_Group_" data-name="&lt;Group&gt;">
<g id="_Group_2" data-name="&lt;Group&gt;">
<g id="_Group_3" data-name="&lt;Group&gt;">
<path id="_Path_" data-name="&lt;Path&gt;" d="M24.76888,20.30068a4.94881,4.94881,0,0,1,2.35656-4.15206,5.06566,5.06566,0,0,0-3.99116-2.15768c-1.67924-.17626-3.30719,1.00483-4.1629,1.00483-.87227,0-2.18977-.98733-3.6085-.95814a5.31529,5.31529,0,0,0-4.47292,2.72787c-1.934,3.34842-.49141,8.26947,1.3612,10.97608.9269,1.32535,2.01018,2.8058,3.42763,2.7533,1.38706-.05753,1.9051-.88448,3.5794-.88448,1.65876,0,2.14479.88448,3.591.8511,1.48838-.02416,2.42613-1.33124,3.32051-2.66914a10.962,10.962,0,0,0,1.51842-3.09251A4.78205,4.78205,0,0,1,24.76888,20.30068Z" style="fill: #fff"/>
<path id="_Path_2" data-name="&lt;Path&gt;" d="M22.03725,12.21089a4.87248,4.87248,0,0,0,1.11452-3.49062,4.95746,4.95746,0,0,0-3.20758,1.65961,4.63634,4.63634,0,0,0-1.14371,3.36139A4.09905,4.09905,0,0,0,22.03725,12.21089Z" style="fill: #fff"/>
</g>
</g>
<g>
<path d="M42.30227,27.13965h-4.7334l-1.13672,3.35645H34.42727l4.4834-12.418h2.083l4.4834,12.418H43.438ZM38.0591,25.59082h3.752l-1.84961-5.44727h-.05176Z" style="fill: #fff"/>
<path d="M55.15969,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H48.4302v1.50586h.03418a3.21162,3.21162,0,0,1,2.88281-1.60059C53.645,21.34766,55.15969,23.16406,55.15969,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C52.30227,29.01563,53.24953,27.81934,53.24953,25.96973Z" style="fill: #fff"/>
<path d="M65.12453,25.96973c0,2.81348-1.50586,4.62109-3.77832,4.62109a3.0693,3.0693,0,0,1-2.84863-1.584h-.043v4.48438h-1.8584V21.44238H58.395v1.50586h.03418A3.21162,3.21162,0,0,1,61.312,21.34766C63.60988,21.34766,65.12453,23.16406,65.12453,25.96973Zm-1.91016,0c0-1.833-.94727-3.03809-2.39258-3.03809-1.41992,0-2.375,1.23047-2.375,3.03809,0,1.82422.95508,3.0459,2.375,3.0459C62.26711,29.01563,63.21438,27.81934,63.21438,25.96973Z" style="fill: #fff"/>
<path d="M71.71047,27.03613c.1377,1.23145,1.334,2.04,2.96875,2.04,1.56641,0,2.69336-.80859,2.69336-1.91895,0-.96387-.67969-1.541-2.28906-1.93652l-1.60937-.3877c-2.28027-.55078-3.33887-1.61719-3.33887-3.34766,0-2.14258,1.86719-3.61426,4.51855-3.61426,2.624,0,4.42285,1.47168,4.4834,3.61426h-1.876c-.1123-1.23926-1.13672-1.9873-2.63379-1.9873s-2.52148.75684-2.52148,1.8584c0,.87793.6543,1.39453,2.25488,1.79l1.36816.33594c2.54785.60254,3.60645,1.626,3.60645,3.44238,0,2.32324-1.85059,3.77832-4.79395,3.77832-2.75391,0-4.61328-1.4209-4.7334-3.667Z" style="fill: #fff"/>
<path d="M83.34621,19.2998v2.14258h1.72168v1.47168H83.34621v4.99121c0,.77539.34473,1.13672,1.10156,1.13672a5.80752,5.80752,0,0,0,.61133-.043v1.46289a5.10351,5.10351,0,0,1-1.03223.08594c-1.833,0-2.54785-.68848-2.54785-2.44434V22.91406H80.16262V21.44238H81.479V19.2998Z" style="fill: #fff"/>
<path d="M86.065,25.96973c0-2.84863,1.67773-4.63867,4.29395-4.63867,2.625,0,4.29492,1.79,4.29492,4.63867,0,2.85645-1.66113,4.63867-4.29492,4.63867C87.72609,30.6084,86.065,28.82617,86.065,25.96973Zm6.69531,0c0-1.9541-.89551-3.10742-2.40137-3.10742s-2.40039,1.16211-2.40039,3.10742c0,1.96191.89453,3.10645,2.40039,3.10645S92.76027,27.93164,92.76027,25.96973Z" style="fill: #fff"/>
<path d="M96.18606,21.44238h1.77246v1.541h.043a2.1594,2.1594,0,0,1,2.17773-1.63574,2.86616,2.86616,0,0,1,.63672.06934v1.73828a2.59794,2.59794,0,0,0-.835-.1123,1.87264,1.87264,0,0,0-1.93652,2.083v5.37012h-1.8584Z" style="fill: #fff"/>
<path d="M109.3843,27.83691c-.25,1.64355-1.85059,2.77148-3.89844,2.77148-2.63379,0-4.26855-1.76465-4.26855-4.5957,0-2.83984,1.64355-4.68164,4.19043-4.68164,2.50488,0,4.08008,1.7207,4.08008,4.46582v.63672h-6.39453v.1123a2.358,2.358,0,0,0,2.43555,2.56445,2.04834,2.04834,0,0,0,2.09082-1.27344Zm-6.28223-2.70215h4.52637a2.1773,2.1773,0,0,0-2.2207-2.29785A2.292,2.292,0,0,0,103.10207,25.13477Z" style="fill: #fff"/>
</g>
</g>
</g>
<g id="_Group_4" data-name="&lt;Group&gt;">
<g>
<path d="M37.82619,8.731a2.63964,2.63964,0,0,1,2.80762,2.96484c0,1.90625-1.03027,3.002-2.80762,3.002H35.67092V8.731Zm-1.22852,5.123h1.125a1.87588,1.87588,0,0,0,1.96777-2.146,1.881,1.881,0,0,0-1.96777-2.13379h-1.125Z" style="fill: #fff"/>
<path d="M41.68068,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C44.57522,13.99463,45.01369,13.42432,45.01369,12.44434Z" style="fill: #fff"/>
<path d="M51.57326,14.69775h-.92187l-.93066-3.31641h-.07031l-.92676,3.31641h-.91309l-1.24121-4.50293h.90137l.80664,3.436h.06641l.92578-3.436h.85254l.92578,3.436h.07031l.80273-3.436h.88867Z" style="fill: #fff"/>
<path d="M53.85354,10.19482H54.709v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915h-.88867V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M59.09377,8.437h.88867v6.26074h-.88867Z" style="fill: #fff"/>
<path d="M61.21779,12.44434a2.13346,2.13346,0,1,1,4.24756,0,2.1338,2.1338,0,1,1-4.24756,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C64.11232,13.99463,64.5508,13.42432,64.5508,12.44434Z" style="fill: #fff"/>
<path d="M66.4009,13.42432c0-.81055.60352-1.27783,1.6748-1.34424l1.21973-.07031v-.38867c0-.47559-.31445-.74414-.92187-.74414-.49609,0-.83984.18213-.93848.50049h-.86035c.09082-.77344.81836-1.26953,1.83984-1.26953,1.12891,0,1.76563.562,1.76563,1.51318v3.07666h-.85547v-.63281h-.07031a1.515,1.515,0,0,1-1.35254.707A1.36026,1.36026,0,0,1,66.4009,13.42432Zm2.89453-.38477v-.37646l-1.09961.07031c-.62012.0415-.90137.25244-.90137.64941,0,.40527.35156.64111.835.64111A1.0615,1.0615,0,0,0,69.29543,13.03955Z" style="fill: #fff"/>
<path d="M71.34816,12.44434c0-1.42285.73145-2.32422,1.86914-2.32422a1.484,1.484,0,0,1,1.38086.79h.06641V8.437h.88867v6.26074h-.85156v-.71143h-.07031a1.56284,1.56284,0,0,1-1.41406.78564C72.0718,14.772,71.34816,13.87061,71.34816,12.44434Zm.918,0c0,.95508.4502,1.52979,1.20313,1.52979.749,0,1.21191-.583,1.21191-1.52588,0-.93848-.46777-1.52979-1.21191-1.52979C72.72121,10.91846,72.26613,11.49707,72.26613,12.44434Z" style="fill: #fff"/>
<path d="M79.23,12.44434a2.13323,2.13323,0,1,1,4.24707,0,2.13358,2.13358,0,1,1-4.24707,0Zm3.333,0c0-.97607-.43848-1.54687-1.208-1.54687-.77246,0-1.207.5708-1.207,1.54688,0,.98389.43457,1.55029,1.207,1.55029C82.12453,13.99463,82.563,13.42432,82.563,12.44434Z" style="fill: #fff"/>
<path d="M84.66945,10.19482h.85547v.71533h.06641a1.348,1.348,0,0,1,1.34375-.80225,1.46456,1.46456,0,0,1,1.55859,1.6748v2.915H87.605V12.00586c0-.72363-.31445-1.0835-.97168-1.0835a1.03294,1.03294,0,0,0-1.0752,1.14111v2.63428h-.88867Z" style="fill: #fff"/>
<path d="M93.51516,9.07373v1.1416h.97559v.74854h-.97559V13.2793c0,.47168.19434.67822.63672.67822a2.96657,2.96657,0,0,0,.33887-.02051v.74023a2.9155,2.9155,0,0,1-.4834.04541c-.98828,0-1.38184-.34766-1.38184-1.21582v-2.543h-.71484v-.74854h.71484V9.07373Z" style="fill: #fff"/>
<path d="M95.70461,8.437h.88086v2.48145h.07031a1.3856,1.3856,0,0,1,1.373-.80664,1.48339,1.48339,0,0,1,1.55078,1.67871v2.90723H98.69v-2.688c0-.71924-.335-1.0835-.96289-1.0835a1.05194,1.05194,0,0,0-1.13379,1.1416v2.62988h-.88867Z" style="fill: #fff"/>
<path d="M104.76125,13.48193a1.828,1.828,0,0,1-1.95117,1.30273A2.04531,2.04531,0,0,1,100.73,12.46045a2.07685,2.07685,0,0,1,2.07617-2.35254c1.25293,0,2.00879.856,2.00879,2.27V12.688h-3.17969v.0498a1.1902,1.1902,0,0,0,1.19922,1.29,1.07934,1.07934,0,0,0,1.07129-.5459Zm-3.126-1.45117h2.27441a1.08647,1.08647,0,0,0-1.1084-1.1665A1.15162,1.15162,0,0,0,101.63527,12.03076Z" style="fill: #fff"/>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 696 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 MiB

14
src/assets/solar.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 28 KiB

BIN
src/assets/solian.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 537 KiB

View File

@ -1,29 +0,0 @@
---
import { getAttachmentUrl } from '../scripts/attachment'
interface Props {
data: any
}
const { data: attachment } = Astro.props
---
{
attachment.mimetype.startsWith('image') ? (
<a href={getAttachmentUrl(attachment.rid)} target="_blank">
<img
src={getAttachmentUrl(attachment.rid)}
alt={attachment.alt}
class="rounded-lg"
/>
</a>
) : attachment.mimetype.startsWith('video') ? (
<video src={getAttachmentUrl(attachment.rid)} controls class="rounded-lg" />
) : attachment.mimetype.startsWith('audio') ? (
<audio src={getAttachmentUrl(attachment.rid)} controls class="rounded-lg" />
) : (
<a href={getAttachmentUrl(attachment.rid)} target="_blank">
Unable to preview, but you can open it in your broswer.
</a>
)
}

View File

@ -0,0 +1,11 @@
<footer class="footer footer-center p-5 border-t border-footer">
<aside>
<p>Copyright © {new Date().getFullYear()} Solsynth LLC</p>
</aside>
</footer>
<style>
.border-footer {
border-color: var(--fallback-bc, oklch(var(--bc) / 0.1));
}
</style>

View File

@ -0,0 +1,28 @@
<div
class="navbar bg-base-100 text-base-content bg-opacity-90 backdrop-blur transition-shadow duration-100 [transform:translate3d(0,0,0)] shadow-sm"
>
<div class="px-5 w-full flex justify-between">
<a href="/" class="btn btn-ghost text-xl">Solsynth</a>
<label id="theme-switch" class="swap swap-rotate me-5">
<input type="checkbox" class="theme-controller" value="light" />
<svg
class="swap-off fill-current w-6 h-6"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
d="M5.64,17l-.71.71a1,1,0,0,0,0,1.41,1,1,0,0,0,1.41,0l.71-.71A1,1,0,0,0,5.64,17ZM5,12a1,1,0,0,0-1-1H3a1,1,0,0,0,0,2H4A1,1,0,0,0,5,12Zm7-7a1,1,0,0,0,1-1V3a1,1,0,0,0-2,0V4A1,1,0,0,0,12,5ZM5.64,7.05a1,1,0,0,0,.7.29,1,1,0,0,0,.71-.29,1,1,0,0,0,0-1.41l-.71-.71A1,1,0,0,0,4.93,6.34Zm12,.29a1,1,0,0,0,.7-.29l.71-.71a1,1,0,1,0-1.41-1.41L17,5.64a1,1,0,0,0,0,1.41A1,1,0,0,0,17.66,7.34ZM21,11H20a1,1,0,0,0,0,2h1a1,1,0,0,0,0-2Zm-9,8a1,1,0,0,0-1,1v1a1,1,0,0,0,2,0V20A1,1,0,0,0,12,19ZM18.36,17A1,1,0,0,0,17,18.36l.71.71a1,1,0,0,0,1.41,0,1,1,0,0,0,0-1.41ZM12,6.5A5.5,5.5,0,1,0,17.5,12,5.51,5.51,0,0,0,12,6.5Zm0,9A3.5,3.5,0,1,1,15.5,12,3.5,3.5,0,0,1,12,15.5Z"
></path></svg
>
<svg
class="swap-on fill-current w-6 h-6"
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
><path
d="M21.64,13a1,1,0,0,0-1.05-.14,8.05,8.05,0,0,1-3.37.73A8.15,8.15,0,0,1,9.08,5.49a8.59,8.59,0,0,1,.25-2A1,1,0,0,0,8,2.36,10.14,10.14,0,1,0,22,14.05,1,1,0,0,0,21.64,13Zm-9.5,6.69A8.14,8.14,0,0,1,7.08,5.22v.27A10.15,10.15,0,0,0,17.22,15.63a9.79,9.79,0,0,0,2.1-.22A8.11,8.11,0,0,1,12.14,19.73Z"
></path></svg
>
</label>
</div>
</div>

View File

@ -1,121 +0,0 @@
---
import { Image } from 'astro:assets'
import { version } from '../../package.json'
import CompanyLogo from '../assets/images/company-logo.png'
import { getRelativeLocaleUrl } from 'astro:i18n'
interface Props {
title?: string
trailingTitle?: string
}
let { title, trailingTitle } = Astro.props
if (!trailingTitle) trailingTitle = 'Solsynth LLC'
console.log(title ? `${title} | ${trailingTitle}` : trailingTitle)
const locale = Astro.currentLocale ?? 'en'
---
<!doctype html>
<html lang={Astro.currentLocale ?? 'en'}>
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width" />
<link rel="icon" type="image/png" href="/favicon.png" />
<link rel="sitemap" href="/sitemap-index.xml" />
<title>{title ? `${title} | ${trailingTitle}` : trailingTitle}</title>
</head>
<body>
<div class="navbar backdrop-blur fixed top-0 left-0 right-0 z-10">
<div class="px-5 flex-1">
<div class="flex-none">
<a class="btn btn-ghost text-xl flex items-center gap-2" href="/">
<Image
src={CompanyLogo}
alt="company logo"
class="h-8 w-8 p-1 bg-white rounded-lg shadow-sm"
/>
<span>Solsynth</span>
</a>
</div>
<div class="flex-1 flex justify-end">
<ul class="menu menu-horizontal px-1">
<li><a href="/posts">Explore</a></li>
</ul>
</div>
</div>
</div>
<main class="mt-[68px]">
<slot />
</main>
<footer class="bg-neutral text-neutral-content p-10 mt-32">
<div class="container mx-auto footer">
<aside>
<Image
src={CompanyLogo}
alt="company logo"
class="h-12 w-12 p-1 bg-white rounded-lg shadow-sm"
/>
<div class="flex flex-col">
<span class="font-bold text-lg">Solsynth LLC</span>
Building wonderful software since 2019.
<span class="font-mono text-xs mt-3">Powered by RoadSign v2</span>
<span class="font-mono text-xs">Capital v{version}</span>
<a href="https://status.solsynth.dev" class="mt-4">
<img
src="https://uptime.betterstack.com/status-badges/v1/monitor/1ki5r.svg"
/>
</a>
</div>
</aside>
<nav>
<h6 class="footer-title">Services</h6>
<a class="link link-hover" href="https://sn.solsynth.dev"> Solian </a>
<a class="link link-hover" href="https://files.solsynth.dev">
Solarfiles
</a>
<a class="link link-hover" href="https://git.solsynth.dev">
Solargit
</a>
</nav>
<nav>
<h6 class="footer-title">Legal</h6>
<a
class="link link-hover"
href={getRelativeLocaleUrl(locale, '/terms/user-agreements')}
>
User Agreements
</a>
<a
class="link link-hover"
href={getRelativeLocaleUrl(locale, '/terms/privacy-policy')}
>
Privacy Policy
</a>
<a
class="link link-hover"
href={getRelativeLocaleUrl(locale, '/terms')}
>
All Terms & Conditions
</a>
</nav>
</div>
</footer>
</body>
</html>
<style>
html,
body {
margin: 0;
width: 100%;
height: 100%;
}
</style>

1
src/lib/index.ts Normal file
View File

@ -0,0 +1 @@
// Reexport your entry components here

View File

@ -1,110 +0,0 @@
---
import { Image } from 'astro:assets'
import { Icon } from 'astro-icon/components'
import Layout from '@/layouts/Layout.astro'
import CompanyAsideImage from '@/assets/images/company-aside.webp'
import AppStoreGetImage from '@/assets/images/app-store/get-it-on-black.svg'
import ProductSnPreviewImage from '@/assets/images/products/solar-network.webp'
---
<Layout>
<div class="section container mx-auto grid-cols-1 lg:grid-cols-3" id="intro">
<div
class="sub-section flex flex-col items-end justify-center lg:col-span-1"
>
<h1 class="text-4xl font-bold text-right">Solsynth LLC</h1>
<p class="text-lg text-right">
A vibrant creating wonderful software and hope the future will be
brighter.
</p>
<a class="link flex items-center gap-1 mt-2" href="#work-featured">
<span>See some of our works</span>
<Icon name="material-symbols:arrow-downward" />
</a>
</div>
<div class="sub-section flex items-center lg:col-span-2">
<Image
src={CompanyAsideImage}
alt="galaxy"
class="rounded-lg shadow-xl"
/>
</div>
</div>
<div class="section-flex py-12 shadow-lg bg-base-300" id="work-featured">
<div class="section container mx-auto grid-cols-1 lg:grid-cols-3">
<div
class="sub-section flex flex-col items-start lg:items-end justify-center lg:col-span-1"
>
<div class="badge badge-primary flex gap-1 items-center mb-2">
<Icon name="material-symbols:star" />
<span>Featured Project</span>
</div>
<h2 class="text-3xl font-bold lg:text-right">Solar Network</h2>
<p class="text-lg lg:text-right">
The next generation social network. But not only for social media.
</p>
<blockquote
class="text-md lg:text-right bg-neutral text-neutral-content px-7 py-5 rounded-xl font-mono mt-2"
>
Social Network, Redefined.
</blockquote>
<div class="flex gap-3 mt-4 items-center text-right">
<span
class="opacity-75 text-xs max-lg:order-last"
style="line-height: 1"
>
Also supports Android, Windows, and any modern web browser
</span>
<a
href="https://apps.apple.com/us/app/solian/id6499032345?itscg=30200&itsct=apps_box_link&mttnsubad=6499032345"
>
<Image src={AppStoreGetImage} alt="get it on app store" />
</a>
</div>
<a
class="link flex items-center gap-1 mt-3"
href="/products/solar-network"
>
<span>Learn more about Solar Network</span>
<Icon name="material-symbols:arrow-right-alt" />
</a>
</div>
<div class="sub-section flex items-center lg:col-span-2">
<Image
src={ProductSnPreviewImage}
alt="solar network cross-platform preview"
class="rounded-lg shadow-xl"
/>
</div>
</div>
</div>
</Layout>
<style>
html,
body {
scroll-behavior: smooth;
}
.section {
min-height: 90vh;
width: 100%;
gap: 0 2rem;
padding: 0 1rem;
display: grid;
}
.section-flex {
width: 100%;
}
.sub-section {
padding: 1rem;
}
</style>

View File

@ -1,167 +0,0 @@
---
export const prerender = false
import sanitizeHtml from 'sanitize-html'
import { Icon } from 'astro-icon/components'
import { SEO } from 'astro-seo'
import { marked } from 'marked'
import Layout from '@/layouts/Layout.astro'
import AttachmentRenderer from '@/components/AttachmentRenderer.astro'
import { getAttachmentUrl, fetchAttachmentMeta } from '@/scripts/attachment'
const { slug } = Astro.params
const baseUrl = import.meta.env.PUBLIC_SOLAR_NETWORK_URL
const resp = await fetch(`${baseUrl}/cgi/co/posts/${slug?.replace('/', ':')}`)
if (resp.status !== 200) {
return new Response(null, { status: 404 })
}
const data = await resp.json()
const rawContent = await marked(data.body.content as string, {
breaks: data.type == 'story',
})
const content = sanitizeHtml(rawContent)
const attachments = await fetchAttachmentMeta(data.body.attachments)
const title = data.body?.title ? data.body.title : `Post #${data.id}`
const description =
data.body?.description ?? data.body?.content?.substring(0, 200) + '...'
const url =
data.alias && data.alias_prefix
? `https://solsynth.dev/posts/${data.alias_prefix}/${data.alias}`
: `https://solsynth.dev/posts/${data.id}`
---
<head>
<SEO
title={`${title} | Solar Network`}
description={description}
canonical={url}
charset='UTF-8'
openGraph={{
optional: {
siteName: 'Solar Network',
description,
video: getAttachmentUrl(
attachments.find((a) => a.mimetype.startsWith('video'))?.rid
),
audio: getAttachmentUrl(
attachments.find((a) => a.mimetype.startsWith('audio'))?.rid
),
},
basic: {
title,
type: 'article',
image: data.body?.thumbnail
? getAttachmentUrl(data.body.thumbnail)
: getAttachmentUrl(
attachments.find((a) => a.mimetype.startsWith('image'))?.rid
),
url,
},
article: {
publishedTime: new Date(data.created_at).toISOString(),
modifiedTime: new Date(data.updated_at).toISOString(),
authors: ['@' + data.publisher.name],
},
}}
twitter={{
card: 'summary_large_image',
title,
description,
creator: '@' + data.publisher.name,
image: data.body?.thumbnail
? getAttachmentUrl(data.body.thumbnail)
: getAttachmentUrl(
attachments.find((a) => a.mimetype.startsWith('image'))?.rid
),
}}
/>
</head>
<Layout title={title} trailingTitle="Solar Network">
<div role="alert" class="alert shadow-lg px-12 m-0 rounded-none mb-5">
<Icon
name="material-symbols:ungroup"
class="stroke-info fill-info h-6 w-6 shrink-0"
/>
<div>
<h3 class="font-bold">Open in the Solian</h3>
<div class="text-xs">
The most modern, user-friendly, and official Solar Network app.
</div>
</div>
<div class="flex gap-2">
<a class="btn btn-sm" href="/products/solar-network#downloads">Get</a>
<a class="btn btn-sm" href={`https://sn.solsynth.dev/posts/${data.id}`}
>Open</a
>
</div>
</div>
<div class="container lg:max-w-[75ch] px-8 mx-auto">
<div class="flex gap-4 items-center mb-5">
<div class="avatar">
<div class="w-12 rounded-full">
<img src={getAttachmentUrl(data.publisher.avatar)} alt="avatar" />
</div>
</div>
<div class="userinfo flex flex-col">
<span class="flex gap-2 items-baseline">
<span class="text-md font-bold">{data.publisher.nick}</span>
<span class="text-xs font-mono">@{data.publisher.name}</span>
</span>
<span class="text-sm line-clamp-2 overflow-ellipsis"
>{data.publisher.description}</span
>
</div>
</div>
{
data.repost_id && (
<div role="alert" class="alert mb-5 py-2 mx-[-4px]">
<Icon
name="material-symbols:format-quote"
class="stroke-info fill-info h-6 w-6 shrink-0"
/>
<span>
This post is reposting post{' '}
<span class="font-mono">#{data.repost_id}</span>
</span>
<div>
<a class="btn btn-sm" href={`/posts/${data.repost_id}`}>
See reposted post
</a>
</div>
</div>
)
}
<article>
<div class="prose max-w-none max-md:prose-lg min-w-0" set:html={content} />
{
attachments && (
<div
class="attachment-list mt-5 gap-4 grid grid-cols-1"
class:list={
attachments.length >= 2 ? 'md:grid-cols-2' : 'md:grid-cols-1'
}
>
{attachments.map((attachment) => (
<div class="attachment">
<AttachmentRenderer data={attachment} />
</div>
))}
</div>
)
}
</article>
</div>
</Layout>

View File

@ -1,149 +0,0 @@
---
export const prerender = false
import sanitizeHtml from 'sanitize-html'
import { Icon } from 'astro-icon/components'
import { marked } from 'marked'
import Layout from '@/layouts/Layout.astro'
import AttachmentRenderer from '@/components/AttachmentRenderer.astro'
import { getAttachmentUrl, fetchAttachmentMeta } from '@/scripts/attachment'
const page = parseInt(Astro.url.searchParams.get('page') ?? '1') || 1
async function getPosts() {
const baseUrl = import.meta.env.PUBLIC_SOLAR_NETWORK_URL
const res = await fetch(
`${baseUrl}/cgi/co/posts?take=10&offset=${Math.max(page - 1, 0) * 10}`
)
const data = await res.json()
const posts = await Promise.all(
data['data'].map(async (ele: any) => {
if (ele.body?.content) {
ele.body.content = await parseContent(
ele.body.content,
ele.type == 'story'
)
}
if (ele.body?.attachments) {
ele.body.attachments = await fetchAttachmentMeta(ele.body.attachments)
}
return ele
})
)
return posts
}
const posts = await getPosts()
async function parseContent(data: string, useBreaks: boolean = false) {
const rawContent = await marked(data, {
breaks: useBreaks,
})
return sanitizeHtml(rawContent)
}
---
<Layout title="Posts" trailingTitle='Solar Network'>
<div role="alert" class="alert shadow-lg px-12 m-0 rounded-none mb-5">
<Icon
name="material-symbols:ungroup"
class="stroke-info fill-info h-6 w-6 shrink-0"
/>
<div>
<h3 class="font-bold">Open in the Solian</h3>
<div class="text-xs">
The most modern, user-friendly, and official Solar Network app.
</div>
</div>
<div class="flex gap-2">
<a class="btn btn-sm" href="/products/solar-network#downloads">Get</a>
<a class="btn btn-sm" href="https://sn.solsynth.dev/posts">Open</a>
</div>
</div>
<div
class="container max-w-[85ch] mx-auto mt-[15vh] px-12 flex flex-col gap-4"
>
<h1 class="text-2xl font-bold">Posts</h1>
<p>Explore the posts all over the Solar Network.</p>
<div class="flex flex-col gap-4 mt-4 mx-[-16px]">
{
posts.map((ele: any) => (
<a href={`/posts/${ele.id}`}>
<div class="card bg-base-100 w-full border-neutral border">
<div class="card-body">
<div class="flex gap-4 items-center mb-5">
<div class="avatar">
<div class="w-12 rounded-full">
<img
src={getAttachmentUrl(ele.publisher.avatar)}
alt="avatar"
/>
</div>
</div>
<div class="userinfo flex flex-col">
<span class="flex gap-2 items-baseline">
<span class="text-md font-bold">
{ele.publisher.nick}
</span>
<span class="text-xs font-mono">
@{ele.publisher.name}
</span>
</span>
<span class="text-sm overflow-ellipsis">
{new Date(ele.created_at).toLocaleString()}
</span>
</div>
</div>
{ele.body.title && (
<h2 class="card-title">
{ele.body?.title ?? `Post #${ele.id}`}
</h2>
)}
<article>
<div
class="prose max-w-none max-md:prose-lg max-w-0"
set:html={ele.body?.content ?? ''}
/>
{ele.body?.attachments && (
<div
class="attachment-list mt-5 gap-4 grid grid-cols-1"
class:list={
ele.body.attachments.length >= 2
? 'md:grid-cols-2'
: 'md:grid-cols-1'
}
>
{ele.body.attachments.map((attachment: any) => (
<div class="attachment">
<AttachmentRenderer data={attachment} />
</div>
))}
</div>
)}
</article>
</div>
</div>
</a>
))
}
<div class="flex justify-center items-center mt-12">
<div class="join">
<a
class="join-item btn"
class:list={page == 1 ? 'btn-disabled' : ''}
href={`/posts?page=${page - 1}`}>«</a
>
<button class="join-item btn">Page {page}</button>
<a class="join-item btn" href={`/posts?page=${page + 1}`}>»</a>
</div>
</div>
</div>
</div>
</Layout>

View File

@ -1,176 +0,0 @@
---
import { Image } from 'astro:assets'
import { Icon } from 'astro-icon/components'
import Layout from '@/layouts/Layout.astro'
import ProductSnPreviewImage from '../../assets/images/products/solar-network-alpha.webp'
---
<Layout title="Solar Network">
<div class="container mx-auto mt-[35vh]" id="intro">
<div class="text-center">
<h1 class="text-4xl font-bold">Solar Network</h1>
<p>The next generation Social Network platform.</p>
<div class="flex justify-center gap-2 mt-5">
<a class="btn btn-primary" href="#downloads">
Download <Icon name="material-symbols:download" size={20} />
</a>
</div>
</div>
<Image
src={ProductSnPreviewImage}
alt="solar network cross-platform preview"
class="mt-5"
/>
<div id="downloads" class="mt-24 text-center">
<div class="flex flex-col justify-center">
<h2 class="text-2xl font-bold">Downloads</h2>
</div>
<div class="flex flex-wrap mx-8 items-center justify-center gap-4 my-5">
<a
href="https://apps.apple.com/us/app/solian/id6499032345?itscg=30200&itsct=apps_box_link&mttnsubad=6499032345"
class="btn btn-secondary max-md:btn-wide"
>
<Icon name="simple-icons:appstore" />
iOS / macOS (App Store)
</a>
<a
href="https://testflight.apple.com/join/YJ0lmN6O"
class="btn btn-secondary btn-outline max-md:btn-wide"
>
<Icon name="simple-icons:apple" />
iOS / macOS (TestFlight)
</a>
<a
href="https://files.solsynth.dev/production01/solian/app-arm64-v8a-release.apk"
class="btn btn-secondary max-md:btn-wide"
>
<Icon name="simple-icons:android" />
Android (apk file)
</a>
<a
href="https://files.solsynth.dev/production01/solian/windows-x86_64-release.zip"
class="btn btn-secondary max-md:btn-wide"
>
<Icon name="simple-icons:windows" />
Windows (executable)
</a>
<a
href="https://sn.solsynth.dev"
class="btn btn-secondary btn-outline max-md:btn-wide"
>
<Icon name="material-symbols:globe" />
Web (browser)
</a>
</div>
<div class="mx-8">
<p class="opacity-80 mb-2">
You will download Solian, which is the official app made for Solar
Network.
</p>
<p class="opacity-75 text-sm">
Explore more platform distribution files on the{' '}
<a class="link" href="https://files.solsynth.dev/production01/solian"
>Solarfiles</a
>
</p>
<p class="opacity-75 text-sm">
Check out the Solian source code on{' '}
<a class="link" href="https://git.solsynth.dev/HyperNet/Surface"
>Solargit</a
>
</p>
</div>
</div>
<div id="faq" class="mt-24">
<div class="flex text-center justify-center">
<h2 class="text-2xl font-bold">Frequently Asked Questions</h2>
</div>
<div
class="max-w-[85ch] mx-auto bg-neutral text-neutral-content shadow-lg rounded-lg p-2 mt-5"
>
<div class="join join-vertical w-full">
<div class="collapse collapse-arrow join-item">
<input type="radio" name="my-accordion-4" checked="checked" />
<div class="collapse-title text-xl font-medium">
What's the relationship between Solar Network and Solian?
</div>
<div class="collapse-content">
<p>
Solian is the official app made for Solar Network. And the Solar
Network is the official HyperNet instance hosted by Solsynth
LLC.
</p>
<p>
For simple, Solian is the app, and the Solar Network is the
platform.
</p>
</div>
</div>
<div class="collapse collapse-arrow join-item">
<input type="radio" name="my-accordion-4" checked="checked" />
<div class="collapse-title text-xl font-medium">
What's the relationship between Solar Network and HyperNet?
</div>
<div class="collapse-content">
<p>
HyperNet is the entire project including frontend app (also
knowns as Solian for public) and the backend server. And the
Solar Network is the official HyperNet instance which hosted and
managed by Solsynth LLC who developed the HyperNet Project.
</p>
</div>
</div>
<div class="collapse collapse-arrow join-item">
<input type="radio" name="my-accordion-4" />
<div class="collapse-title text-xl font-medium">
Which rules do I need to follow while using Solar Network?
</div>
<div class="collapse-content">
<p>
Check out our{' '}
<a href="/terms/user-agreements" class="link">
User Agreements
</a>
for a detailed explanation of what you can do and cannot do on Solar
Network. If you violate any of these rules, we have the right to
suspend or terminate your account.
</p>
</div>
</div>
<div class="collapse collapse-arrow join-item">
<input type="radio" name="my-accordion-4" />
<div class="collapse-title text-xl font-medium">
If I have any question about Solar Network, where can I get help?
</div>
<div class="collapse-content">
<p>
Feel free to email us at{' '}
<a href="mailto:lily@solsynth.dev" class="link">
<address>lily@solsynth.dev</address>
</a>
Our customer service team will try our best to help you solve your
issue.
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</Layout>
<style>
html,
body {
scroll-behavior: smooth;
}
</style>

View File

@ -1,52 +0,0 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout title="Terms & Conditions">
<div
class="container max-w-[85ch] mx-auto mt-[25vh] px-12 flex flex-col gap-4"
>
<h1 class="text-2xl font-bold">Terms & Conditions</h1>
<p>
This place is the collections of all the terms and conditions that you
will have to agree to in order to use our products.
</p>
<p>
We're trying to make it as simple as possible. And it's good for both of
us. You do not need care about this in normal. Just makes our lawyers
happy. <i>Do we really have a lawyer?</i>
</p>
<p>
The information here may changed from time to time. Please refresh to
check this page for the latest version.
</p>
<div class="flex flex-col gap-4 mt-4 mx-[-16px]">
<a href="/terms/user-agreements">
<div class="card bg-base-100 w-full border-neutral border">
<div class="card-body">
<h2 class="card-title">User Agreements</h2>
<p>
The User Agreements for users who using the Solar Network and
other products from us.
</p>
</div>
</div>
</a>
<a href="/terms/privacy-policy">
<div class="card bg-base-100 w-full border-neutral border">
<div class="card-body">
<h2 class="card-title">Privacy Policy</h2>
<p>
The Privacy Policy shows we how to process and handle the data
provided by you.
</p>
</div>
</div>
</a>
</div>
</div>
</Layout>

View File

@ -1,61 +0,0 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout title="User Agreements">
<div
class="container max-w-[85ch] mx-auto mt-[25vh] px-12 flex flex-col gap-4"
>
<h1 class="text-4xl font-bold">Privacy Policy</h1>
<article class="prose prose-lg max-w-none mt-5">
<h2 id="introduction">Introduction</h2>
<p>
We take your privacy seriously. This privacy policy outlines the types
of personal information we collect, how we use it, and the measures we
take to protect your data.
</p>
<h2 id="information-collection">Information Collection</h2>
<p>
We collect personal information only when necessary to provide our
services. This may include your name, email address, and other relevant
details.
</p>
<h2 id="use-of-information">Use of Information</h2>
<p>We use your personal information to:</p>
<ul>
<li>Provide and improve our services</li>
<li>Communicate with you about updates or important information</li>
<li>Ensure compliance with legal obligations</li>
</ul>
<h2 id="data-sharing">Data Sharing</h2>
<p>
We do not sell, trade, or share your personal information with third
parties except as required by law.
</p>
<h2 id="data-security">Data Security</h2>
<p>
We implement robust security measures to protect your personal
information from unauthorized access, alteration, disclosure, or
destruction.
</p>
<h2 id="your-rights">Your Rights</h2>
<p>You have the right to:</p>
<ul>
<li>Access the personal information we hold about you</li>
<li>Request corrections to your personal information</li>
<li>Request the deletion of your personal information</li>
</ul>
<h2 id="contact-us">Contact Us</h2>
<p>
If you have any questions or concerns about this privacy policy or our
data practices, please contact us at lily@solsynth.dev.
</p>
<h2 id="changes-to-this-policy">Changes to This Policy</h2>
<p>
We may update this privacy policy from time to time. Any changes will be
posted on this page, and we will notify you of any significant changes.
</p>
</article>
</div>
</Layout>

View File

@ -1,157 +0,0 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout title="User Agreements">
<div
class="container max-w-[85ch] mx-auto mt-[25vh] px-12 flex flex-col gap-4"
>
<h1 class="text-4xl font-bold">User Agreements</h1>
<article class="prose prose-lg max-w-none mt-5">
<p>
This Agreement applies to all Solsynth LLC products, including but not
limited to Solar Network, Solian, DietaryGuard, AceField.
</p>
<h2 id="provision-and-discontinuance-of-service">
Provision and Discontinuance of Service
</h2>
<p>
Solsynth LLC will provide equal service to all living things in the
world, including grasshoppers. We also reserve the right to stop service
to any user. We do not require prior notice for discontinuing services
to some users.
</p>
<h2 id="user-generated-content">User Generated Content</h2>
<p>
Any content posted on Solar Network (including but not limited to posts,
articles, attachments) grants Solsynth LLC the right to display it by
default. Unless otherwise stated by the user, all rights are reserved by
the original poster, and reprints should be authorized by the original
poster.
</p>
<h3 id="reproduction-recognition">Reproduction Recognition</h3>
<p>
Unless specifically stated by the poster, all content is subject to the
definition of reprint in this section.
</p>
<p>
Republishing means uploading the content of the original post to another
platform or to the Solar Network, either unchanged or with minor
modifications, provided that simultaneous reposting of the post,
embedded components, and links to the presentation do not constitute
republishing. Republishing also requires attribution when authorized by
the original poster.
</p>
<h3 id="freedom-of-speech">Freedom of Speech</h3>
<p>
We do not remove user-generated content except in cases of misuse of
resources. We will not ask any user to remove any content.
</p>
<p>
However, Solsynth LLC reserves the right to restrict and stop the
display of content to the public that violates community guidelines
(e.g., obscenity, violence, gore, anti-social, terrorist organizations,
etc.).
</p>
<p>
Although you have 100% freedom of speech on Solar Network. However,
please be aware that freedom of speech does not mean that you will not
be held accountable for what you say.
</p>
<h4 id="restriction-and-discontinuation">
Restriction and Discontinuation
</h4>
<ul>
<li>
<p>
Restriction of Display: Discontinuation of related tweets, while
retaining the right to access them directly through resource
identifiers and sharing links.
</p>
</li>
<li>
<p>
Cease display: stop all access to the resource by anyone other than
the author.
</p>
</li>
</ul>
<h2 id="resource-misuse-prevention-policy">
Resource Misuse Prevention Policy
</h2>
<p>
Although there are no capacity limitations for using Solar Network&#39;s
data hosting services, resources determined to be abusive will be
disenfranchised from some features. Solsynth LLC reserves the right to
reclaim space on previously uploaded resources for deletion.
</p>
<h3 id="determination-of-misuse">Determination of Misuse</h3>
<ul>
<li>
Uploading without using: e.g. uploading excessive attachments in Solar
Network&#39;s Interactive Attachment Pool and not linking them to
posts.
</li>
<li>
Meaningless Posts: meaningless shuffling or wasting of Solar
Network&#39;s storage resources
</li>
<li>
Misuse: using Solar Network&#39;s public resources as if they were
your own dedicated pool (see the Wiki&#39;s Dedicated Pools page for
details).
</li>
</ul>
<p>
The Solsynth Trust &amp; Safety Team is ultimately responsible for
determining misuse.
</p>
<h2 id="secondary-releases">Secondary Releases</h2>
<p>
A secondary release is when our assets are downloaded and re-hosted on
another site.
</p>
<h3 id="product-secondary-release">Product Secondary Release</h3>
<p>
Unless otherwise stated, Solsynth LLC products are not available for
secondary distribution, please do not download our product builds and
upload them twice to another site. Please do not download our product
builds and upload them to other sites. <strong
>Secondary distribution for commercial use is not permitted.
</strong>.
</p>
<p>
What you should do is post a link to our product on another site. Or use
the embedded component. And indicate Solsynth LLC All Rights Reserved.
</p>
<p>
If you want to build a mirror site of our products, please contact us to
waive this rule.
</p>
<h3 id="secondary-distribution-of-source-code">
Secondary distribution of source code
</h3>
<p>
We do not allow any form of redistribution of source code (except for
Forks). This includes, but is not limited to, mirroring code
repositories on GitHub or the Solsynth Code Repository to other Git
providers such as GitLab, Gitee, and so on.
<strong>Selling source code twice is not allowed. </strong>
</p>
<p>
For more information on source code usage regulations, please follow the
open source license used by the project.
</p>
<p>
If you would like to set up a mirror of our source code, please contact
us to waive this policy.
</p>
<hr />
<p>
Solsynth LLC reserves the right of final interpretation of this
agreement.
</p>
</article>
</div>
</Layout>

View File

@ -1,39 +0,0 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout title="Terms & Conditions">
<div
class="container max-w-[85ch] mx-auto mt-[25vh] px-2 flex flex-col gap-4"
>
<h1 class="text-2xl font-bold">条款和条件</h1>
<p>这里罗列了您使用我们的产品将需要同意的所有条款和条件。</p>
<p>
我们正努力让事情尽可能简单。这对我们双方都有好处。通常情况下你不需要关心这件事。只是为了让我们的律师高兴。
<i>我们真的有律师吗?</i>
</p>
<p>此处的信息可能会不时更改。请刷新 查看此页面以获取最新版本。</p>
<div class="flex flex-col gap-4 mt-4 mx-[-16px]">
<a href="/terms/user-agreements">
<div class="card bg-base-100 w-full border-neutral border">
<div class="card-body">
<h2 class="card-title">用户协议</h2>
<p>使用 Solar Network 和 我们其他产品的用户须遵守的用户协议。</p>
</div>
</div>
</a>
<a href="/terms/privacy-policy">
<div class="card bg-base-100 w-full border-neutral border">
<div class="card-body">
<h2 class="card-title">隐私政策</h2>
<p>隐私政策向我们展示了如何处理和处理您提供的数据。</p>
</div>
</div>
</a>
</div>
</div>
</Layout>

View File

@ -1,51 +0,0 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout title="User Agreements">
<div
class="container max-w-[85ch] mx-auto mt-[25vh] px-12 flex flex-col gap-4"
>
<h1 class="text-4xl font-bold">隐私政策</h1>
<article class="prose prose-lg max-w-none mt-5">
<h2 id="introduction">简介</h2>
<p>
我们非常重视您的隐私。本隐私政策概述了我们收集的个人信息类型、使用方式以及我们采取的保护措施。
</p>
<h2 id="information-collection">信息收集</h2>
<p>
我们仅在提供服务时收集必要的个人信息。这可能包括您的姓名、电子邮件地址以及其他相关信息。
</p>
<h2 id="use-of-information">信息使用</h2>
<p>我们使用您的个人信息来:</p>
<ul>
<li>提供和改进我们的服务</li>
<li>与您沟通更新或重要信息</li>
<li>确保遵守法律义务</li>
</ul>
<h2 id="data-sharing">数据共享</h2>
<p>我们不会出售、交易或与第三方分享您的个人信息,法律要求除外。</p>
<h2 id="data-security">数据安全</h2>
<p>
我们实施了强有力的安全措施,以保护您的个人信息免受未经授权的访问、更改、披露或销毁。
</p>
<h2 id="your-rights">您的权利</h2>
<p>您有权:</p>
<ul>
<li>访问我们持有的关于您的个人信息</li>
<li>请求更正您的个人信息</li>
<li>请求删除您的个人信息</li>
</ul>
<h2 id="contact-us">联系我们</h2>
<p>
如果您对本隐私政策或我们的数据处理方式有任何疑问或顾虑,请通过
lily@solsynth.dev 与我们联系。
</p>
<h2 id="changes-to-this-policy">政策变更</h2>
<p>
我们可能会不时更新本隐私政策。任何更改将发布在此页面上,且我们会通知您任何重大更改。
</p>
</article>
</div>
</Layout>

View File

@ -1,101 +0,0 @@
---
import Layout from '@/layouts/Layout.astro'
---
<Layout title="User Agreements">
<div
class="container max-w-[85ch] mx-auto mt-[25vh] px-12 flex flex-col gap-4"
>
<h1 class="text-4xl font-bold">用户协议</h1>
<article class="prose prose-lg max-w-none mt-5">
<p>
本协议适用于所有 Solsynth LLC 的产品,包括但不限于 Solar
Network、Solian、DietaryGuard、AceField。
</p>
<h2 id="provision-and-discontinuance-of-service">服务的提供和停止</h2>
<p>
Solsynth LLC 将向世界上所有的生物提供同等的服务,包括草履虫。
同时也保留向任意用户停止提供服务的权利。关于停止部分用户的服务,我们不需要提前通知。
</p>
<h2 id="user-generated-content">用户生成内容</h2>
<p>
任意发布在 Solar Network
上的内容(包括但不限于帖子、文章、附件)都默认授权 Solsynth LLC
予以展示的权利。
除非用户特别声明,所有内容均为原帖主保留所有权利,转载请先向原帖主授权。
</p>
<h3 id="reproduction-recognition">转载的认定</h3>
<p>无帖主特别声明,所有内容均适用本条转载的定义。</p>
<p>
转载指将原帖的内容原封不动或略作改动上传到别的平台或 Solar
Network。但同时转帖、嵌入式组件与展示展开的链接不构成转载。
转载即时在原帖主授权的情况下也需表明出处。
</p>
<h3 id="freedom-of-speech">言论的自由</h3>
<p>
除滥用资源的情况,我们不会将用户生成内容进行删除。也不会做出要求任何用户删除任何内容的要求。
</p>
<p>
但 Solsynth LLC
始终保留对于违反社区准则的内容(如淫秽、暴力、血腥、反社会、恐怖组织等)限制与停止向公众展示的权利。
</p>
<p>
尽管在 Solar Network 上你拥有 100%
的言论自由。但还请清楚,言论自由不代表不用对自己的言论负责。
</p>
<h4 id="restriction-and-discontinuation">限制展示与停止展示</h4>
<ul>
<li>
<p>
限制展示:停止相关的推送,但是任保留直接通过资源标识符和分享连接访问的权利
</p>
</li>
<li><p>停止展示:全面停止除作者之外任何人访问该资源的权利</p></li>
</ul>
<h2 id="resource-misuse-prevention-policy">防止资源滥用条例</h2>
<p>
尽管使用 Solar Network
的数据托管服务并无任何的容量限制,但经过判定的滥用资源将会被取消使用部分功能的权利。
并且之前上传的资源 Solsynth LLC 有权对其进行删除空间回收。
</p>
<h3 id="determination-of-misuse">滥用的认定</h3>
<ul>
<li>
传而不用:例如在 Solar Network 的 Interactive
附件池中过度上传附件并不将附件与帖子连接
</li>
<li>无意义帖:无意义洗版或浪费 Solar Network 的存储资源</li>
<li>
走错片场:将 Solar Network
公有资源当作自己的专用资源池使用(详见维基《专用资源池》页面)
</li>
</ul>
<p>滥用的认定最终解释权归属于 Solsynth Trust &amp; Safety Team</p>
<h2 id="secondary-releases">二次发布</h2>
<p>二次发布指将我们的资产下载并重新托管到别站。</p>
<h3 id="product-secondary-release">制品二次发布</h3>
<p>
除特殊声明Solsynth LLC
的产品均不允许二次发布,请勿将我们的产品构建下载并二次上传于其他站点。
<strong>二次作为商用发布更是不允许的。</strong>
</p>
<p>
你应该做的是将我们的产品链接贴上他站。或使用嵌入式组件。并且表明
Solsynth LLC 版权所有。
</p>
<p>若您想搭建我们制品的镜像站,请与我们取得联系以豁免此条例。</p>
<h3 id="secondary-distribution-of-source-code">源码二次发布</h3>
<p>我们不允许任何形式的源码二次发布Fork 除外)。</p>
<p>
包括但不限于,将 GitHub 或 Solsynth Code Repository 上的代码仓库镜像于
GitLab、Gitee 等其他 Git 提供者。
<strong>二次售卖源码更是不允许的。</strong>
</p>
<p>关于更多的源码使用条例,请遵循项目使用的开源许可证。</p>
<p>若您想搭建我们源码的镜像站,请与我们取得联系以豁免此条例。</p>
<hr />
<p>Solsynth LLC 保留对此协议的最终解释权</p>
</article>
</div>
</Layout>

14
src/routes/+layout.svelte Normal file
View File

@ -0,0 +1,14 @@
<script lang="ts">
import '../app.css';
import NavBar from '../components/navigation/NavBar.svelte';
import Footer from '../components/navigation/Footer.svelte';
</script>
<NavBar />
<main>
<slot />
</main>
<Footer />

61
src/routes/+page.svelte Normal file
View File

@ -0,0 +1,61 @@
<div class="container px-12 mx-auto">
<div class="landing-slide">
<div class="landing-slide-first">
<div
class="aspect-square w-[128px] bg-neutral rounded-xl mb-6 ml-[-4px] flex justify-center items-center"
>
<enhanced:img src="../assets/solar.svg" alt="Studio Avatar" class="w-[90px] h-[96px] block" />
</div>
<h2 class="text-2xl">Hi, there!</h2>
<h1 class="text-6xl font-bold">We're Solsynth</h1>
<section class="mt-8 text-lg">
<p>
We're the world youngest Software <strike>Company</strike> Studio who
make the software that everyone love.
</p>
</section>
</div>
<div class="landing-slide-second">
<div class="card w-full md:w-5/6 bg-base-100 shadow-xl">
<div class="card-body pb-0">
<h2 class="card-title">Products!</h2>
<p>Take a look of all our lovely products!</p>
</div>
<div class="divider"></div>
<div class="card-body pt-0 grid grid-cols-4">
<a href="/products/solar-network">
<enhanced:img
src="../assets/solian.png"
alt="Solar Network"
class="min-w-[64px] min-h-[64px] w-[64px] h-[64px] aspect-square block"
/>
</a>
</div>
</div>
</div>
</div>
</div>
<style>
.landing-slide {
gap: 1rem;
height: 40rem;
display: grid;
align-items: center;
grid-template-columns: 1fr;
}
@media (min-width: 720px) {
.landing-slide {
grid-template-columns: 1fr 1fr;
}
.landing-slide-second {
display: flex;
justify-content: end;
}
}
</style>

View File

@ -0,0 +1,255 @@
<div class="grid grid-cols-1 lg:grid-cols-4 gap-3 px-12 py-5">
<div class="feature-card horizontal-layout">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M17.25 6.75 22.5 12l-5.25 5.25m-10.5 0L1.5 12l5.25-5.25m7.5-3-4.5 16.5"
></path>
</svg>
<section>
<h2 class="card-title">Open-source</h2>
<p>Entire project has been open-sourced under <b>AGPLv3</b> license.</p>
</section>
</div>
<div class="feature-card horizontal-layout">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5"
></path>
</svg>
<section>
<h2 class="card-title">Large Attachments</h2>
<p>Up to <b>1024MB</b> per attachment upload limit.</p>
</section>
</div>
<div class="lg:col-span-2 feature-card horizontal-layout">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M8.625 9.75a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H8.25m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0H12m4.125 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Zm0 0h-.375m-13.5 3.01c0 1.6 1.123 2.994 2.707 3.227 1.087.16 2.185.283 3.293.369V21l4.184-4.183a1.14 1.14 0 0 1 .778-.332 48.294 48.294 0 0 0 5.83-.498c1.585-.233 2.708-1.626 2.708-3.228V6.741c0-1.602-1.123-2.995-2.707-3.228A48.394 48.394 0 0 0 12 3c-2.392 0-4.744.175-7.043.513C3.373 3.746 2.25 5.14 2.25 6.741v6.018Z"
></path>
</svg>
<section>
<h2 class="card-title">Freedom of Speech</h2>
<p>
According to our principles, your freedom of speech cannot be taken
away by anyone.
<b>
We will never delete any post from any user, even if we are coerced
by others.
</b>
</p>
</section>
</div>
<div
class="lg:row-span-2 feature-card horizontal-layout lg:vertical-layout"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.023 9.348h4.992v-.001M2.985 19.644v-4.992m0 0h4.992m-4.993 0 3.181 3.183a8.25 8.25 0 0 0 13.803-3.7M4.031 9.865a8.25 8.25 0 0 1 13.803-3.7l3.181 3.182m0-4.991v4.99"
></path>
</svg>
<section>
<h2 class="card-title">100% Recyclable</h2>
<p>
All of our code are completely recyclable. All of them written by
child labor and without salary. We even already achieved the goal of
<b>Carbon Neutral</b>. Because we didn't produce any of them at all.
</p>
</section>
</div>
<div
class="lg:col-span-2 max-lg:order-last keypoint-card horizontal-layout items-center"
>
<enhanced:img
src="../../../assets/solian.png"
alt="Solar Network"
class="w-[64px] h-[64px] lg:ml-12"
/>
<section class="lg:mr-12">
<h2 class="card-title text-3xl">Solar Network</h2>
<p>Link the entire Solar System together, forever.</p>
</section>
</div>
<div class="feature-card horizontal-layout">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M15.182 15.182a4.5 4.5 0 0 1-6.364 0M21 12a9 9 0 1 1-18 0 9 9 0 0 1 18 0ZM9.75 9.75c0 .414-.168.75-.375.75S9 10.164 9 9.75 9.168 9 9.375 9s.375.336.375.75Zm-.375 0h.008v.015h-.008V9.75Zm5.625 0c0 .414-.168.75-.375.75s-.375-.336-.375-.75.168-.75.375-.75.375.336.375.75Zm-.375 0h.008v.015h-.008V9.75Z"
></path>
</svg>
<section>
<h2 class="card-title">Reaction</h2>
<p>
No more like and dislike, now you can express your emotion with our
brand new reaction system!
</p>
</section>
</div>
<div class="lg:col-span-2 feature-card horizontal-layout">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="m3.75 13.5 10.5-11.25L12 10.5h8.25L9.75 21.75 12 13.5H3.75Z"
></path>
</svg>
<section>
<h2 class="card-title">Blazing Fast</h2>
<p>
Our server proudly powered by Golang and App made with flutter. All of
these stuff make your scrolling, clicking and typing smooth like
butter. Without any lagging.
<i>By the way, we cannot eliminate the network delay.</i>
</p>
</section>
</div>
<div class="feature-card horizontal-layout">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="icon"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M16.5 10.5V6.75a4.5 4.5 0 1 0-9 0v3.75m-.75 11.25h10.5a2.25 2.25 0 0 0 2.25-2.25v-6.75a2.25 2.25 0 0 0-2.25-2.25H6.75a2.25 2.25 0 0 0-2.25 2.25v6.75a2.25 2.25 0 0 0 2.25 2.25Z"
></path>
</svg>
<section>
<h2 class="card-title">Safe and uninspectable</h2>
<p>
All your data has been <b>encrypted</b> during the network transmission.
No more goverment and internet provider inspect.
</p>
</section>
</div>
</div>
<div class="px-12 pb-5 flex gap-3 justify-center items-center">
<a
class="btn btn-primary"
href="https://git.solsynth.dev/Hydrogen/Solian/releases"
>
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3"
></path>
</svg>
Download now
</a>
<a class="btn btn-secondary" href="https://lian.solsynth.dev">
<svg
xmlns="http://www.w3.org/2000/svg"
fill="none"
viewBox="0 0 24 24"
stroke-width="1.5"
stroke="currentColor"
class="size-6"
>
<path
stroke-linecap="round"
stroke-linejoin="round"
d="M13.5 6H5.25A2.25 2.25 0 0 0 3 8.25v10.5A2.25 2.25 0 0 0 5.25 21h10.5A2.25 2.25 0 0 0 18 18.75V10.5m-10.5 6L21 3m0 0h-5.25M21 3v5.25"
></path>
</svg>
Open in browser
</a>
</div>
<style>
.feature-card {
@apply p-5 rounded-2xl bg-base-200;
}
.keypoint-card {
@apply p-5 bg-neutral text-neutral-content rounded-2xl shadow-lg;
}
.horizontal-layout {
@apply flex gap-4;
}
.vertical-layout {
@apply flex-col gap-4;
}
.vertical-layout section {
@apply px-2.5 mt-3;
}
.icon {
@apply w-[48px] h-[48px] m-[8px] flex-shrink-0;
}
</style>

View File

@ -1,26 +0,0 @@
export function getAttachmentUrl(identifier?: string): string {
if (!identifier) return ''
if (identifier.startsWith('http')) {
return identifier
}
const baseUrl = import.meta.env.PUBLIC_SOLAR_NETWORK_URL
return `${baseUrl}/cgi/uc/attachments/${identifier}`
}
export async function fetchAttachmentMeta(
identifiers: string[]
): Promise<any[]> {
if (!identifiers) return []
const baseUrl = import.meta.env.PUBLIC_SOLAR_NETWORK_URL
const resp = await fetch(
`${baseUrl}/cgi/uc/attachments?take=${
identifiers.length
}&id=${identifiers.join(',')}`
)
if (resp.status !== 200) {
throw new Error(`Failed to fetch attachment meta: ${await resp.text()}`)
}
const out = await resp.json()
return out['data']
}

BIN
static/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

17
svelte.config.js Normal file
View File

@ -0,0 +1,17 @@
import adapter from '@sveltejs/adapter-netlify';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
/** @type {import('@sveltejs/kit').Config} */
const config = {
// Consult https://kit.svelte.dev/docs/integrations#preprocessors
// for more information about preprocessors
preprocess: vitePreprocess(),
kit: {
adapter: adapter({
edge: true
})
}
};
export default config;

37
tailwind.config.js Normal file
View File

@ -0,0 +1,37 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{html,js,svelte,ts}'],
daisyui: {
themes: [
{
light: {
"primary": "#3F51B5",
"secondary": "#0091EA",
"accent": "#00BFA5",
"neutral": "#2c323b",
"base-100": "#f3f4f6",
"info": "#0091EA",
"success": "#00C853",
"warning": "#FF6D00",
"error": "#D50000",
},
dark: {
"primary": "#3F51B5",
"secondary": "#0091EA",
"accent": "#00BFA5",
"neutral": "#2c323b",
"base-100": "#1e2329",
"info": "#0091EA",
"success": "#00C853",
"warning": "#FF6D00",
"error": "#D50000",
}
}
],
},
plugins: [
require('@tailwindcss/typography'),
require('daisyui'),
],
};

View File

@ -1,38 +0,0 @@
/** @type {import('tailwindcss').Config} */
export default {
content: ['./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}'],
theme: {
extend: {},
},
plugins: [require('@tailwindcss/typography'), require('daisyui')],
daisyui: {
themes: [
{
light: {
primary: '#3f51b5',
secondary: '#4ba6ee',
accent: '#03a9f4',
neutral: '#4b5563',
'base-100': '#ffffff',
info: '#4994ec',
success: '#67ad5b',
warning: '#f5c344',
error: '#e15241',
},
},
{
dark: {
primary: '#3f51b5',
secondary: '#4ba6ee',
accent: '#03a9f4',
neutral: '#1f2937',
'base-100': '#000011',
info: '#4994ec',
success: '#67ad5b',
warning: '#f5c344',
error: '#e15241',
},
},
],
},
}

View File

@ -1,17 +1,15 @@
{
"extends": "astro/tsconfigs/strict",
"include": [
".astro/types.d.ts",
"**/*",
"src/**/*.d.ts",
"src/**/*.ts",
"src/**/*.astro"
],
"exclude": ["dist"],
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
"extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": {
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"module": "NodeNext",
"moduleResolution": "NodeNext"
}
}

7
vite.config.ts Normal file
View File

@ -0,0 +1,7 @@
import { sveltekit } from '@sveltejs/kit/vite';
import { enhancedImages } from '@sveltejs/enhanced-img';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [enhancedImages(), sveltekit()]
});