mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-20 11:36:25 +08:00
8006812bc0
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * In-tree icon picker for Callout blocks (emoji, app icons, images) with popup UI and editor-wide extension/service. * Callout toolbar adds background color presets, an icon-picker action, and a destructive Delete action. * **Refactor** * Replaced legacy emoji workflow with icon-based rendering, updated state, styling, and lifecycle for callouts. * **Tests** * Updated callout E2E to reflect new default icon and picker behavior. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: L-Sun <zover.v@gmail.com>
53 lines
1.4 KiB
TypeScript
53 lines
1.4 KiB
TypeScript
import type { IconData } from '@blocksuite/affine-shared/services';
|
|
import type { UniComponent } from '@blocksuite/affine-shared/types';
|
|
import { ShadowlessElement } from '@blocksuite/std';
|
|
import { type Signal } from '@preact/signals-core';
|
|
import { html, type TemplateResult } from 'lit';
|
|
import { type StyleInfo, styleMap } from 'lit/directives/style-map.js';
|
|
|
|
// Copy of renderUniLit from callout-block.ts
|
|
const renderUniLit = <Props, Expose extends NonNullable<unknown>>(
|
|
uni: UniComponent<Props, Expose> | undefined,
|
|
props?: Props,
|
|
options?: {
|
|
ref?: Signal<Expose | undefined>;
|
|
style?: Readonly<StyleInfo>;
|
|
class?: string;
|
|
}
|
|
): TemplateResult => {
|
|
return html` <uni-lit
|
|
.uni="${uni}"
|
|
.props="${props}"
|
|
.ref="${options?.ref}"
|
|
style=${options?.style ? styleMap(options?.style) : ''}
|
|
></uni-lit>`;
|
|
};
|
|
|
|
export interface IconPickerWrapperProps {
|
|
onSelect?: (iconData?: IconData) => void;
|
|
onClose?: () => void;
|
|
}
|
|
|
|
export class IconPickerWrapper extends ShadowlessElement {
|
|
iconPickerComponent?: UniComponent<IconPickerWrapperProps, any>;
|
|
props?: IconPickerWrapperProps;
|
|
|
|
constructor() {
|
|
super();
|
|
}
|
|
|
|
override render() {
|
|
if (!this.iconPickerComponent) {
|
|
return html``;
|
|
}
|
|
|
|
return renderUniLit(this.iconPickerComponent, this.props);
|
|
}
|
|
}
|
|
|
|
declare global {
|
|
interface HTMLElementTagNameMap {
|
|
'icon-picker-wrapper': IconPickerWrapper;
|
|
}
|
|
}
|