first commit

This commit is contained in:
2025-04-24 13:11:28 +08:00
commit ff9c54d5e4
5960 changed files with 834111 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
import SettingsSection from '../settings-section'
import OverallThemeSetting from '../appearance-settings/overall-theme-setting'
import EditorThemeSetting from './editor-theme-setting'
import FontSizeSetting from './font-size-setting'
import FontFamilySetting from './font-family-setting'
import LineHeightSetting from './line-height-setting'
export default function AppearanceSettings() {
return (
<SettingsSection>
<OverallThemeSetting />
<EditorThemeSetting />
<FontSizeSetting />
<FontFamilySetting />
<LineHeightSetting />
</SettingsSection>
)
}

View File

@@ -0,0 +1,46 @@
import { useProjectSettingsContext } from '@/features/editor-left-menu/context/project-settings-context'
import DropdownSetting from '../dropdown-setting'
import getMeta from '@/utils/meta'
import { useMemo } from 'react'
import type { Option } from '../dropdown-setting'
import { useTranslation } from 'react-i18next'
export default function EditorThemeSetting() {
const editorThemes = getMeta('ol-editorThemes')
const legacyEditorThemes = getMeta('ol-legacyEditorThemes')
const { editorTheme, setEditorTheme } = useProjectSettingsContext()
const { t } = useTranslation()
const options = useMemo(() => {
const editorThemeOptions: Array<Option> =
editorThemes?.map(theme => ({
value: theme,
label: theme.replace(/_/g, ' '),
})) ?? []
const dividerOption: Option = {
value: '-',
label: '—————————————————',
disabled: true,
}
const legacyEditorThemeOptions: Array<Option> =
legacyEditorThemes?.map(theme => ({
value: theme,
label: theme.replace(/_/g, ' ') + ' (Legacy)',
})) ?? []
return [...editorThemeOptions, dividerOption, ...legacyEditorThemeOptions]
}, [editorThemes, legacyEditorThemes])
return (
<DropdownSetting
id="editorTheme"
label={t('editor_theme')}
description={t('the_code_editor_color_scheme')}
options={options}
onChange={setEditorTheme}
value={editorTheme}
/>
)
}

View File

@@ -0,0 +1,32 @@
import { useProjectSettingsContext } from '@/features/editor-left-menu/context/project-settings-context'
import { useTranslation } from 'react-i18next'
import DropdownSetting from '../dropdown-setting'
export default function FontFamilySetting() {
const { fontFamily, setFontFamily } = useProjectSettingsContext()
const { t } = useTranslation()
return (
<DropdownSetting
id="fontFamily"
label={t('editor_font_family')}
options={[
{
value: 'monaco',
label: 'Monaco / Menlo / Consolas',
},
{
value: 'lucida',
label: 'Lucida / Source Code Pro',
},
{
value: 'opendyslexicmono',
label: 'OpenDyslexic Mono',
},
]}
onChange={setFontFamily}
value={fontFamily}
width="wide"
/>
)
}

View File

@@ -0,0 +1,24 @@
import { useProjectSettingsContext } from '@/features/editor-left-menu/context/project-settings-context'
import { useTranslation } from 'react-i18next'
import DropdownSetting from '../dropdown-setting'
const sizes = [10, 11, 12, 13, 14, 16, 18, 20, 22, 24]
const options = sizes.map(size => ({
value: size,
label: `${size}px`,
}))
export default function FontSizeSetting() {
const { fontSize, setFontSize } = useProjectSettingsContext()
const { t } = useTranslation()
return (
<DropdownSetting
id="fontSize"
label={t('editor_font_size')}
options={options}
onChange={setFontSize}
value={fontSize}
/>
)
}

View File

@@ -0,0 +1,31 @@
import { useProjectSettingsContext } from '@/features/editor-left-menu/context/project-settings-context'
import { useTranslation } from 'react-i18next'
import DropdownSetting from '../dropdown-setting'
export default function LineHeightSetting() {
const { lineHeight, setLineHeight } = useProjectSettingsContext()
const { t } = useTranslation()
return (
<DropdownSetting
id="lineHeight"
label={t('editor_line_height')}
options={[
{
value: 'compact',
label: t('compact'),
},
{
value: 'normal',
label: t('normal'),
},
{
value: 'wide',
label: t('wide'),
},
]}
onChange={setLineHeight}
value={lineHeight}
/>
)
}

View File

@@ -0,0 +1,45 @@
import { useProjectSettingsContext } from '@/features/editor-left-menu/context/project-settings-context'
import DropdownSetting from '../dropdown-setting'
import getMeta from '@/utils/meta'
import { useMemo } from 'react'
import type { Option } from '../dropdown-setting'
import { useTranslation } from 'react-i18next'
import { OverallThemeMeta } from '../../../../../../../types/project-settings'
import { isIEEEBranded } from '@/utils/is-ieee-branded'
import { useLayoutContext } from '@/shared/context/layout-context'
import { OverallTheme } from '@/shared/utils/styles'
export default function OverallThemeSetting() {
const { t } = useTranslation()
const overallThemes = getMeta('ol-overallThemes') as
| OverallThemeMeta[]
| undefined
const { loadingStyleSheet } = useLayoutContext()
const { overallTheme, setOverallTheme } = useProjectSettingsContext()
const options: Array<Option<OverallTheme>> = useMemo(
() =>
overallThemes?.map(({ name, val }) => ({
value: val,
label: name,
})) ?? [],
[overallThemes]
)
if (!overallThemes || isIEEEBranded()) {
return null
}
return (
<DropdownSetting
id="overallTheme"
label={t('overall_theme')}
description={t('the_overleaf_color_scheme')}
options={options}
onChange={setOverallTheme}
value={overallTheme}
loading={loadingStyleSheet}
/>
)
}