mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-11 11:58:41 +00:00
Compare commits
92 Commits
v0.5.4-bet
...
0.6.0-cana
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b2556db33b | ||
|
|
89310c9b97 | ||
|
|
8e09af910f | ||
|
|
885aea3425 | ||
|
|
a616150f2d | ||
|
|
d80dae8a89 | ||
|
|
34ff08b92b | ||
|
|
2f7b51d7ff | ||
|
|
b7cee3185e | ||
|
|
1c5455e6ed | ||
|
|
2d303fd5d3 | ||
|
|
fbe2543c03 | ||
|
|
d6b640726e | ||
|
|
f875b37641 | ||
|
|
53c4fc6dfa | ||
|
|
6c310249d9 | ||
|
|
02e1f528bf | ||
|
|
c870104370 | ||
|
|
627d8ef787 | ||
|
|
5563823a7a | ||
|
|
d6804bb0fd | ||
|
|
1350633690 | ||
|
|
50196d8fde | ||
|
|
2e0ccb53ec | ||
|
|
1498ee405b | ||
|
|
cb863c4afa | ||
|
|
2629d39501 | ||
|
|
38305cd984 | ||
|
|
93116c24f2 | ||
|
|
017b9c8615 | ||
|
|
9ce3a96862 | ||
|
|
a0ff520ba4 | ||
|
|
a8b8986d89 | ||
|
|
8ffc096fee | ||
|
|
7e457f7b4c | ||
|
|
aedf2d339e | ||
|
|
ffd5ae52b3 | ||
|
|
3093194da8 | ||
|
|
68b4f792f0 | ||
|
|
e2c6e4f9fc | ||
|
|
9ff7dbffb7 | ||
|
|
0c561da061 | ||
|
|
06951319a6 | ||
|
|
0bfcab4067 | ||
|
|
2c4db4fa16 | ||
|
|
23b4f9ee12 | ||
|
|
e5330b1917 | ||
|
|
183611a556 | ||
|
|
7786456ba4 | ||
|
|
f4bf7e3ddf | ||
|
|
05d88215d1 | ||
|
|
b240a70e51 | ||
|
|
00fd468e9b | ||
|
|
b5a7f8b7eb | ||
|
|
f03277fd17 | ||
|
|
ee93071149 | ||
|
|
21fdced2bd | ||
|
|
10b4558947 | ||
|
|
0fbed5d9d6 | ||
|
|
8d117123d7 | ||
|
|
063ffda09d | ||
|
|
39c83bd25b | ||
|
|
4444c3d1a6 | ||
|
|
717dd93f37 | ||
|
|
c58673c55f | ||
|
|
768e55072d | ||
|
|
8c84daec2b | ||
|
|
e54a5b6128 | ||
|
|
ee1e50f391 | ||
|
|
268636c440 | ||
|
|
06fa0cdb60 | ||
|
|
73dbb39009 | ||
|
|
47848cb5da | ||
|
|
eff6a03a51 | ||
|
|
08f6a41ef4 | ||
|
|
6d1345ffe5 | ||
|
|
689f615b11 | ||
|
|
f82ea5d9c4 | ||
|
|
dc4979a80c | ||
|
|
1f48bc4301 | ||
|
|
beabd1e050 | ||
|
|
19e20a6a20 | ||
|
|
e4f13ddae4 | ||
|
|
752d0545ca | ||
|
|
08341d3d6c | ||
|
|
ef665df330 | ||
|
|
b38017cd23 | ||
|
|
0c550a2827 | ||
|
|
87ffdad862 | ||
|
|
c6e8024e16 | ||
|
|
4200b3c3e5 | ||
|
|
10976a9257 |
5
.github/workflows/build.yml
vendored
5
.github/workflows/build.yml
vendored
@@ -365,11 +365,6 @@ jobs:
|
||||
name: affine
|
||||
fail_ci_if_error: true
|
||||
|
||||
- name: Run desktop tests
|
||||
if: ${{ matrix.spec.test && matrix.spec.os != 'ubuntu-latest' }}
|
||||
run: yarn test
|
||||
working-directory: apps/electron
|
||||
|
||||
- name: Upload test results
|
||||
if: ${{ failure() }}
|
||||
uses: actions/upload-artifact@v3
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@affine/electron",
|
||||
"private": true,
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"author": "affine",
|
||||
"repository": {
|
||||
"url": "https://github.com/toeverything/AFFiNE",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@affine/server",
|
||||
"private": true,
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"description": "Affine Node.js server",
|
||||
"type": "module",
|
||||
"bin": {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@affine/web",
|
||||
"private": true,
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"scripts": {
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
|
||||
@@ -57,7 +57,7 @@ export const StyledButtonContent = styled('div')(() => {
|
||||
|
||||
export const StyledWorkspaceName = styled('span')(() => {
|
||||
return {
|
||||
color: '#E8178A',
|
||||
fontWeight: '600',
|
||||
};
|
||||
});
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ export const WorkspaceListModal = ({
|
||||
{environment.isDesktop && (
|
||||
<Menu
|
||||
placement="auto"
|
||||
trigger={['click', 'hover']}
|
||||
trigger={['click']}
|
||||
zIndex={1000}
|
||||
content={
|
||||
<StyledCreateWorkspaceCardPillContainer>
|
||||
|
||||
@@ -62,6 +62,9 @@ export const StyledCreateWorkspaceCard = styled('div')(() => {
|
||||
color: 'var(--affine-primary-color)',
|
||||
},
|
||||
},
|
||||
'@media (max-width: 720px)': {
|
||||
width: '100%',
|
||||
},
|
||||
};
|
||||
});
|
||||
export const StyledCreateWorkspaceCardPillContainer = styled('div')(() => {
|
||||
|
||||
@@ -10,6 +10,7 @@ import { useMemo, useState } from 'react';
|
||||
import { workspacePreferredModeAtom } from '../../../../atoms';
|
||||
import type { FavoriteListProps } from '../index';
|
||||
import EmptyItem from './empty-item';
|
||||
import * as styles from './styles.css';
|
||||
|
||||
interface FavoriteMenuItemProps {
|
||||
workspace: Workspace;
|
||||
@@ -33,16 +34,13 @@ function FavoriteMenuItem({
|
||||
return [...new Set(references.filter(ref => !parentIds.has(ref)))];
|
||||
}, [references, parentIds]);
|
||||
const [collapsed, setCollapsed] = useState(true);
|
||||
const collapsible = referencesToShow.length > 0 && parentIds.size === 0;
|
||||
const collapsible = referencesToShow.length > 0;
|
||||
const showReferences = collapsible ? !collapsed : referencesToShow.length > 0;
|
||||
const nestedItem = parentIds.size > 0;
|
||||
const untitled = !metaMapping[pageId]?.title;
|
||||
return (
|
||||
<>
|
||||
<div className={styles.favItemWrapper} data-nested={nestedItem}>
|
||||
<MenuLinkItem
|
||||
style={{
|
||||
marginLeft: nestedItem ? '12px' : undefined,
|
||||
width: nestedItem ? 'calc(100% - 12px)' : undefined,
|
||||
}}
|
||||
data-type="favorite-list-item"
|
||||
data-testid={`favorite-list-item-${pageId}`}
|
||||
active={active}
|
||||
@@ -51,7 +49,9 @@ function FavoriteMenuItem({
|
||||
collapsed={collapsible ? collapsed : undefined}
|
||||
onCollapsedChange={setCollapsed}
|
||||
>
|
||||
<span>{metaMapping[pageId]?.title || 'Untitled'}</span>
|
||||
<span className={styles.label} data-untitled={untitled}>
|
||||
{metaMapping[pageId]?.title || 'Untitled'}
|
||||
</span>
|
||||
</MenuLinkItem>
|
||||
{showReferences &&
|
||||
referencesToShow.map(ref => {
|
||||
@@ -65,7 +65,7 @@ function FavoriteMenuItem({
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
import { style } from '@vanilla-extract/css';
|
||||
|
||||
export const label = style({
|
||||
selectors: {
|
||||
'&[data-untitled="true"]': {
|
||||
opacity: 0.6,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const favItemWrapper = style({
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
gap: '4px',
|
||||
selectors: {
|
||||
'&[data-nested="true"]': {
|
||||
marginLeft: '12px',
|
||||
width: 'calc(100% - 12px)',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "AFFiNE",
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"private": true,
|
||||
"author": "toeverything",
|
||||
"license": "MPL-2.0",
|
||||
|
||||
@@ -15,5 +15,5 @@
|
||||
"dependencies": {
|
||||
"dotenv": "^16.0.3"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -84,5 +84,5 @@
|
||||
"wait-on": "^7.0.1",
|
||||
"yjs": "^13.6.1"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import { Trans } from '@affine/i18n';
|
||||
import { AffineLogoSimSBlue1_1Icon, CloseIcon } from '@blocksuite/icons';
|
||||
|
||||
import {
|
||||
@@ -18,16 +19,18 @@ export const DownloadTips = ({ onClose }: { onClose: () => void }) => {
|
||||
<div className={downloadTipStyle}>
|
||||
<AffineLogoSimSBlue1_1Icon className={downloadTipIconStyle} />
|
||||
<div className={downloadMessageStyle}>
|
||||
Enjoying the demo?
|
||||
<a
|
||||
className={linkStyle}
|
||||
href="https://github.com/toeverything/AFFiNE/releases"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
Download the AFFiNE Client
|
||||
</a>
|
||||
for the full experience.
|
||||
<Trans i18nKey="com.affine.banner.content">
|
||||
Enjoying the demo?
|
||||
<a
|
||||
className={linkStyle}
|
||||
href="https://github.com/toeverything/AFFiNE/releases"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
Download the AFFiNE Client
|
||||
</a>
|
||||
for the full experience.
|
||||
</Trans>
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
|
||||
@@ -12,7 +12,6 @@ interface AddPageButtonProps {
|
||||
style?: React.CSSProperties;
|
||||
}
|
||||
|
||||
// Although it is called an input, it is actually a button.
|
||||
export function AddPageButton({
|
||||
onClick,
|
||||
className,
|
||||
|
||||
@@ -62,11 +62,17 @@ export const closeIcon = style({
|
||||
cursor: 'pointer',
|
||||
transition: '0.1s',
|
||||
borderRadius: '50%',
|
||||
transform: 'scale(0.6)',
|
||||
zIndex: 1,
|
||||
opacity: 0,
|
||||
selectors: {
|
||||
'&:hover': {
|
||||
transform: 'scale(1.1)',
|
||||
},
|
||||
[`${root}:hover &`]: {
|
||||
opacity: 1,
|
||||
transform: 'scale(1)',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ export const navWrapperStyle = style({
|
||||
minWidth: navWidthVar,
|
||||
height: '100%',
|
||||
zIndex: 2,
|
||||
paddingBottom: '8px',
|
||||
backgroundColor: 'transparent',
|
||||
'@media': {
|
||||
[`(max-width: ${floatingMaxWidth}px)`]: {
|
||||
|
||||
@@ -69,6 +69,7 @@ export const iconsContainer = style({
|
||||
alignItems: 'center',
|
||||
justifyContent: 'flex-start',
|
||||
width: '28px',
|
||||
flexShrink: 0,
|
||||
selectors: {
|
||||
'&[data-collapsible="true"]': {
|
||||
width: '40px',
|
||||
|
||||
@@ -39,28 +39,29 @@ export function MenuItem({
|
||||
data-disabled={disabled}
|
||||
data-collapsible={collapsible}
|
||||
>
|
||||
<div className={styles.iconsContainer} data-collapsible={collapsible}>
|
||||
{collapsible && (
|
||||
<div
|
||||
onClick={e => {
|
||||
e.stopPropagation();
|
||||
e.preventDefault(); // for links
|
||||
onCollapsedChange?.(!collapsed);
|
||||
}}
|
||||
data-testid="fav-collapsed-button"
|
||||
className={styles.collapsedIconContainer}
|
||||
>
|
||||
<ArrowDownSmallIcon
|
||||
className={styles.collapsedIcon}
|
||||
data-collapsed={collapsed}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{icon &&
|
||||
React.cloneElement(icon, {
|
||||
{icon && (
|
||||
<div className={styles.iconsContainer} data-collapsible={collapsible}>
|
||||
{collapsible && (
|
||||
<div
|
||||
onClick={e => {
|
||||
e.stopPropagation();
|
||||
e.preventDefault(); // for links
|
||||
onCollapsedChange?.(!collapsed);
|
||||
}}
|
||||
data-testid="fav-collapsed-button"
|
||||
className={styles.collapsedIconContainer}
|
||||
>
|
||||
<ArrowDownSmallIcon
|
||||
className={styles.collapsedIcon}
|
||||
data-collapsed={collapsed}
|
||||
/>
|
||||
</div>
|
||||
)}
|
||||
{React.cloneElement(icon, {
|
||||
className: clsx([styles.icon, icon.props.className]),
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
)}
|
||||
|
||||
<div className={styles.content}>{children}</div>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { globalStyle, style } from '@vanilla-extract/css';
|
||||
|
||||
export const baseContainer = style({
|
||||
padding: '12px 16px',
|
||||
padding: '4px 16px',
|
||||
display: 'flex',
|
||||
flexFlow: 'column nowrap',
|
||||
rowGap: '4px',
|
||||
@@ -13,17 +13,27 @@ export const scrollableContainerRoot = style({
|
||||
vars: {
|
||||
'--scrollbar-width': '10px',
|
||||
},
|
||||
transition: 'all .3s .2s',
|
||||
borderTop: '1px solid transparent',
|
||||
});
|
||||
|
||||
export const scrollTopBorder = style({
|
||||
position: 'absolute',
|
||||
top: 0,
|
||||
left: '16px',
|
||||
right: '16px',
|
||||
height: '1px',
|
||||
transition: 'opacity .3s .2s',
|
||||
opacity: 0,
|
||||
background: 'var(--affine-black-10)',
|
||||
selectors: {
|
||||
'&[data-has-scroll-top="true"]': {
|
||||
boxShadow: 'inset 0 8px 8px -8px var(--affine-black-10)',
|
||||
opacity: 1,
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const scrollableViewport = style({
|
||||
height: '100%',
|
||||
marginTop: '4px',
|
||||
});
|
||||
|
||||
globalStyle(`${scrollableViewport} > div`, {
|
||||
|
||||
@@ -39,10 +39,11 @@ function useHasScrollTop() {
|
||||
export function SidebarScrollableContainer({ children }: PropsWithChildren) {
|
||||
const [hasScrollTop, ref] = useHasScrollTop();
|
||||
return (
|
||||
<ScrollArea.Root
|
||||
data-has-scroll-top={hasScrollTop}
|
||||
className={styles.scrollableContainerRoot}
|
||||
>
|
||||
<ScrollArea.Root className={styles.scrollableContainerRoot}>
|
||||
<div
|
||||
data-has-scroll-top={hasScrollTop}
|
||||
className={styles.scrollTopBorder}
|
||||
/>
|
||||
<ScrollArea.Viewport
|
||||
className={clsx([styles.scrollableViewport])}
|
||||
ref={ref}
|
||||
|
||||
@@ -16,7 +16,7 @@ export const spotlight = style({
|
||||
background: `radial-gradient(${spotlightSize} circle at ${spotlightX} ${spotlightY}, var(--affine-text-primary-color), transparent)`,
|
||||
inset: '0px',
|
||||
pointerEvents: 'none',
|
||||
willChange: 'background',
|
||||
willChange: 'background, opacity',
|
||||
opacity: spotlightOpacity,
|
||||
zIndex: 1,
|
||||
transition: 'all 0.2s',
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
import type { Meta, StoryFn } from '@storybook/react';
|
||||
import { type PropsWithChildren } from 'react';
|
||||
|
||||
import { Spotlight } from '.';
|
||||
|
||||
export default {
|
||||
title: 'Components/AppSidebar/Spotlight',
|
||||
component: Spotlight,
|
||||
} satisfies Meta;
|
||||
|
||||
const Container = ({ children }: PropsWithChildren) => (
|
||||
<main
|
||||
style={{
|
||||
position: 'relative',
|
||||
width: '320px',
|
||||
height: '320px',
|
||||
border: '1px solid #ccc',
|
||||
}}
|
||||
>
|
||||
{children}
|
||||
</main>
|
||||
);
|
||||
|
||||
export const Default: StoryFn = () => {
|
||||
return (
|
||||
<Container>
|
||||
<Spotlight />
|
||||
</Container>
|
||||
);
|
||||
};
|
||||
@@ -12,10 +12,10 @@ function useMouseOffset() {
|
||||
useEffect(() => {
|
||||
if (ref.current && ref.current.parentElement) {
|
||||
const el = ref.current.parentElement;
|
||||
const bound = el.getBoundingClientRect();
|
||||
|
||||
// debounce?
|
||||
const onMouseMove = (e: MouseEvent) => {
|
||||
const bound = el.getBoundingClientRect();
|
||||
setOffset({ x: e.clientX - bound.x, y: e.clientY - bound.y });
|
||||
setOutside(false);
|
||||
};
|
||||
|
||||
25
packages/component/src/components/card/block-card/index.tsx
Normal file
25
packages/component/src/components/card/block-card/index.tsx
Normal file
@@ -0,0 +1,25 @@
|
||||
import { forwardRef, type HTMLAttributes, type ReactNode } from 'react';
|
||||
|
||||
import * as styles from './styles.css';
|
||||
|
||||
export const BlockCard = forwardRef<
|
||||
HTMLDivElement,
|
||||
{
|
||||
left?: ReactNode;
|
||||
title: string;
|
||||
desc?: string;
|
||||
right?: ReactNode;
|
||||
} & HTMLAttributes<HTMLDivElement>
|
||||
>(({ left, title, desc, right, ...props }, ref) => {
|
||||
return (
|
||||
<div ref={ref} className={styles.blockCard} {...props}>
|
||||
{left && <div className={styles.blockCardAround}>{left}</div>}
|
||||
<div className={styles.blockCardContent}>
|
||||
<div>{title}</div>
|
||||
<div className={styles.blockCardDesc}>{desc}</div>
|
||||
</div>
|
||||
{right && <div className={styles.blockCardAround}>{right}</div>}
|
||||
</div>
|
||||
);
|
||||
});
|
||||
BlockCard.displayName = 'BlockCard';
|
||||
@@ -0,0 +1,35 @@
|
||||
import { style } from '@vanilla-extract/css';
|
||||
|
||||
export const blockCard = style({
|
||||
display: 'flex',
|
||||
gap: '12px',
|
||||
padding: '8px 12px',
|
||||
color: 'var(--affine-text-primary-color)',
|
||||
backgroundColor: 'var(--affine-background-primary-color)',
|
||||
borderRadius: '4px',
|
||||
userSelect: 'none',
|
||||
cursor: 'pointer',
|
||||
selectors: {
|
||||
'&:hover': {
|
||||
boxShadow: 'var(--affine-shadow-1)',
|
||||
},
|
||||
// TODO active styles
|
||||
},
|
||||
});
|
||||
|
||||
export const blockCardAround = style({
|
||||
display: 'flex',
|
||||
justifyContent: 'center',
|
||||
alignItems: 'center',
|
||||
});
|
||||
|
||||
export const blockCardContent = style({
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
flex: 1,
|
||||
});
|
||||
|
||||
export const blockCardDesc = style({
|
||||
color: 'var(--affine-text-secondary-color)',
|
||||
fontSize: 'var(--affine-font-xs)',
|
||||
});
|
||||
@@ -10,7 +10,7 @@ import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-
|
||||
import type { FC } from 'react';
|
||||
import { useCallback } from 'react';
|
||||
|
||||
import { WorkspaceAvatar } from '../workspace-avatar';
|
||||
import { WorkspaceAvatar } from '../../workspace-avatar';
|
||||
import {
|
||||
StyledCard,
|
||||
StyledSettingLink,
|
||||
@@ -1,5 +1,5 @@
|
||||
import { displayFlex, styled, textEllipsis } from '../..';
|
||||
import { IconButton } from '../..';
|
||||
import { displayFlex, styled, textEllipsis } from '../../../styles';
|
||||
import { IconButton } from '../../../ui/button/icon-button';
|
||||
|
||||
export const StyleWorkspaceInfo = styled('div')(() => {
|
||||
return {
|
||||
@@ -9,7 +9,7 @@ import type { FC } from 'react';
|
||||
import { useRef } from 'react';
|
||||
import { useCallback, useState } from 'react';
|
||||
|
||||
import { Menu } from '../..';
|
||||
import { Menu } from '../../ui/menu/menu';
|
||||
import { Export } from './export';
|
||||
import { containerStyle, indicatorContainerStyle, tabStyle } from './index.css';
|
||||
import { SharePage } from './share-page';
|
||||
|
||||
@@ -12,7 +12,7 @@ import {
|
||||
import { SortableContext, useSortable } from '@dnd-kit/sortable';
|
||||
import type { FC } from 'react';
|
||||
|
||||
import { WorkspaceCard } from '../workspace-card';
|
||||
import { WorkspaceCard } from '../../components/card/workspace-card';
|
||||
import { workspaceItemStyle } from './index.css';
|
||||
|
||||
export type WorkspaceListProps = {
|
||||
|
||||
@@ -2,8 +2,11 @@
|
||||
import type { Meta, StoryFn } from '@storybook/react';
|
||||
import { useState } from 'react';
|
||||
|
||||
import { Button } from '..';
|
||||
import { Button } from '../ui/button/button';
|
||||
import { DropdownButton } from '../ui/button/dropdown';
|
||||
import type { ButtonProps } from '../ui/button/interface';
|
||||
import { Menu } from '../ui/menu/menu';
|
||||
import { toast } from '../ui/toast/toast';
|
||||
|
||||
export default {
|
||||
title: 'AFFiNE/Button',
|
||||
@@ -20,30 +23,72 @@ export const Primary = Template.bind(undefined);
|
||||
Primary.args = {
|
||||
type: 'primary',
|
||||
children: 'This is a primary button',
|
||||
onClick: () => toast('Click button'),
|
||||
};
|
||||
|
||||
export const Default = Template.bind(undefined);
|
||||
Default.args = {
|
||||
type: 'default',
|
||||
children: 'This is a default button',
|
||||
onClick: () => toast('Click button'),
|
||||
};
|
||||
|
||||
export const Light = Template.bind(undefined);
|
||||
Light.args = {
|
||||
type: 'light',
|
||||
children: 'This is a light button',
|
||||
onClick: () => toast('Click button'),
|
||||
};
|
||||
|
||||
export const Warning = Template.bind(undefined);
|
||||
Warning.args = {
|
||||
type: 'warning',
|
||||
children: 'This is a warning button',
|
||||
onClick: () => toast('Click button'),
|
||||
};
|
||||
|
||||
export const Danger = Template.bind(undefined);
|
||||
Danger.args = {
|
||||
type: 'danger',
|
||||
children: 'This is a danger button',
|
||||
onClick: () => toast('Click button'),
|
||||
};
|
||||
|
||||
export const Dropdown: StoryFn = ({ onClickDropDown, ...props }) => {
|
||||
const [open, setOpen] = useState(false);
|
||||
return (
|
||||
<>
|
||||
<DropdownButton onClickDropDown={onClickDropDown} {...props}>
|
||||
Dropdown Button
|
||||
</DropdownButton>
|
||||
|
||||
<Menu
|
||||
visible={open}
|
||||
placement="bottom-end"
|
||||
trigger={['click']}
|
||||
width={235}
|
||||
disablePortal={true}
|
||||
onClickAway={() => {
|
||||
setOpen(false);
|
||||
}}
|
||||
content={<>Dropdown Menu</>}
|
||||
>
|
||||
<DropdownButton
|
||||
onClick={() => {
|
||||
toast('Click button');
|
||||
setOpen(false);
|
||||
}}
|
||||
onClickDropDown={() => setOpen(!open)}
|
||||
>
|
||||
Dropdown with Menu
|
||||
</DropdownButton>
|
||||
</Menu>
|
||||
</>
|
||||
);
|
||||
};
|
||||
Dropdown.args = {
|
||||
onClick: () => toast('Click button'),
|
||||
onClickDropDown: () => toast('Click dropdown'),
|
||||
};
|
||||
|
||||
export const Test: StoryFn<ButtonProps> = () => {
|
||||
|
||||
55
packages/component/src/stories/card.stories.tsx
Normal file
55
packages/component/src/stories/card.stories.tsx
Normal file
@@ -0,0 +1,55 @@
|
||||
import { BlockCard } from '@affine/component/card/block-card';
|
||||
import { WorkspaceFlavour } from '@affine/workspace/type';
|
||||
import { EdgelessIcon, PageIcon } from '@blocksuite/icons';
|
||||
import { Workspace } from '@blocksuite/store';
|
||||
|
||||
import { WorkspaceCard } from '../components/card/workspace-card';
|
||||
import { toast } from '../ui/toast';
|
||||
|
||||
export default {
|
||||
title: 'AFFiNE/Card',
|
||||
component: WorkspaceCard,
|
||||
};
|
||||
|
||||
const blockSuiteWorkspace = new Workspace({
|
||||
id: 'blocksuite-local',
|
||||
});
|
||||
|
||||
blockSuiteWorkspace.meta.setName('Hello World');
|
||||
|
||||
export const AffineWorkspaceCard = () => {
|
||||
return (
|
||||
<WorkspaceCard
|
||||
workspace={{
|
||||
flavour: WorkspaceFlavour.LOCAL,
|
||||
id: 'local',
|
||||
blockSuiteWorkspace,
|
||||
providers: [],
|
||||
}}
|
||||
onClick={() => {}}
|
||||
onSettingClick={() => {}}
|
||||
currentWorkspaceId={null}
|
||||
/>
|
||||
);
|
||||
};
|
||||
|
||||
export const AffineBlockCard = () => {
|
||||
return (
|
||||
<div style={{ display: 'flex', flexDirection: 'column', gap: '4px' }}>
|
||||
<BlockCard title={'New Page'} onClick={() => toast('clicked')} />
|
||||
<BlockCard
|
||||
title={'New Page'}
|
||||
desc={'Write with a blank page'}
|
||||
right={<PageIcon width={20} height={20} />}
|
||||
onClick={() => toast('clicked page')}
|
||||
/>
|
||||
<BlockCard
|
||||
title={'New Edgeless'}
|
||||
desc={'Draw with a blank whiteboard'}
|
||||
left={<PageIcon width={20} height={20} />}
|
||||
right={<EdgelessIcon width={20} height={20} />}
|
||||
onClick={() => toast('clicked edgeless')}
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
import { WorkspaceFlavour } from '@affine/workspace/type';
|
||||
import { Workspace } from '@blocksuite/store';
|
||||
|
||||
import { WorkspaceCard } from '../components/workspace-card';
|
||||
|
||||
export default {
|
||||
title: 'AFFiNE/WorkspaceCard',
|
||||
component: WorkspaceCard,
|
||||
};
|
||||
|
||||
const blockSuiteWorkspace = new Workspace({
|
||||
id: 'blocksuite-local',
|
||||
});
|
||||
|
||||
blockSuiteWorkspace.meta.setName('Hello World');
|
||||
|
||||
export const Basic = () => {
|
||||
return (
|
||||
<WorkspaceCard
|
||||
workspace={{
|
||||
flavour: WorkspaceFlavour.LOCAL,
|
||||
id: 'local',
|
||||
blockSuiteWorkspace,
|
||||
providers: [],
|
||||
}}
|
||||
onClick={() => {}}
|
||||
onSettingClick={() => {}}
|
||||
currentWorkspaceId={null}
|
||||
/>
|
||||
);
|
||||
};
|
||||
35
packages/component/src/ui/button/dropdown.tsx
Normal file
35
packages/component/src/ui/button/dropdown.tsx
Normal file
@@ -0,0 +1,35 @@
|
||||
import { ArrowDownSmallIcon } from '@blocksuite/icons';
|
||||
import {
|
||||
type ButtonHTMLAttributes,
|
||||
forwardRef,
|
||||
type MouseEventHandler,
|
||||
} from 'react';
|
||||
|
||||
import * as styles from './styles.css';
|
||||
|
||||
type DropdownButtonProps = {
|
||||
onClickDropDown?: MouseEventHandler<SVGSVGElement>;
|
||||
} & ButtonHTMLAttributes<HTMLButtonElement>;
|
||||
|
||||
export const DropdownButton = forwardRef<
|
||||
HTMLButtonElement,
|
||||
DropdownButtonProps
|
||||
>(({ onClickDropDown, children, ...props }, ref) => {
|
||||
const handleClickDropDown: MouseEventHandler<SVGSVGElement> = e => {
|
||||
e.stopPropagation();
|
||||
onClickDropDown?.(e);
|
||||
};
|
||||
return (
|
||||
<button ref={ref} className={styles.dropdownBtn} {...props}>
|
||||
<span>{children}</span>
|
||||
<span className={styles.divider} />
|
||||
<ArrowDownSmallIcon
|
||||
className={styles.icon}
|
||||
width={16}
|
||||
height={16}
|
||||
onClick={handleClickDropDown}
|
||||
/>
|
||||
</button>
|
||||
);
|
||||
});
|
||||
DropdownButton.displayName = 'SimpleDropdownButton';
|
||||
40
packages/component/src/ui/button/styles.css.ts
Normal file
40
packages/component/src/ui/button/styles.css.ts
Normal file
@@ -0,0 +1,40 @@
|
||||
import { style } from '@vanilla-extract/css';
|
||||
|
||||
export const dropdownBtn = style({
|
||||
display: 'inline-flex',
|
||||
alignItems: 'center',
|
||||
justifyContent: 'center',
|
||||
padding: '0 10px',
|
||||
gap: '4px',
|
||||
color: 'var(--affine-text-primary-color)',
|
||||
fontWeight: 600,
|
||||
background: 'var(--affine-button-gray-color)',
|
||||
boxShadow: 'var(--affine-float-button-shadow)',
|
||||
borderRadius: '8px',
|
||||
fontSize: 'var(--affine-font-sm)',
|
||||
// width: '100%',
|
||||
height: '32px',
|
||||
userSelect: 'none',
|
||||
whiteSpace: 'nowrap',
|
||||
cursor: 'pointer',
|
||||
selectors: {
|
||||
'&:hover': {
|
||||
background: 'var(--affine-hover-color)',
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
export const divider = style({
|
||||
width: '0.5px',
|
||||
height: '16px',
|
||||
background: 'var(--affine-border-color)',
|
||||
});
|
||||
|
||||
export const icon = style({
|
||||
borderRadius: '4px',
|
||||
selectors: {
|
||||
'&:hover': {
|
||||
background: 'var(--affine-hover-color)',
|
||||
},
|
||||
},
|
||||
});
|
||||
@@ -9,5 +9,5 @@
|
||||
"devDependencies": {
|
||||
"@types/debug": "^4.1.7"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
2
packages/env/package.json
vendored
2
packages/env/package.json
vendored
@@ -22,5 +22,5 @@
|
||||
"dependencies": {
|
||||
"lit": "^2.7.4"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@affine/graphql",
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"description": "Autogenerated GraphQL client for affine.pro",
|
||||
"license": "MPL-2.0",
|
||||
"type": "module",
|
||||
|
||||
@@ -4,5 +4,5 @@
|
||||
"./*": "./src/*"
|
||||
},
|
||||
"private": true,
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -40,5 +40,5 @@
|
||||
"ts-node": "^10.9.1",
|
||||
"typescript": "^5.0.4"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
{
|
||||
"// THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.": "",
|
||||
"Delete Workspace Description": "Workspace (<1>{{workspace}}</1>) wird gelöscht und der Inhalt wird verloren sein. Dies kann nicht rückgängig gemacht werden.",
|
||||
"Delete Workspace Description": "Workspace <1>{{workspace}}</1> wird gelöscht und der Inhalt wird verloren sein. Dies kann nicht rückgängig gemacht werden.",
|
||||
"Copied link to clipboard": "Link in die Zwischenablage kopiert",
|
||||
"Local Workspace Description": "Alle Daten sind auf dem aktuellen Gerät gespeichert. Du kannst AFFiNE Cloud für diesen Workspace aktivieren, um deine Daten mit der Cloud zu synchronisieren.",
|
||||
"Download all data": "Alle Daten herunterladen",
|
||||
"It takes up little space on your device": "Es verbraucht nur wenig Speicherplatz auf deinem Gerät.",
|
||||
"It takes up little space on your device": "Es nimmt nur wenig Platz auf deinem Gerät ein.",
|
||||
"Help and Feedback": "Hilfe und Feedback",
|
||||
"Not now": "Vielleicht später",
|
||||
"Please make sure you are online": "Bitte stelle sicher, dass du online bist",
|
||||
@@ -71,7 +71,7 @@
|
||||
"Create Or Import": "Erstellen oder importieren",
|
||||
"Delete Workspace": "Workspace löschen",
|
||||
"General": "Generelles",
|
||||
"Delete Workspace Description2": "Das Löschen von (<1>{{workspace}}</1>) wird sowohl lokale als auch Daten in der Cloud löschen. Dies kann nicht rückgängig gemacht werden.",
|
||||
"Delete Workspace Description2": "Das Löschen von <1>{{workspace}}</1> wird sowohl lokale als auch Daten in der Cloud löschen. Dies kann nicht rückgängig gemacht werden.",
|
||||
"Edgeless": "Edgeless",
|
||||
"Divider": "Trenner",
|
||||
"Enable": "Aktivieren",
|
||||
@@ -190,13 +190,10 @@
|
||||
"Data sync mode": "Daten-Sync Modus",
|
||||
"Download core data": "Core Daten herunterladen",
|
||||
"Check Our Docs": "Sieh dir unsere Dokumentation an",
|
||||
"Get in touch! Join our communities": "Bleib mit uns in Kontakt und trete unseren Communitys bei!",
|
||||
"Get in touch! Join our communities": "Nimm teil! Treten Sie unseren Communities bei.",
|
||||
"Move to Trash": "In Papierkorb verschieben",
|
||||
"Placeholder of delete workspace": "Bitte zur Bestätigung den Workspace-Namen eingeben",
|
||||
"Access level": "Zugriffsberechtigung",
|
||||
"Loading Page": "Lade Seite",
|
||||
"Loading All Workspaces": "Lade alle Workspaces",
|
||||
"Discover what's new!": "Erfahre was neu ist!",
|
||||
"Move to": "Verschieben zu",
|
||||
"Disable": "Deaktivieren",
|
||||
"Open Workspace Settings": "Workspace Einstellungen öffnen",
|
||||
@@ -204,21 +201,18 @@
|
||||
"Workspace Not Found": "Workspace nicht gefunden",
|
||||
"Rename": "Umbenennen",
|
||||
"Page is Loading": "Seite lädt",
|
||||
"Discover what's new!": "Erfahre was neu ist!",
|
||||
"Loading All Workspaces": "Lade alle Workspaces",
|
||||
"Loading Page": "Lade Seite",
|
||||
"Create Shared Link Description": "Erstelle einen Link, den du leicht mit jedem teilen kannst.",
|
||||
"Back to Quick Search": "Zurück zur Schnellsuche",
|
||||
"Disable Public Link": "Öffentlichen Link deaktivieren",
|
||||
"Disable Public Link ?": "Öffentlichen Link deaktivieren ?",
|
||||
"Export Shared Pages Description": "Laden eine statische Kopie dieser Seite herunter, um sie mit anderen zu teilen.",
|
||||
"Favorite pages for easy access": "Favoriten-Seiten für schnellen Zugriff",
|
||||
"Move page to": "Seite verschieben nach...",
|
||||
"Navigation Path": "Navigationspfad",
|
||||
"Pivots": "Pivots",
|
||||
"RFP": "Seiten können frei zu Pivots hinzugefügt/entfernt werden und bleiben über \"Alle Seiten\" zugänglich.",
|
||||
"Remove from Pivots": "Von Pivots entfernen",
|
||||
"Router is Loading": "Router lädt",
|
||||
"Share Menu Public Workspace Description1": "Laden andere ein, dem Workspace beizutreten oder veröffentliche ihn im Internet.",
|
||||
"Share Menu Public Workspace Description2": "Der aktuelle Workspace wurde im Internet als öffentlicher Workspace veröffentlicht.",
|
||||
"View Navigation Path": "Navigationspfad ansehen",
|
||||
"Add a subpage inside": "Unterseite hinzufügen",
|
||||
"Disable Public Link Description": "Wenn du diesen öffentlichen Link deaktivierst, können andere Personen mit diesem Link nicht mehr auf diese Seite zugreifen.",
|
||||
"Disable Public Sharing": "Öffentliche Freigabe deaktivieren",
|
||||
@@ -228,8 +222,58 @@
|
||||
"Shared Pages Description": "Die öffentliche Freigabe der Seite erfordert den AFFiNE-Cloud-Dienst.",
|
||||
"Shared Pages In Public Workspace Description": "Der gesamte Workspace wird im Web veröffentlicht und kann über <1>Workspace Einstellungen</1> bearbeitet werden.",
|
||||
"emptySharedPages": "Freigegebene Seiten werden hier angezeigt.",
|
||||
"Recent": "Neueste",
|
||||
"Synced with AFFiNE Cloud": "Synchronisiert mit AFFiNE Cloud",
|
||||
"Successfully deleted": "Erfolgreich gelöscht",
|
||||
"You cannot delete the last workspace": "Du kannst den letzten Workspace nicht löschen"
|
||||
"You cannot delete the last workspace": "Du kannst den letzten Workspace nicht löschen",
|
||||
"Move page to": "Seite verschieben nach...",
|
||||
"Navigation Path": "Navigationspfad",
|
||||
"Recent": "Neueste",
|
||||
"Export Shared Pages Description": "Laden eine statische Kopie dieser Seite herunter, um sie mit anderen zu teilen.",
|
||||
"Share Menu Public Workspace Description1": "Laden andere ein, dem Workspace beizutreten oder veröffentliche ihn im Internet.",
|
||||
"Share Menu Public Workspace Description2": "Der aktuelle Workspace wurde im Internet als öffentlicher Workspace veröffentlicht.",
|
||||
"View Navigation Path": "Navigationspfad ansehen",
|
||||
"Delete Workspace Label Hint": "Wenn dieser Workspace gelöscht wird, wird sein gesamter Inhalt für alle Benutzer dauerhaft gelöscht. Niemand wird in der Lage sein, den Inhalt dieses Workspaces wiederherzustellen.",
|
||||
"Added Successfully": "Erfolgreich hinzugefügt",
|
||||
"Continue": "Fortfahren",
|
||||
"Create your own workspace": "Eigenen Workspace erstellen",
|
||||
"Created Successfully": "Erfolgreich erstellt",
|
||||
"Customize": "Anpassen",
|
||||
"FILE_ALREADY_EXISTS": "Datei existiert bereits",
|
||||
"Move folder": "Ordner verschieben",
|
||||
"Move folder hint": "Neuen Speicherort auswählen.",
|
||||
"Add Workspace Hint": "Auswählen, was du schon hast",
|
||||
"Change avatar hint": "Avatar von allen Mitgliedern ändern.",
|
||||
"Change workspace name hint": "Name von allen Mitgliedern ändern.",
|
||||
"DB_FILE_ALREADY_LOADED": "Datenbankdatei bereits geladen",
|
||||
"DB_FILE_INVALID": "Ungültige Datenbankdatei",
|
||||
"DB_FILE_PATH_INVALID": "Pfad der Datenbankdatei ungültig",
|
||||
"Default Location": "Standard-Speicherort",
|
||||
"Default db location hint": "Standardmäßig wird unter {{location}} gespeichert.",
|
||||
"Move folder success": "Ordnerverschiebung erfolgreich",
|
||||
"Open folder": "Ordner öffnen",
|
||||
"Save": "Speichern",
|
||||
"Set database location": "Datenbankstandort festlegen",
|
||||
"UNKNOWN_ERROR": "Unbekannter Fehler",
|
||||
"Open folder hint": "Prüfe, wo sich der Speicherordner befindet.",
|
||||
"Storage Folder": "Speicherordner",
|
||||
"Storage Folder Hint": "Speicherort überprüfen oder ändern.",
|
||||
"Sync across devices with AFFiNE Cloud": "Geräteübergreifende Synchronisierung mit AFFiNE Cloud",
|
||||
"Name Your Workspace": "Workspace benennen",
|
||||
"Update Available": "Update verfügbar",
|
||||
"com.affine.edgelessMode": "Edgeless-Modus",
|
||||
"com.affine.onboarding.title2": "Intuitive und robuste, blockbasierte Bearbeitung",
|
||||
"com.affine.onboarding.videoDescription1": "Wechsle mühelos zwischen dem Seitenmodus für die strukturierte Dokumentenerstellung und dem Whiteboard-Modus für den Ausdruck kreativer Ideen in freier Form.",
|
||||
"com.affine.onboarding.videoDescription2": "Verwende eine modulare Schnittstelle, um strukturierte Dokumente zu erstellen, indem du Textblöcke, Bilder und andere Inhalte einfach per Drag-and-drop anordnen kannst.",
|
||||
"com.affine.onboarding.title1": "Hyperfusion von Whiteboard und Dokumenten",
|
||||
"com.affine.pageMode": "Seitenmodus",
|
||||
"Update workspace name success": "Update vom Workspace-Namen erfolgreich",
|
||||
"Use on current device only": "Nur auf dem aktuellen Gerät verwenden",
|
||||
"Workspace database storage description": "Wähle den Ort, an dem du deinen Workspace erstellen möchten. Die Daten vom Workspace werden standardmäßig lokal gespeichert.",
|
||||
"dark": "dunkel",
|
||||
"system": "system",
|
||||
"Restart Install Client Update": "Neustart zum Installieren des Updates",
|
||||
"Add Workspace": "Workspace hinzufügen",
|
||||
"Export success": "Export erfolgreich",
|
||||
"light": "hell",
|
||||
"others": "Andere"
|
||||
}
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
"No item": "No item",
|
||||
"Import": "Import",
|
||||
"Trash": "Trash",
|
||||
"others": "Others",
|
||||
"New Page": "New Page",
|
||||
"New Keyword Page": "New '{{query}}' page",
|
||||
"Find 0 result": "Find 0 result",
|
||||
@@ -118,7 +117,7 @@
|
||||
"login success": "Login success",
|
||||
"Create Or Import": "Create or Import",
|
||||
"Delete Workspace": "Delete Workspace",
|
||||
"Delete Workspace Description2": "Deleting (<1>{{workspace}}</1>) will delete both local and cloud data, this operation cannot be undone, please proceed with caution.",
|
||||
"Delete Workspace Description2": "Deleting <1>{{workspace}}</1> will delete both local and cloud data, this operation cannot be undone, please proceed with caution.",
|
||||
"Delete Workspace placeholder": "Please type “Delete” to confirm",
|
||||
"Leave Workspace": "Leave Workspace",
|
||||
"Leave": "Leave",
|
||||
@@ -149,7 +148,7 @@
|
||||
"Leave Workspace Description": "After you leave, you will no longer be able to access the contents of this workspace.",
|
||||
"Sync Description": "{{workspaceName}} is a Local Workspace. All data is stored on the current device. You can enable AFFiNE Cloud for this workspace to keep data in sync with the cloud.",
|
||||
"Sync Description2": "<1>{{workspaceName}}</1> is a Cloud Workspace. All data will be synchronised and saved to AFFiNE Cloud.",
|
||||
"Delete Workspace Description": "Deleting (<1>{{workspace}}</1>) cannot be undone, please proceed with caution. All contents will be lost.",
|
||||
"Delete Workspace Description": "Deleting <1>{{workspace}}</1> cannot be undone, please proceed with caution. All contents will be lost.",
|
||||
"Sign in": "Sign in AFFiNE Cloud",
|
||||
"core": "core",
|
||||
"all": "all",
|
||||
@@ -258,16 +257,12 @@
|
||||
"Move folder hint": "Select a new storage location.",
|
||||
"Storage Folder": "Storage Folder",
|
||||
"DB_FILE_INVALID": "Invalid Database file",
|
||||
"FILE_ALREADY_EXISTS": "File already exists",
|
||||
"Name Your Workspace": "Name Your Workspace",
|
||||
"Change avatar hint": "New avatar will be shown for everyone.",
|
||||
"Change workspace name hint": "New name will be shown for everyone.",
|
||||
"Delete Workspace Label Hint": "After deleting this Workspace, you will permanently delete all of its content for everyone. No one will be able to recover the content of this Workspace.",
|
||||
"DB_FILE_PATH_INVALID": "Database file path invalid",
|
||||
"Default db location hint": "By default will be saved to {{location}}",
|
||||
"light": "light",
|
||||
"dark": "dark",
|
||||
"system": "system",
|
||||
"com.affine.pageMode": "Page Mode",
|
||||
"com.affine.edgelessMode": "Edgeless Mode",
|
||||
"com.affine.onboarding.title1": "Hyper merged whiteboard and docs",
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
"Users": "Utilisateur",
|
||||
"Quick search placeholder": "Recherche Rapide...",
|
||||
"Access level": "Permissions",
|
||||
"Delete Workspace Description2": "La suppression de (<1>{{workspace}}</1>) aura pour effet de supprimer les données locales et les données dans le cloud. Attention, cette opération est irréversible.",
|
||||
"Delete Workspace Description2": "La suppression de <1>{{workspace}}</1> aura pour effet de supprimer les données locales et les données dans le cloud. Attention, cette opération est irréversible.",
|
||||
"Enable AFFiNE Cloud": "Activer AFFiNE Cloud",
|
||||
"Enable AFFiNE Cloud Description": "Si cette option est activée, les données de cet espace de travail seront sauvegardées et synchronisées via AFFiNE Cloud.",
|
||||
"Export Workspace": "L'exportation de l'espace de travail <1>{{workspace}}</1> sera bientôt disponible.",
|
||||
@@ -171,7 +171,7 @@
|
||||
"All changes are saved locally": "Les changements sont sauvegardés localement",
|
||||
"Continue with Google": "Se connecter avec Google ",
|
||||
"Delete": "Supprimer objet ",
|
||||
"Delete Workspace Description": "Attention, la suppression de (<1>{{workspace}}</1>) est irréversible. Le contenu sera perdu.",
|
||||
"Delete Workspace Description": "Attention, la suppression de <1>{{workspace}}</1> est irréversible. Le contenu sera perdu.",
|
||||
"Share with link": "Partager un lien",
|
||||
"Sync Description": "{{workspaceName}} est un espace de travail local. Toutes ses données sont stockées sur le périphérique actuel. Vous pouvez activer AFFiNE Cloud pour garder les données de cet espace de travail synchronisé dans le cloud.",
|
||||
"TrashButtonGroupDescription": "Une fois supprimé, vous ne pouvez pas retourner en arrière. Confirmez-vous la suppression ? ",
|
||||
|
||||
@@ -278,8 +278,8 @@
|
||||
"Wait for Sync": "同期を待つ",
|
||||
"Strikethrough": "打ち消し線",
|
||||
"Cloud Workspace Description": "すべてのデータは、AFFiNEアカウント<1>{{email}}</1>に同期して保存されます",
|
||||
"Delete Workspace Description": "削除 (<1>{{workspace}}</1>) は元に戻すことができません。慎重に続行してください。すべての内容が失われます",
|
||||
"Delete Workspace Description2": "(<1>{{workspace}}</1>)を削除すると、ローカルデータとクラウドデータの両方が削除されます。この操作は元に戻すことができません。注意して続行してください",
|
||||
"Delete Workspace Description": "削除 <1>{{workspace}}</1> は元に戻すことができません。慎重に続行してください。すべての内容が失われます",
|
||||
"Delete Workspace Description2": "<1>{{workspace}}</1>を削除すると、ローカルデータとクラウドデータの両方が削除されます。この操作は元に戻すことができません。注意して続行してください",
|
||||
"Export Workspace": "ワークスペースのエクスポート <1>{{workspace}}</1>は近日公開予定です",
|
||||
"Sync Description": "{{workspaceName}}はローカルワークスペースです。すべてのデータは現在のデバイスに保存されます。このワークスペースに対してAFFiNEクラウドを有効にして、データをクラウドと同期させることができます",
|
||||
"Sync Description2": "<1>{{workspaceName}}</1>はクラウドワークスペースです。すべてのデータは同期され、AFFiNEクラウドに保存されます",
|
||||
|
||||
@@ -118,8 +118,8 @@
|
||||
"emptyAllPages": "Это рабочее пространство пусто. Создайте новую страницу, чтобы начать редактирование.",
|
||||
"Export Workspace": "Экспорт рабочего пространства <1>{{workspace}}</1> скоро будет доступен",
|
||||
"Delete Workspace placeholder": "Пожалуйста, введите \"Delete\" для подтверждения",
|
||||
"Delete Workspace Description": "Удаление (<1>{{workspace}}</1>) нельзя отменить, пожалуйста, действуйте с осторожностью. Все содержимое будет потеряно.",
|
||||
"Delete Workspace Description2": "Удаление (<1>{{workspace}}</1>) приведет к удалению как локальных, так и облачных данных, эта операция не может быть отменена, пожалуйста действуйте с осторожностью.",
|
||||
"Delete Workspace Description": "Удаление <1>{{workspace}}</1> нельзя отменить, пожалуйста, действуйте с осторожностью. Все содержимое будет потеряно.",
|
||||
"Delete Workspace Description2": "Удаление <1>{{workspace}}</1> приведет к удалению как локальных, так и облачных данных, эта операция не может быть отменена, пожалуйста действуйте с осторожностью.",
|
||||
"Once deleted, you can't undo this action": "После удаления вы не сможете отменить это действие.",
|
||||
"Permanently deleted": "Удалено навсегда",
|
||||
"New Keyword Page": "Новая '{{query}}' страница",
|
||||
|
||||
@@ -12,13 +12,13 @@
|
||||
"Retain cached cloud data": "保留缓存的云数据",
|
||||
"Workspace Owner": "工作区所有者",
|
||||
"Cloud Workspace": "云端工作区",
|
||||
"Cloud Workspace Description": "所有数据将被同步并保存在AFFiNE账户(<1>{{email}}</1>)中",
|
||||
"Copied link to clipboard": "复制链接到剪贴板",
|
||||
"Available Offline": "可供离线使用",
|
||||
"Back Home": "返回首页",
|
||||
"Enabled success": "启用成功",
|
||||
"Published Description": "当前工作区已被发布到Web,所有人都可以通过链接来查看此工作区内容。",
|
||||
"All data has been stored in the cloud": "所有数据已被保存在云端。",
|
||||
"Cloud Workspace Description": "所有数据将被同步并保存在 AFFiNE 账户(<1>{{email}}</1>)中",
|
||||
"Published Description": "当前工作区已被发布到 Web,所有人都可以通过链接来查看此工作区内容。",
|
||||
"Download data": "下载 {{CoreOrAll}} 数据",
|
||||
"Force Sign Out": "强制登出",
|
||||
"Joined Workspace": "加入工作区",
|
||||
@@ -73,18 +73,15 @@
|
||||
"Access level": "访问权限",
|
||||
"Added to Favorites": "已收藏",
|
||||
"Collaboration": "协作",
|
||||
"Collaboration Description": "与其他成员协作需要AFFiNE云服务支持。",
|
||||
"Continue with Google": "谷歌登录以继续",
|
||||
"Delete page?": "确定要删除页面?",
|
||||
"Delete permanently": "永久删除",
|
||||
"Delete permanently?": "是否永久删除?",
|
||||
"Edgeless": "无界",
|
||||
"Enable AFFiNE Cloud": "启用 AFFiNE 云服务",
|
||||
"Enable AFFiNE Cloud Description": "如启用,此工作区中的数据将通过AFFiNE Cloud进行备份和同步。",
|
||||
"Favorites": "收藏夹",
|
||||
"Get in touch!": "保持联络!",
|
||||
"Got it": "知道了",
|
||||
"How is AFFiNE Alpha different?": "AFFiNE Alpha有何不同?",
|
||||
"Invite": "邀请",
|
||||
"Invite Members": "邀请成员",
|
||||
"Invite placeholder": "搜索邮件(仅支持Gmail)",
|
||||
@@ -94,19 +91,23 @@
|
||||
"Leave Workspace": "退出工作区",
|
||||
"Leave Workspace Description": "退出后,您将无法再访问此工作区的内容。",
|
||||
"Link": "超链接(选定文本)",
|
||||
"Collaboration Description": "与其他成员协作需要 AFFiNE 云服务支持。",
|
||||
"Moved to Trash": "已移到垃圾箱",
|
||||
"My Workspaces": "我的工作区",
|
||||
"Enable AFFiNE Cloud Description": "如启用,此工作区中的数据将通过 AFFiNE Cloud 进行备份和同步。",
|
||||
"How is AFFiNE Alpha different?": "AFFiNE Alpha 有何不同?",
|
||||
"Non-Gmail": "不支持非 Gmail 邮箱",
|
||||
"Publishing": "发布到 web 需要 AFFiNE 云服务。",
|
||||
"New Page": "新建页面",
|
||||
"New Workspace": "新建工作区",
|
||||
"No item": "无项目",
|
||||
"Non-Gmail": "不支持非Gmail邮箱",
|
||||
"NotLoggedIn": "当前未登录",
|
||||
"Official Website": "官网",
|
||||
"Once deleted, you can't undo this action": "一旦删除,您将无法撤销此操作。",
|
||||
"Ooops!": "啊哦!",
|
||||
"Publishing Description": "发布到 web 后,所有人都可以通过链接查看此工作区的内容。",
|
||||
"Created": "创建时间",
|
||||
"Delete Workspace Description": "正在删除 (<1>{{workspace}}</1>) ,此操作无法撤销,所有内容将会丢失。",
|
||||
"Delete Workspace Description": "正在删除 <1>{{workspace}}</1> ,此操作无法撤销,所有内容将会丢失。",
|
||||
"Export Workspace": "导出工作区 <1>{{workspace}}</1> 即将上线",
|
||||
"Find 0 result": "找到 0 个结果",
|
||||
"Find results": "找到 {{number}} 个结果",
|
||||
@@ -116,7 +117,6 @@
|
||||
"Pending": "待定",
|
||||
"Permanently deleted": "已永久删除",
|
||||
"Publish": "发布",
|
||||
"Publishing": "发布到web需要AFFiNE云服务。",
|
||||
"Publish to web": "发布到web",
|
||||
"Quick search": "快速搜索",
|
||||
"Quick search placeholder": "快速搜索...",
|
||||
@@ -169,8 +169,8 @@
|
||||
"Restore it": "恢复TA",
|
||||
"all": "全部",
|
||||
"core": "核心",
|
||||
"Sync Description": "{{workspaceName}}是本地工作区,所有数据都存储在当前设备上。您可以为此工作区启用AFFiNE Cloud,以使数据与云端保持同步。",
|
||||
"Delete Workspace Description2": "正在删除(<1>{{workspace}}</1>),将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。",
|
||||
"Delete Workspace Description2": "正在删除 <1>{{workspace}}</1> ,将同时删除本地和云端数据。此操作无法撤消,请谨慎操作。",
|
||||
"Sync Description": "{{workspaceName}}是本地工作区,所有数据都存储在当前设备上。您可以为此工作区启用 AFFiNE Cloud,以使数据与云端保持同步。",
|
||||
"Failed to publish workspace": "工作区发布失败",
|
||||
"Member": "成员",
|
||||
"Member has been removed": "{{name}} 已被移除。",
|
||||
|
||||
@@ -22,5 +22,5 @@
|
||||
"@blocksuite/store": "*",
|
||||
"lottie-web": "*"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -35,5 +35,5 @@
|
||||
"test": "cross-env TS_NODE_TRANSPILE_ONLY=1 TS_NODE_PROJECT=./tsconfig.json node --test --loader ts-node/esm --experimental-specifier-resolution=node ./__tests__/**/*.mts",
|
||||
"version": "napi version"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -5,5 +5,5 @@
|
||||
"exports": {
|
||||
"./*.md": "./src/*.md"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -40,5 +40,5 @@
|
||||
"next": "^13.4.2",
|
||||
"ws": "^8.13.0"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@toeverything/y-indexeddb",
|
||||
"type": "module",
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"scripts": {
|
||||
"build": "vite build"
|
||||
},
|
||||
|
||||
2
tests/fixtures/package.json
vendored
2
tests/fixtures/package.json
vendored
@@ -3,5 +3,5 @@
|
||||
"exports": {
|
||||
"./*": "./*"
|
||||
},
|
||||
"version": "0.5.4-beta.1"
|
||||
"version": "0.6.0-canary.5"
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@affine-test/kit",
|
||||
"private": true,
|
||||
"version": "0.5.4-beta.1",
|
||||
"version": "0.6.0-canary.5",
|
||||
"exports": {
|
||||
"./playwright": "./playwright.ts"
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user