chore(editor): change edgeless-text default color to black (#12361)

Closes: [BS-3506](https://linear.app/affine-design/issue/BS-3506/edgeless-text-默认改为黑色)

### Dark
<img width="691" alt="Screenshot 2025-05-19 at 19 32 52" src="https://github.com/user-attachments/assets/2927d13b-0300-4293-8f8f-7891fd87a680" />

### Light
<img width="639" alt="Screenshot 2025-05-19 at 19 33 05" src="https://github.com/user-attachments/assets/4429f6f9-b374-4b17-87f4-ae09204f1538" />

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->

## Summary by CodeRabbit

- **New Features**
  - Improved edgeless text block styling to support theme-based color, font, and alignment settings.

- **Style**
  - Updated the default text color in edgeless text blocks to black, with support for separate dark and light mode colors.

- **Bug Fixes**
  - Ensured the color picker and block rendering reflect the updated default color.

- **Tests**
  - Adjusted tests and snapshots to expect the new default color and theme-based color structure.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
fundon
2025-05-19 16:51:02 +00:00
parent cae7db07ee
commit 4d6a3731a3
13 changed files with 56 additions and 14 deletions

View File

@@ -26,6 +26,7 @@ import {
GfxViewInteractionExtension, GfxViewInteractionExtension,
type SelectedContext, type SelectedContext,
} from '@blocksuite/std/gfx'; } from '@blocksuite/std/gfx';
import { computed } from '@preact/signals-core';
import { css, html } from 'lit'; import { css, html } from 'lit';
import { query, state } from 'lit/decorators.js'; import { query, state } from 'lit/decorators.js';
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js'; import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
@@ -82,6 +83,23 @@ export class EdgelessTextBlockComponent extends GfxBlockComponent<EdgelessTextBl
}); });
} }
private readonly _style$ = computed(() => {
const {
color$: { value: color },
fontFamily$: { value: fontFamily },
fontStyle$: { value: fontStyle },
fontWeight$: { value: fontWeight },
textAlign$: { value: textAlign },
} = this.model.props;
return {
color,
fontFamily,
fontStyle,
fontWeight,
textAlign,
};
});
checkWidthOverflow(width: number) { checkWidthOverflow(width: number) {
let wValid = true; let wValid = true;
@@ -365,7 +383,7 @@ export class EdgelessTextBlockComponent extends GfxBlockComponent<EdgelessTextBl
override renderPageContent() { override renderPageContent() {
const { color, fontFamily, fontStyle, fontWeight, textAlign } = const { color, fontFamily, fontStyle, fontWeight, textAlign } =
this.model.props; this._style$.value;
const themeProvider = this.std.get(ThemeProvider); const themeProvider = this.std.get(ThemeProvider);
const textColor = themeProvider.generateColorProperty( const textColor = themeProvider.generateColorProperty(
color, color,

View File

@@ -6,7 +6,7 @@ import {
type IModelCoord, type IModelCoord,
TextUtils, TextUtils,
} from '@blocksuite/affine-block-surface'; } from '@blocksuite/affine-block-surface';
import { TextElementModel } from '@blocksuite/affine-model'; import { DefaultTheme, TextElementModel } from '@blocksuite/affine-model';
import type { RichText } from '@blocksuite/affine-rich-text'; import type { RichText } from '@blocksuite/affine-rich-text';
import { ThemeProvider } from '@blocksuite/affine-shared/services'; import { ThemeProvider } from '@blocksuite/affine-shared/services';
import { getSelectedRect } from '@blocksuite/affine-shared/utils'; import { getSelectedRect } from '@blocksuite/affine-shared/utils';
@@ -432,7 +432,7 @@ export class EdgelessTextEditor extends WithDisposable(ShadowlessElement) {
const isEmpty = !text.length && !this._isComposition; const isEmpty = !text.length && !this._isComposition;
const color = this.std const color = this.std
.get(ThemeProvider) .get(ThemeProvider)
.generateColorProperty(this.element.color, '#000000'); .generateColorProperty(this.element.color, DefaultTheme.textColor);
return html`<div return html`<div
style=${styleMap({ style=${styleMap({

View File

@@ -115,7 +115,7 @@ export const DefaultTheme: Theme = {
black: Black, black: Black,
white: White, white: White,
transparent: Transparent, transparent: Transparent,
textColor: Medium.Blue, textColor: Black,
shapeTextColor: pureBlack, shapeTextColor: pureBlack,
shapeStrokeColor: Medium.Yellow, shapeStrokeColor: Medium.Yellow,
shapeFillColor: Medium.Yellow, shapeFillColor: Medium.Yellow,

View File

@@ -232,7 +232,7 @@ describe('apply last props', () => {
throw new Error('id is not found'); throw new Error('id is not found');
} }
const text = service.crud.getElementById(id) as EdgelessTextBlockModel; const text = service.crud.getElementById(id) as EdgelessTextBlockModel;
expect(text.props.color).toBe(DefaultTheme.textColor); expect(text.props.color).toStrictEqual(DefaultTheme.textColor);
expect(text.props.fontFamily).toBe(FontFamily.Inter); expect(text.props.fontFamily).toBe(FontFamily.Inter);
service.crud.updateElement(id, { service.crud.updateElement(id, {
color: DefaultTheme.StrokeColorShortMap.Green, color: DefaultTheme.StrokeColorShortMap.Green,

View File

@@ -61,7 +61,7 @@ test('should update color of edgeless text when switching theme', async ({
let pickedColor = await pickedColorButton.locator('svg').getAttribute('fill'); let pickedColor = await pickedColorButton.locator('svg').getAttribute('fill');
let textColor = await getEdgelessTextColor(text); let textColor = await getEdgelessTextColor(text);
await expect(pickedColorButton.getByLabel('MediumBlue')).toHaveCount(1); await expect(pickedColorButton.getByLabel('Black')).toHaveCount(1);
expect(pickedColor).toBe(textColor); expect(pickedColor).toBe(textColor);
const blackColorButton = colorPicker const blackColorButton = colorPicker

View File

@@ -34,7 +34,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "4", "id": "4",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -26,7 +26,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "4", "id": "4",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -25,7 +25,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "4", "id": "4",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -26,7 +26,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "4", "id": "4",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -26,7 +26,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "4", "id": "4",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -28,7 +28,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "3", "id": "3",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -28,7 +28,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "3", "id": "3",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",

View File

@@ -28,7 +28,10 @@
"flavour": "affine:edgeless-text", "flavour": "affine:edgeless-text",
"id": "3", "id": "3",
"props": { "props": {
"color": "#84cfff", "color": {
"dark": "#ffffff",
"light": "#000000"
},
"fontFamily": "blocksuite:surface:Inter", "fontFamily": "blocksuite:surface:Inter",
"fontStyle": "normal", "fontStyle": "normal",
"fontWeight": "400", "fontWeight": "400",