fix(component): adjust dialog and input style (#4566)

This commit is contained in:
JimmFly 2023-10-12 13:49:39 +08:00 committed by GitHub
parent d05897b724
commit daa976ca62
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
18 changed files with 141 additions and 133 deletions

View File

@ -40,7 +40,7 @@
"@mui/material": "^5.14.13", "@mui/material": "^5.14.13",
"@radix-ui/react-select": "^2.0.0", "@radix-ui/react-select": "^2.0.0",
"@react-hookz/web": "^23.1.0", "@react-hookz/web": "^23.1.0",
"@toeverything/components": "^0.0.43", "@toeverything/components": "^0.0.45",
"async-call-rpc": "^6.3.1", "async-call-rpc": "^6.3.1",
"css-spring": "^4.1.0", "css-spring": "^4.1.0",
"cssnano": "^6.0.1", "cssnano": "^6.0.1",

View File

@ -3,7 +3,11 @@ import { DebugLogger } from '@affine/debug';
import { useAFFiNEI18N } from '@affine/i18n/hooks'; import { useAFFiNEI18N } from '@affine/i18n/hooks';
import { HelpIcon } from '@blocksuite/icons'; import { HelpIcon } from '@blocksuite/icons';
import { Button } from '@toeverything/components/button'; import { Button } from '@toeverything/components/button';
import { Modal } from '@toeverything/components/modal'; import {
ConfirmModal,
type ConfirmModalProps,
Modal,
} from '@toeverything/components/modal';
import { Tooltip } from '@toeverything/components/tooltip'; import { Tooltip } from '@toeverything/components/tooltip';
import type { import type {
LoadDBFileResult, LoadDBFileResult,
@ -34,14 +38,13 @@ interface ModalProps {
onCreate: (id: string) => void; onCreate: (id: string) => void;
} }
interface NameWorkspaceContentProps { interface NameWorkspaceContentProps extends ConfirmModalProps {
onClose: () => void;
onConfirmName: (name: string) => void; onConfirmName: (name: string) => void;
} }
const NameWorkspaceContent = ({ const NameWorkspaceContent = ({
onConfirmName, onConfirmName,
onClose, ...props
}: NameWorkspaceContentProps) => { }: NameWorkspaceContentProps) => {
const [workspaceName, setWorkspaceName] = useState(''); const [workspaceName, setWorkspaceName] = useState('');
@ -59,11 +62,23 @@ const NameWorkspaceContent = ({
); );
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
return ( return (
<div className={style.content}> <ConfirmModal
<div className={style.contentTitle}> defaultOpen={true}
{t['com.affine.nameWorkspace.title']()} title={t['com.affine.nameWorkspace.title']()}
</div> description={t['com.affine.nameWorkspace.description']()}
<p>{t['com.affine.nameWorkspace.description']()}</p> cancelText={t['com.affine.nameWorkspace.button.cancel']()}
confirmButtonOptions={{
type: 'primary',
disabled: !workspaceName,
['data-testid' as string]: 'create-workspace-create-button',
children: t['com.affine.nameWorkspace.button.create'](),
}}
closeButtonOptions={{
['data-testid' as string]: 'create-workspace-close-button',
}}
onConfirm={handleCreateWorkspace}
{...props}
>
<Input <Input
ref={ref => { ref={ref => {
if (ref) { if (ref) {
@ -76,24 +91,9 @@ const NameWorkspaceContent = ({
maxLength={64} maxLength={64}
minLength={0} minLength={0}
onChange={setWorkspaceName} onChange={setWorkspaceName}
size="large"
/> />
<div className={style.buttonGroup}> </ConfirmModal>
<Button data-testid="create-workspace-close-button" onClick={onClose}>
{t['com.affine.nameWorkspace.button.cancel']()}
</Button>
<Button
data-testid="create-workspace-create-button"
disabled={!workspaceName}
style={{
opacity: !workspaceName ? 0.5 : 1,
}}
type="primary"
onClick={handleCreateWorkspace}
>
{t['com.affine.nameWorkspace.button.create']()}
</Button>
</div>
</div>
); );
}; };
@ -342,15 +342,6 @@ export const CreateWorkspaceModal = ({
[createLocalWorkspace, onCreate] [createLocalWorkspace, onCreate]
); );
const nameWorkspaceNode =
step === 'name-workspace' ? (
<NameWorkspaceContent
// go to previous step instead?
onClose={onClose}
onConfirmName={onConfirmName}
/>
) : null;
const setDBLocationNode = const setDBLocationNode =
step === 'set-db-location' ? ( step === 'set-db-location' ? (
<SetDBLocationContent <SetDBLocationContent
@ -377,6 +368,15 @@ export const CreateWorkspaceModal = ({
}, },
[onClose] [onClose]
); );
if (step === 'name-workspace') {
return (
<NameWorkspaceContent
open={mode !== false && !!step}
onOpenChange={onOpenChange}
onConfirmName={onConfirmName}
/>
);
}
return ( return (
<Modal <Modal
@ -388,7 +388,6 @@ export const CreateWorkspaceModal = ({
}} }}
> >
<div className={style.header}></div> <div className={style.header}></div>
{nameWorkspaceNode}
{setDBLocationNode} {setDBLocationNode}
{setSyncingModeNode} {setSyncingModeNode}
</Modal> </Modal>

View File

@ -38,7 +38,6 @@ export const EnableAffineCloudModal = ({
return ( return (
<ConfirmModal <ConfirmModal
width={480}
title={t['Enable AFFiNE Cloud']()} title={t['Enable AFFiNE Cloud']()}
description={t['Enable AFFiNE Cloud Description']()} description={t['Enable AFFiNE Cloud Description']()}
cancelText={t['com.affine.enableAffineCloudModal.button.cancel']()} cancelText={t['com.affine.enableAffineCloudModal.button.cancel']()}

View File

@ -8,9 +8,9 @@ import {
type ConfirmModalProps, type ConfirmModalProps,
} from '@toeverything/components/modal'; } from '@toeverything/components/modal';
import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name'; import { useBlockSuiteWorkspaceName } from '@toeverything/hooks/use-block-suite-workspace-name';
import { useState } from 'react'; import { useCallback, useState } from 'react';
import { StyledInputContent, StyledWorkspaceName } from './style'; import * as styles from './style.css';
interface WorkspaceDeleteProps extends ConfirmModalProps { interface WorkspaceDeleteProps extends ConfirmModalProps {
workspace: AffineOfficialWorkspace; workspace: AffineOfficialWorkspace;
@ -20,6 +20,7 @@ export const WorkspaceDeleteModal = ({
workspace, workspace,
...props ...props
}: WorkspaceDeleteProps) => { }: WorkspaceDeleteProps) => {
const { onConfirm } = props;
const [workspaceName] = useBlockSuiteWorkspaceName( const [workspaceName] = useBlockSuiteWorkspaceName(
workspace.blockSuiteWorkspace workspace.blockSuiteWorkspace
); );
@ -27,6 +28,12 @@ export const WorkspaceDeleteModal = ({
const allowDelete = deleteStr === workspaceName; const allowDelete = deleteStr === workspaceName;
const t = useAFFiNEI18N(); const t = useAFFiNEI18N();
const handleOnEnter = useCallback(() => {
if (allowDelete) {
return onConfirm?.();
}
}, [allowDelete, onConfirm]);
return ( return (
<ConfirmModal <ConfirmModal
title={`${t['com.affine.workspaceDelete.title']()}?`} title={`${t['com.affine.workspaceDelete.title']()}?`}
@ -42,23 +49,23 @@ export const WorkspaceDeleteModal = ({
{workspace.flavour === WorkspaceFlavour.LOCAL ? ( {workspace.flavour === WorkspaceFlavour.LOCAL ? (
<Trans i18nKey="com.affine.workspaceDelete.description"> <Trans i18nKey="com.affine.workspaceDelete.description">
Deleting ( Deleting (
<StyledWorkspaceName> <span className={styles.workspaceName}>
{{ workspace: workspaceName } as any} {{ workspace: workspaceName } as any}
</StyledWorkspaceName> </span>
) cannot be undone, please proceed with caution. All contents will be ) cannot be undone, please proceed with caution. All contents will be
lost. lost.
</Trans> </Trans>
) : ( ) : (
<Trans i18nKey="com.affine.workspaceDelete.description2"> <Trans i18nKey="com.affine.workspaceDelete.description2">
Deleting ( Deleting (
<StyledWorkspaceName> <span className={styles.workspaceName}>
{{ workspace: workspaceName } as any} {{ workspace: workspaceName } as any}
</StyledWorkspaceName> </span>
) will delete both local and cloud data, this operation cannot be ) will delete both local and cloud data, this operation cannot be
undone, please proceed with caution. undone, please proceed with caution.
</Trans> </Trans>
)} )}
<StyledInputContent> <div className={styles.inputContent}>
<Input <Input
ref={ref => { ref={ref => {
if (ref) { if (ref) {
@ -67,11 +74,11 @@ export const WorkspaceDeleteModal = ({
}} }}
onChange={setDeleteStr} onChange={setDeleteStr}
data-testid="delete-workspace-input" data-testid="delete-workspace-input"
onEnter={handleOnEnter}
placeholder={t['com.affine.workspaceDelete.placeholder']()} placeholder={t['com.affine.workspaceDelete.placeholder']()}
width={315} size="large"
height={42}
/> />
</StyledInputContent> </div>
</ConfirmModal> </ConfirmModal>
); );
}; };

View File

@ -0,0 +1,29 @@
import { style } from '@vanilla-extract/css';
export const modalWrapper = style({
position: 'relative',
padding: '0px',
width: '560px',
background: 'var(--affine-background-overlay-panel-color)',
borderRadius: '12px',
});
export const modalHeader = style({
margin: '44px 0px 12px 0px',
width: '560px',
fontWeight: '600',
fontSize: '20px;',
textAlign: 'center',
});
export const inputContent = style({
display: 'flex',
flexDirection: 'row',
justifyContent: 'center',
margin: '24px 0',
fontSize: 'var(--affine-font-base)',
});
export const workspaceName = style({
fontWeight: '600',
});

View File

@ -1,38 +0,0 @@
import { styled } from '@affine/component';
export const StyledModalWrapper = styled('div')(() => {
return {
position: 'relative',
padding: '0px',
width: '560px',
background: 'var(--affine-background-overlay-panel-color)',
borderRadius: '12px',
// height: '312px',
};
});
export const StyledModalHeader = styled('div')(() => {
return {
margin: '44px 0px 12px 0px',
width: '560px',
fontWeight: '600',
fontSize: '20px;',
textAlign: 'center',
};
});
export const StyledInputContent = styled('div')(() => {
return {
display: 'flex',
flexDirection: 'row',
justifyContent: 'center',
margin: '24px 0',
fontSize: 'var(--affine-font-base)',
};
});
export const StyledWorkspaceName = styled('span')(() => {
return {
fontWeight: '600',
};
});

View File

@ -88,12 +88,13 @@ export const AvatarAndName = () => {
const user = useCurrentUser(); const user = useCurrentUser();
const [input, setInput] = useState<string>(user.name); const [input, setInput] = useState<string>(user.name);
const handleUpdateUserName = useCallback( const allowUpdate = !!input && input !== user.name;
(newName: string) => { const handleUpdateUserName = useCallback(() => {
user.update({ name: newName }).catch(console.error); if (!allowUpdate) {
}, return;
[user] }
); user.update({ name: input }).catch(console.error);
}, [allowUpdate, input, user]);
return ( return (
<> <>
@ -119,20 +120,19 @@ export const AvatarAndName = () => {
width={280} width={280}
height={28} height={28}
onChange={setInput} onChange={setInput}
onEnter={handleUpdateUserName}
/> />
{input && input === user.name ? null : ( {allowUpdate ? (
<Button <Button
data-testid="save-user-name" data-testid="save-user-name"
onClick={() => { onClick={handleUpdateUserName}
handleUpdateUserName(input);
}}
style={{ style={{
marginLeft: '12px', marginLeft: '12px',
}} }}
> >
{t['com.affine.editCollection.save']()} {t['com.affine.editCollection.save']()}
</Button> </Button>
)} ) : null}
</FlexWrapper> </FlexWrapper>
</div> </div>
</FlexWrapper> </FlexWrapper>

View File

@ -38,7 +38,7 @@
"@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-toast": "^1.1.5",
"@toeverything/hooks": "workspace:*", "@toeverything/hooks": "workspace:*",
"@toeverything/infra": "workspace:*", "@toeverything/infra": "workspace:*",
"@toeverything/theme": "^0.7.18", "@toeverything/theme": "^0.7.20",
"@vanilla-extract/dynamic": "^2.0.3", "@vanilla-extract/dynamic": "^2.0.3",
"check-password-strength": "^2.0.7", "check-password-strength": "^2.0.7",
"clsx": "^2.0.0", "clsx": "^2.0.0",

View File

@ -48,7 +48,6 @@ export const InviteModal = ({
<ConfirmModal <ConfirmModal
open={open} open={open}
onOpenChange={setOpen} onOpenChange={setOpen}
width={480}
title={t['Invite Members']()} title={t['Invite Members']()}
description={t['Invite Members Message']()} description={t['Invite Members Message']()}
cancelText={t['com.affine.inviteModal.button.cancel']()} cancelText={t['com.affine.inviteModal.button.cancel']()}

View File

@ -226,10 +226,12 @@ export const EditCollection = ({
</div> </div>
<div style={{ marginTop: 20 }}> <div style={{ marginTop: 20 }}>
<Input <Input
size="large"
data-testid="input-collection-title" data-testid="input-collection-title"
placeholder={t['com.affine.editCollection.untitledCollection']()} placeholder={t['com.affine.editCollection.untitledCollection']()}
defaultValue={value.name} defaultValue={value.name}
onChange={name => onChange({ ...value, name })} onChange={name => onChange({ ...value, name })}
onEnter={onSaveCollection}
/> />
</div> </div>
</ScrollableContainer> </ScrollableContainer>

View File

@ -9,7 +9,6 @@ export const PublicLinkDisableModal = (props: ConfirmModalProps) => {
return ( return (
<ConfirmModal <ConfirmModal
width={480}
title={t['com.affine.publicLinkDisableModal.title']()} title={t['com.affine.publicLinkDisableModal.title']()}
description={t['com.affine.publicLinkDisableModal.description']()} description={t['com.affine.publicLinkDisableModal.description']()}
cancelText={t['com.affine.publicLinkDisableModal.button.cancel']()} cancelText={t['com.affine.publicLinkDisableModal.button.cancel']()}

View File

@ -79,7 +79,10 @@ export const Input = forwardRef<HTMLInputElement, InputProps>(function Input(
> >
{preFix} {preFix}
<input <input
className={clsx(input)} className={clsx(input, {
large: size === 'large',
'extra-large': size === 'extraLarge',
})}
ref={ref} ref={ref}
disabled={disabled} disabled={disabled}
style={inputStyle} style={inputStyle}

View File

@ -8,16 +8,17 @@ export const inputWrapper = style({
}, },
width: widthVar, width: widthVar,
height: 28, height: 28,
lineHeight: '22px', padding: '4px 10px',
padding: '0 10px', color: 'var(--affine-icon-color)',
color: 'var(--affine-text-primary-color)', border: '1px solid var(--affine-border-color)',
border: '1px solid', backgroundColor: 'var(--affine-white-10)',
backgroundColor: 'var(--affine-white)',
borderRadius: 8, borderRadius: 8,
display: 'flex', display: 'flex',
justifyContent: 'center', justifyContent: 'center',
alignItems: 'center', alignItems: 'center',
fontSize: 'var(--affine-font-base)', gap: 8,
// icon size
fontSize: '16px',
selectors: { selectors: {
'&.no-border': { '&.no-border': {
@ -26,10 +27,14 @@ export const inputWrapper = style({
// size // size
'&.large': { '&.large': {
height: 32, height: 32,
// icon size
fontSize: '20px',
}, },
'&.extra-large': { '&.extra-large': {
height: 40, height: 40,
fontWeight: 600, padding: '8px 10px',
// icon size
fontSize: '20px',
}, },
// color // color
'&.disabled': { '&.disabled': {
@ -44,20 +49,20 @@ export const inputWrapper = style({
'&.warning': { '&.warning': {
borderColor: 'var(--affine-warning-color)', borderColor: 'var(--affine-warning-color)',
}, },
'&.default': {
borderColor: 'var(--affine-border-color)',
},
'&.default.focus': { '&.default.focus': {
borderColor: 'var(--affine-primary-color)', borderColor: 'var(--affine-primary-color)',
boxShadow: '0px 0px 0px 2px rgba(30, 150, 235, 0.30);', boxShadow: 'var(--affine-active-shadow)',
}, },
}, },
}); });
export const input = style({ export const input = style({
height: '100%',
width: '0', width: '0',
flex: 1, flex: 1,
fontSize: 'var(--affine-font-xs)',
lineHeight: '20px',
fontWeight: '500',
color: 'var(--affine-text-primary-color)',
boxSizing: 'border-box', boxSizing: 'border-box',
// prevent default style // prevent default style
WebkitAppearance: 'none', WebkitAppearance: 'none',
@ -72,5 +77,9 @@ export const input = style({
'&:disabled': { '&:disabled': {
color: 'var(--affine-text-disable-color)', color: 'var(--affine-text-disable-color)',
}, },
'&.large, &.extra-large': {
fontSize: 'var(--affine-font-base)',
lineHeight: '24px',
},
}, },
}); });

View File

@ -17,7 +17,7 @@
"@affine/component": "workspace:*", "@affine/component": "workspace:*",
"@affine/sdk": "workspace:*", "@affine/sdk": "workspace:*",
"@blocksuite/icons": "2.1.34", "@blocksuite/icons": "2.1.34",
"@toeverything/components": "^0.0.43", "@toeverything/components": "^0.0.45",
"@vanilla-extract/css": "^1.13.0", "@vanilla-extract/css": "^1.13.0",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"idb": "^7.1.1", "idb": "^7.1.1",

View File

@ -18,7 +18,7 @@
"@affine/component": "workspace:*", "@affine/component": "workspace:*",
"@affine/sdk": "workspace:*", "@affine/sdk": "workspace:*",
"@blocksuite/icons": "2.1.34", "@blocksuite/icons": "2.1.34",
"@toeverything/components": "^0.0.43" "@toeverything/components": "^0.0.45"
}, },
"devDependencies": { "devDependencies": {
"@affine/plugin-cli": "workspace:*" "@affine/plugin-cli": "workspace:*"

View File

@ -17,8 +17,8 @@
"@affine/component": "workspace:*", "@affine/component": "workspace:*",
"@affine/sdk": "workspace:*", "@affine/sdk": "workspace:*",
"@blocksuite/icons": "2.1.34", "@blocksuite/icons": "2.1.34",
"@toeverything/components": "^0.0.43", "@toeverything/components": "^0.0.45",
"@toeverything/theme": "^0.7.18", "@toeverything/theme": "^0.7.20",
"clsx": "^2.0.0", "clsx": "^2.0.0",
"foxact": "^0.2.20", "foxact": "^0.2.20",
"react-error-boundary": "^4.0.11", "react-error-boundary": "^4.0.11",

View File

@ -18,7 +18,7 @@
"@affine/component": "workspace:*", "@affine/component": "workspace:*",
"@affine/sdk": "workspace:*", "@affine/sdk": "workspace:*",
"@blocksuite/icons": "2.1.34", "@blocksuite/icons": "2.1.34",
"@toeverything/components": "^0.0.43" "@toeverything/components": "^0.0.45"
}, },
"devDependencies": { "devDependencies": {
"@affine/plugin-cli": "workspace:*", "@affine/plugin-cli": "workspace:*",

View File

@ -208,7 +208,7 @@ __metadata:
"@testing-library/react": ^14.0.0 "@testing-library/react": ^14.0.0
"@toeverything/hooks": "workspace:*" "@toeverything/hooks": "workspace:*"
"@toeverything/infra": "workspace:*" "@toeverything/infra": "workspace:*"
"@toeverything/theme": ^0.7.18 "@toeverything/theme": ^0.7.20
"@types/react": ^18.2.22 "@types/react": ^18.2.22
"@types/react-datepicker": ^4.15.0 "@types/react-datepicker": ^4.15.0
"@types/react-dnd": ^3.0.2 "@types/react-dnd": ^3.0.2
@ -258,7 +258,7 @@ __metadata:
"@affine/plugin-cli": "workspace:*" "@affine/plugin-cli": "workspace:*"
"@affine/sdk": "workspace:*" "@affine/sdk": "workspace:*"
"@blocksuite/icons": 2.1.34 "@blocksuite/icons": 2.1.34
"@toeverything/components": ^0.0.43 "@toeverything/components": ^0.0.45
"@types/marked": ^5.0.1 "@types/marked": ^5.0.1
"@vanilla-extract/css": ^1.13.0 "@vanilla-extract/css": ^1.13.0
clsx: ^2.0.0 clsx: ^2.0.0
@ -311,7 +311,7 @@ __metadata:
"@sentry/webpack-plugin": ^2.7.1 "@sentry/webpack-plugin": ^2.7.1
"@svgr/webpack": ^8.1.0 "@svgr/webpack": ^8.1.0
"@swc/core": ^1.3.87 "@swc/core": ^1.3.87
"@toeverything/components": ^0.0.43 "@toeverything/components": ^0.0.45
"@types/lodash-es": ^4.17.9 "@types/lodash-es": ^4.17.9
"@types/webpack-env": ^1.18.1 "@types/webpack-env": ^1.18.1
async-call-rpc: ^6.3.1 async-call-rpc: ^6.3.1
@ -471,7 +471,7 @@ __metadata:
"@affine/plugin-cli": "workspace:*" "@affine/plugin-cli": "workspace:*"
"@affine/sdk": "workspace:*" "@affine/sdk": "workspace:*"
"@blocksuite/icons": 2.1.34 "@blocksuite/icons": 2.1.34
"@toeverything/components": ^0.0.43 "@toeverything/components": ^0.0.45
languageName: unknown languageName: unknown
linkType: soft linkType: soft
@ -497,8 +497,8 @@ __metadata:
"@affine/plugin-cli": "workspace:*" "@affine/plugin-cli": "workspace:*"
"@affine/sdk": "workspace:*" "@affine/sdk": "workspace:*"
"@blocksuite/icons": 2.1.34 "@blocksuite/icons": 2.1.34
"@toeverything/components": ^0.0.43 "@toeverything/components": ^0.0.45
"@toeverything/theme": ^0.7.18 "@toeverything/theme": ^0.7.20
clsx: ^2.0.0 clsx: ^2.0.0
foxact: ^0.2.20 foxact: ^0.2.20
react-error-boundary: ^4.0.11 react-error-boundary: ^4.0.11
@ -596,7 +596,7 @@ __metadata:
"@affine/plugin-cli": "workspace:*" "@affine/plugin-cli": "workspace:*"
"@affine/sdk": "workspace:*" "@affine/sdk": "workspace:*"
"@blocksuite/icons": 2.1.34 "@blocksuite/icons": 2.1.34
"@toeverything/components": ^0.0.43 "@toeverything/components": ^0.0.45
jotai: ^2.4.3 jotai: ^2.4.3
react: 18.2.0 react: 18.2.0
react-dom: 18.2.0 react-dom: 18.2.0
@ -12413,9 +12413,9 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@toeverything/components@npm:^0.0.43": "@toeverything/components@npm:^0.0.45":
version: 0.0.43 version: 0.0.45
resolution: "@toeverything/components@npm:0.0.43" resolution: "@toeverything/components@npm:0.0.45"
dependencies: dependencies:
"@blocksuite/icons": ^2.1.33 "@blocksuite/icons": ^2.1.33
"@radix-ui/react-dialog": ^1.0.4 "@radix-ui/react-dialog": ^1.0.4
@ -12427,7 +12427,7 @@ __metadata:
clsx: ^2 clsx: ^2
react: ^18 react: ^18
react-dom: ^18 react-dom: ^18
checksum: 37e59ca10be31be25464a8445fbb0e4c74abe4208d0484541986fb63b3b777d63015be0a3b2dea7e8be5fd1456f3dabc0fc1df232d3e7fbcbc6f8aff4fcbab5a checksum: 79d81a2cd31ed3bac11204d62967846eda39ff3809f6ecb40fa1c4cf5ec6dae1cfd31f7568193feaaf199b04b1125af30f06034903ec4cfe282bb13af701db64
languageName: node languageName: node
linkType: hard linkType: hard
@ -12530,10 +12530,10 @@ __metadata:
languageName: unknown languageName: unknown
linkType: soft linkType: soft
"@toeverything/theme@npm:^0.7.18": "@toeverything/theme@npm:^0.7.20":
version: 0.7.18 version: 0.7.20
resolution: "@toeverything/theme@npm:0.7.18" resolution: "@toeverything/theme@npm:0.7.20"
checksum: 61e7e2d6f6eab6c09feabea6466aa69faa5e440f5cd2b85f6e264424dc0d88368a8c4f1c8df05309dca7bd27f1cd2566c83e66c3e83ace7dfa2ac61e598da92b checksum: 04fa54b180a0a486f6266578dac15b64ce615754426e2a836a43bc942292df687ab7582a3d4ebcc1629b20f92ad1ae65da60b742525ba39099a217f4c6db4ea1
languageName: node languageName: node
linkType: hard linkType: hard