mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-12 14:40:22 +08:00
fix(editor): should update color of edgeless text when switching theme (#11853)
Closes: [BS-3258](https://linear.app/affine-design/issue/BS-3258/edgeless-text-颜色不符合预期)
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { TextUtils } from '@blocksuite/affine-block-surface';
|
import { TextUtils } from '@blocksuite/affine-block-surface';
|
||||||
import { formatBlockCommand } from '@blocksuite/affine-inline-preset';
|
import { formatBlockCommand } from '@blocksuite/affine-inline-preset';
|
||||||
import {
|
import {
|
||||||
|
DefaultTheme,
|
||||||
EDGELESS_TEXT_BLOCK_MIN_HEIGHT,
|
EDGELESS_TEXT_BLOCK_MIN_HEIGHT,
|
||||||
EDGELESS_TEXT_BLOCK_MIN_WIDTH,
|
EDGELESS_TEXT_BLOCK_MIN_WIDTH,
|
||||||
type EdgelessTextBlockModel,
|
type EdgelessTextBlockModel,
|
||||||
@@ -359,13 +360,17 @@ export class EdgelessTextBlockComponent extends GfxBlockComponent<EdgelessTextBl
|
|||||||
}
|
}
|
||||||
|
|
||||||
override renderPageContent() {
|
override renderPageContent() {
|
||||||
const { fontFamily, fontStyle, fontWeight, textAlign } = this.model.props;
|
const { color, fontFamily, fontStyle, fontWeight, textAlign } =
|
||||||
const color = this.std
|
this.model.props;
|
||||||
.get(ThemeProvider)
|
const themeProvider = this.std.get(ThemeProvider);
|
||||||
.generateColorProperty(this.model.props.color, '#000000');
|
const textColor = themeProvider.generateColorProperty(
|
||||||
|
color,
|
||||||
|
DefaultTheme.textColor,
|
||||||
|
themeProvider.theme$.value
|
||||||
|
);
|
||||||
|
|
||||||
const style = styleMap({
|
const style = styleMap({
|
||||||
'--edgeless-text-color': color,
|
'--edgeless-text-color': textColor,
|
||||||
'--edgeless-text-font-family': TextUtils.wrapFontFamily(fontFamily),
|
'--edgeless-text-font-family': TextUtils.wrapFontFamily(fontFamily),
|
||||||
'--edgeless-text-font-style': fontStyle,
|
'--edgeless-text-font-style': fontStyle,
|
||||||
'--edgeless-text-font-weight': fontWeight,
|
'--edgeless-text-font-weight': fontWeight,
|
||||||
|
|||||||
@@ -20,9 +20,9 @@ import {
|
|||||||
TextAlign,
|
TextAlign,
|
||||||
TextAlignSchema,
|
TextAlignSchema,
|
||||||
type TextStyleProps,
|
type TextStyleProps,
|
||||||
} from '../../consts/index.js';
|
} from '../../consts/index';
|
||||||
import { ColorSchema } from '../../themes/color.js';
|
import { ColorSchema } from '../../themes/color';
|
||||||
import { DefaultTheme } from '../../themes/default.js';
|
import { DefaultTheme } from '../../themes/default';
|
||||||
|
|
||||||
type EdgelessTextProps = {
|
type EdgelessTextProps = {
|
||||||
hasMaxWidth: boolean;
|
hasMaxWidth: boolean;
|
||||||
@@ -33,15 +33,15 @@ export const EdgelessTextZodSchema = z
|
|||||||
.object({
|
.object({
|
||||||
color: ColorSchema,
|
color: ColorSchema,
|
||||||
fontFamily: FontFamilySchema,
|
fontFamily: FontFamilySchema,
|
||||||
fontWeight: FontWeightSchema,
|
|
||||||
fontStyle: FontStyleSchema,
|
fontStyle: FontStyleSchema,
|
||||||
|
fontWeight: FontWeightSchema,
|
||||||
textAlign: TextAlignSchema,
|
textAlign: TextAlignSchema,
|
||||||
})
|
})
|
||||||
.default({
|
.default({
|
||||||
color: DefaultTheme.textColor,
|
color: DefaultTheme.textColor,
|
||||||
fontFamily: FontFamily.Inter,
|
fontFamily: FontFamily.Inter,
|
||||||
fontWeight: FontWeight.Regular,
|
|
||||||
fontStyle: FontStyle.Normal,
|
fontStyle: FontStyle.Normal,
|
||||||
|
fontWeight: FontWeight.Regular,
|
||||||
textAlign: TextAlign.Left,
|
textAlign: TextAlign.Left,
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -51,14 +51,10 @@ export const EdgelessTextBlockSchema = defineBlockSchema({
|
|||||||
xywh: '[0,0,16,16]',
|
xywh: '[0,0,16,16]',
|
||||||
index: 'a0',
|
index: 'a0',
|
||||||
lockedBySelf: false,
|
lockedBySelf: false,
|
||||||
color: '#000000',
|
|
||||||
fontFamily: FontFamily.Inter,
|
|
||||||
fontStyle: FontStyle.Normal,
|
|
||||||
fontWeight: FontWeight.Regular,
|
|
||||||
textAlign: TextAlign.Left,
|
|
||||||
scale: 1,
|
scale: 1,
|
||||||
rotate: 0,
|
rotate: 0,
|
||||||
hasMaxWidth: false,
|
hasMaxWidth: false,
|
||||||
|
...EdgelessTextZodSchema.parse(undefined),
|
||||||
}),
|
}),
|
||||||
metadata: {
|
metadata: {
|
||||||
version: 1,
|
version: 1,
|
||||||
@@ -75,9 +71,7 @@ export const EdgelessTextBlockSchema = defineBlockSchema({
|
|||||||
'affine:latex',
|
'affine:latex',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
toModel: () => {
|
toModel: () => new EdgelessTextBlockModel(),
|
||||||
return new EdgelessTextBlockModel();
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
export const EdgelessTextBlockSchemaExtension = BlockSchemaExtension(
|
export const EdgelessTextBlockSchemaExtension = BlockSchemaExtension(
|
||||||
|
|||||||
@@ -0,0 +1,102 @@
|
|||||||
|
import { test } from '@affine-test/kit/playwright';
|
||||||
|
import {
|
||||||
|
clickEdgelessModeButton,
|
||||||
|
locateEditorContainer,
|
||||||
|
locateToolbar,
|
||||||
|
} from '@affine-test/kit/utils/editor';
|
||||||
|
import { openHomePage } from '@affine-test/kit/utils/load-page';
|
||||||
|
import {
|
||||||
|
clickNewPageButton,
|
||||||
|
type,
|
||||||
|
waitForEditorLoad,
|
||||||
|
} from '@affine-test/kit/utils/page-logic';
|
||||||
|
import { expect, type Locator } from '@playwright/test';
|
||||||
|
|
||||||
|
function getEdgelessTextColor(text: Locator) {
|
||||||
|
return text
|
||||||
|
.locator('.affine-block-children-container')
|
||||||
|
.first()
|
||||||
|
.evaluate(e => e.style.getPropertyValue('--edgeless-text-color'));
|
||||||
|
}
|
||||||
|
|
||||||
|
test.beforeEach(async ({ page }) => {
|
||||||
|
await openHomePage(page);
|
||||||
|
await waitForEditorLoad(page);
|
||||||
|
await clickNewPageButton(page);
|
||||||
|
await clickEdgelessModeButton(page);
|
||||||
|
const container = locateEditorContainer(page);
|
||||||
|
await container.click();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('should update color of edgeless text when switching theme', async ({
|
||||||
|
page,
|
||||||
|
}) => {
|
||||||
|
const container = locateEditorContainer(page);
|
||||||
|
await container.dblclick();
|
||||||
|
|
||||||
|
await page.waitForSelector('affine-edgeless-text');
|
||||||
|
|
||||||
|
await type(page, 'text color');
|
||||||
|
|
||||||
|
await page.keyboard.press('Escape');
|
||||||
|
await page.keyboard.press('Escape');
|
||||||
|
|
||||||
|
const text = page.locator('affine-edgeless-text');
|
||||||
|
|
||||||
|
await text.click();
|
||||||
|
|
||||||
|
const toolbar = locateToolbar(page);
|
||||||
|
|
||||||
|
await expect(toolbar).toBeVisible();
|
||||||
|
|
||||||
|
const colorPicker = toolbar.locator('edgeless-color-picker-button');
|
||||||
|
const colorButton = toolbar.getByLabel('Text color');
|
||||||
|
|
||||||
|
await colorButton.click();
|
||||||
|
|
||||||
|
const pickedColorButton = colorPicker.locator(
|
||||||
|
'edgeless-color-button[active]'
|
||||||
|
);
|
||||||
|
|
||||||
|
let pickedColor = await pickedColorButton.locator('svg').getAttribute('fill');
|
||||||
|
let textColor = await getEdgelessTextColor(text);
|
||||||
|
|
||||||
|
await expect(pickedColorButton.getByLabel('MediumBlue')).toHaveCount(1);
|
||||||
|
expect(pickedColor).toBe(textColor);
|
||||||
|
|
||||||
|
const blackColorButton = colorPicker
|
||||||
|
.locator('edgeless-color-button')
|
||||||
|
.filter({
|
||||||
|
has: page.locator('.color-unit'),
|
||||||
|
})
|
||||||
|
.filter({
|
||||||
|
has: page.getByLabel('Black'),
|
||||||
|
});
|
||||||
|
await blackColorButton.click();
|
||||||
|
|
||||||
|
pickedColor = await blackColorButton.locator('svg').getAttribute('fill');
|
||||||
|
textColor = await getEdgelessTextColor(text);
|
||||||
|
|
||||||
|
expect(pickedColor).toBe(textColor);
|
||||||
|
expect(pickedColor).toBe('#000000');
|
||||||
|
|
||||||
|
await page.getByTestId('header-info-button').click();
|
||||||
|
|
||||||
|
await page
|
||||||
|
.locator('[data-info-id="edgelessTheme"]')
|
||||||
|
.locator('[data-property-value="true"]')
|
||||||
|
.locator('button[value="dark"]')
|
||||||
|
.click();
|
||||||
|
|
||||||
|
await page.keyboard.press('Escape');
|
||||||
|
|
||||||
|
await expect(page.getByTestId('property-collapsible-section')).toBeHidden();
|
||||||
|
|
||||||
|
await colorButton.click();
|
||||||
|
|
||||||
|
pickedColor = await blackColorButton.locator('svg').getAttribute('fill');
|
||||||
|
textColor = await getEdgelessTextColor(text);
|
||||||
|
|
||||||
|
expect(pickedColor).toBe(textColor);
|
||||||
|
expect(pickedColor).toBe('#ffffff');
|
||||||
|
});
|
||||||
Reference in New Issue
Block a user