diff --git a/.github/workflows/affine-keck.yml b/.github/workflows/affine-keck.yml.bak
similarity index 100%
rename from .github/workflows/affine-keck.yml
rename to .github/workflows/affine-keck.yml.bak
diff --git a/.github/workflows/livedemo.yml b/.github/workflows/livedemo.yml
new file mode 100644
index 0000000000..d5ed5b9987
--- /dev/null
+++ b/.github/workflows/livedemo.yml
@@ -0,0 +1,87 @@
+name: Build AFFiNE-Local
+
+on:
+ push:
+ branches: [master]
+ # pull_request:
+ # branches: [master]
+
+# Cancels all previous workflow runs for pull requests that have not completed.
+# See https://docs.github.com/en/actions/using-jobs/using-concurrency
+concurrency:
+ # The concurrency group contains the workflow name and the branch name for
+ # pull requests or the commit hash for any other events.
+ group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.sha }}
+ cancel-in-progress: true
+
+env:
+ REGISTRY: ghcr.io
+ NAMESPACE: toeverything
+ AFFINE_IMAGE_NAME: LIVEDEMO
+ IMAGE_TAG_LATEST: nightly-latest
+ LOCAL_CACHE: localhost:5000/toeverything/relocate:latest
+
+jobs:
+ ligo-virgo:
+ runs-on: self-hosted
+ environment: development
+ permissions:
+ contents: read
+ packages: write
+
+ services:
+ registry:
+ image: registry:2
+ ports:
+ - 5000:5000
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v2
+
+ - name: Log in to the Container registry
+ uses: docker/login-action@v2
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v1
+
+ - name: Set up Docker Buildx
+ id: buildx
+ uses: docker/setup-buildx-action@v1
+ with:
+ driver-opts: network=host
+
+ - name: Extract metadata (tags, labels) for Docker (AFFiNE-Local)
+ id: meta_affine
+ uses: docker/metadata-action@v4
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.NAMESPACE }}/${{ env.AFFINE_IMAGE_NAME }}
+ tags: ${{ env.IMAGE_TAG_LATEST }}
+
+ - name: Build and push Docker image (AFFINE-Local)
+ uses: docker/build-push-action@v3
+ env:
+ HUBSPOT_API_SECRET: ${{ secrets.SuperSecret }}
+ with:
+ context: .
+ push: true
+ file: ./.github/deployment/Dockerfile-affine
+ tags: ${{ env.LOCAL_CACHE }}
+ target: AFFiNE
+
+ - name: Build and push Docker image (AFFINE-Local)
+ uses: docker/build-push-action@v3
+ with:
+ context: .
+ platforms: linux/amd64,linux/arm64/v8
+ file: ./.github/deployment/Dockerfile-affine-multiplatform
+ push: ${{ github.ref == 'refs/heads/master' && true || false }}
+ tags: ${{ steps.meta_affine.outputs.tags }}
+ labels: ${{ steps.meta_affine.outputs.labels }}
+ target: AFFiNE
+ build-args: |
+ BASE_IMAGE=${{ env.LOCAL_CACHE }}
diff --git a/apps/ligo-virgo/src/template.html b/apps/ligo-virgo/src/template.html
index d0c4a84e0b..badce60082 100644
--- a/apps/ligo-virgo/src/template.html
+++ b/apps/ligo-virgo/src/template.html
@@ -4,6 +4,7 @@
<%= htmlWebpackPlugin.options.title %>
+ <%= htmlWebpackPlugin.options.hubspotScript %>
diff --git a/apps/ligo-virgo/webpack.config.js b/apps/ligo-virgo/webpack.config.js
index 11be2e1c76..377f32551a 100644
--- a/apps/ligo-virgo/webpack.config.js
+++ b/apps/ligo-virgo/webpack.config.js
@@ -12,6 +12,13 @@ const Style9Plugin = require('style9/webpack');
const enableBundleAnalyzer = process.env.BUNDLE_ANALYZER;
+function generateHubspotScript() {
+ const hubspotApiSecret = process.env.HUBSPOT_API_SECRET;
+ if (hubspotApiSecret) {
+ return ``;
+ }
+}
+
module.exports = function (webpackConfig) {
const config = getNxWebpackConfig(webpackConfig);
@@ -175,6 +182,7 @@ module.exports = function (webpackConfig) {
), //favicon path
template: path.resolve(__dirname, './src/template.html'),
publicPath: '/',
+ hubspotScript: generateHubspotScript(),
}),
new Style9Plugin(),
isProd &&
diff --git a/apps/venus/src/app/IndexPage/Alternatives.tsx b/apps/venus/src/app/IndexPage/Alternatives.tsx
index 17403e01c9..4c7645a9d8 100644
--- a/apps/venus/src/app/IndexPage/Alternatives.tsx
+++ b/apps/venus/src/app/IndexPage/Alternatives.tsx
@@ -7,7 +7,7 @@ import { useMediaQuery } from '@mui/material';
const Alternatives = styled(Box)<{ width: string }>(({ width }) => ({
position: 'relative',
- width: '20em',
+ width: '24em',
height: '128px',
transform: 'translateY(-8px)',
overflowY: 'hidden',
@@ -21,7 +21,7 @@ const Alternatives = styled(Box)<{ width: string }>(({ width }) => ({
height: 'inherit',
position: 'absolute',
left: '0',
- top: '0',
+ top: '-23px',
paddingTop: '22px',
lineHeight: '96px',
'@media (max-width: 1024px)': {
@@ -105,7 +105,7 @@ export const AlternativesProduct = () => {
)}
>
{
}}
>
-
+
-
+
-
+
-
+
-
+
{
const changeLanguage = (event: any) => {
i18n.changeLanguage(event);
};
- const matchesIPAD = useMediaQuery('(max-width: 768px)');
+ const matchesIPAD = useMediaQuery('(max-width: 1080px)');
+ if (matchesIPAD) {
+ return ;
+ }
return (
@@ -160,6 +164,7 @@ const Container = styled(Grid)({
transform: 'translateX(-50%)',
width: '100%',
paddingTop: '1em',
+ paddingBottom: '1em',
backgroundColor: '#fff',
zIndex: 1500,
maxWidth: '1440px',
diff --git a/apps/venus/src/app/common/MobileHeader.tsx b/apps/venus/src/app/common/MobileHeader.tsx
new file mode 100644
index 0000000000..f55a793a45
--- /dev/null
+++ b/apps/venus/src/app/common/MobileHeader.tsx
@@ -0,0 +1,208 @@
+import Close from '@mui/icons-material/Close';
+import ExpandLess from '@mui/icons-material/ExpandLess';
+import ExpandMore from '@mui/icons-material/ExpandMore';
+import GitHubIcon from '@mui/icons-material/GitHub';
+import Menu from '@mui/icons-material/Menu';
+import { Button, Grid } from '@mui/joy';
+import { useRef, useState } from 'react';
+// eslint-disable-next-line no-restricted-imports
+import {
+ Checkbox,
+ Collapse,
+ Drawer,
+ List,
+ ListItemButton,
+ ListItemText,
+ styled,
+} from '@mui/material';
+import { useTranslation } from 'react-i18next';
+import { useNavigate } from 'react-router-dom';
+import AFFiNETextLogo from './affine-text-logo.png';
+
+export const MobileHeader = () => {
+ const navigate = useNavigate();
+ const { i18n, t } = useTranslation();
+ const anchor = useRef(null);
+ const [openedDrawer, setDrawerState] = useState(false);
+ const handleDrawerOpenState = () => {
+ setDrawerState(!openedDrawer);
+ };
+ const [contactUsCollapse, setContactUsCollapse] = useState(false);
+ const handleContactUsClick = () => {
+ setContactUsCollapse(!contactUsCollapse);
+ };
+
+ const [languageCollapse, setLanguageCollapse] = useState(false);
+ const handleLanguageClick = () => {
+ setLanguageCollapse(!languageCollapse);
+ };
+
+ return (
+
+
+ navigate('/')}
+ />
+
+
+ window.open(
+ 'https://github.com/toeverything/AFFiNE'
+ )
+ }
+ >
+
+
+
+ {openedDrawer ? : }
+
+
+
+ setDrawerState(false)}
+ >
+
+
+ navigate('/aboutus')}>
+
+
+
+ window.open('https://blog.affine.pro')
+ }
+ >
+
+
+
+ window.open('https://docs.affine.pro/')
+ }
+ >
+
+
+
+ window.open('https://feedback.affine.pro/')
+ }
+ >
+
+
+
+
+ {contactUsCollapse ? (
+
+ ) : (
+
+ )}
+
+
+
+ window.open('https://discord.gg/Arn7TqJBvG')
+ }
+ >
+
+
+
+ window.open('https://t.me/affineworkos')
+ }
+ >
+
+
+
+ window.open(
+ 'https://www.reddit.com/r/Affine/'
+ )
+ }
+ >
+
+
+
+ window.open(
+ 'https://medium.com/@affineworkos'
+ )
+ }
+ >
+
+
+
+ window.open(
+ 'mailto:contact@toeverything.info'
+ )
+ }
+ >
+
+
+
+
+
+ {languageCollapse ? : }
+
+
+ i18n.changeLanguage('en')}
+ >
+
+
+
+ i18n.changeLanguage('zh')}
+ >
+
+
+
+
+
+
+
+
+ );
+};
+
+const Container = styled(Grid)({
+ position: 'fixed',
+ top: 0,
+ left: '50%',
+ transform: 'translateX(-50%)',
+ width: '100%',
+ paddingTop: '1em',
+ backgroundColor: '#fff',
+ zIndex: 1500,
+ maxWidth: '1440px',
+ margin: 'auto',
+ marginTop: '0 !important',
+});
+
+const StyledImage = styled('img')({
+ height: '24px',
+ marginRight: '16px',
+ cursor: 'pointer',
+});
+
+const StyledDrawerContainer = styled('div')({
+ paddingTop: '72px',
+});
diff --git a/apps/venus/src/app/i18n/resources/en.json b/apps/venus/src/app/i18n/resources/en.json
index 789a577584..80381df1d7 100644
--- a/apps/venus/src/app/i18n/resources/en.json
+++ b/apps/venus/src/app/i18n/resources/en.json
@@ -10,6 +10,7 @@
"Alternative": "Alternative",
"Check GitHub": "Check GitHub",
"Try it Online": "Try it Online",
+ "language": "Language",
"description1": {
"part1": "Affine is the next-generation collaborative knowledge base for professionals.",
"part2": "It's not just a collection of Docs, whiteboard, and tables.",
diff --git a/apps/venus/src/app/i18n/resources/zh.json b/apps/venus/src/app/i18n/resources/zh.json
index 9a3e51a2ca..545a644c28 100644
--- a/apps/venus/src/app/i18n/resources/zh.json
+++ b/apps/venus/src/app/i18n/resources/zh.json
@@ -10,6 +10,7 @@
"Alternative": "的另一种选择",
"Check GitHub": "GitHub中查看",
"Try it Online": "在线试用",
+ "language": "语言",
"description1": {
"part1": "Affine是面向专业人士的下一代协同知识库",
"part2": "它不仅仅是一个文档、白板和表格的集合。",