feat(core): replace emoji-mart with affine icon picker (#13644)

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

- New Features
  - Unified icon picker with consistent rendering across the app.
  - Picker can auto-close after selection.
  - “Remove” now clears the icon selection.

- Refactor
- Icon handling consolidated across editors, navigation, and document
titles for consistent behavior.
  - Picker now opens on the Emoji panel by default.

- Style
  - Adjusted line-height and selectors for icon picker visuals.

- Chores
  - Removed unused emoji-mart dependencies.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
Cats Juice
2025-09-26 14:41:29 +08:00
committed by GitHub
parent c540400496
commit d272c4342d
16 changed files with 121 additions and 138 deletions
@@ -1,18 +1,29 @@
import type { ReactNode } from 'react';
import { AffineIconRenderer } from './renderer/affine-icon';
import { type IconData, IconType } from './type';
export const IconRenderer = ({
iconType,
icon,
data,
fallback,
}: {
iconType: 'emoji' | 'affine-icon';
icon: string;
data?: IconData;
fallback?: ReactNode;
}) => {
if (iconType === 'emoji') {
return icon;
}
if (iconType === 'affine-icon') {
return <AffineIconRenderer name={icon} />;
if (!data) {
return fallback ?? null;
}
return null;
if (data.type === IconType.Emoji && data.unicode) {
return data.unicode;
}
if (data.type === IconType.AffineIcon && data.name) {
return <AffineIconRenderer name={data.name} color={data.color} />;
}
if (data.type === IconType.Blob) {
// Not supported yet
return null;
}
return fallback ?? null;
};