Skip to content

Commit 3e5c00f

Browse files
authored
feat(blazorui): add BitRichTextEditor extra component #10304 (#10356)
1 parent 7c61ca0 commit 3e5c00f

File tree

83 files changed

+2237
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

83 files changed

+2237
-0
lines changed

Diff for: .gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ _book
242242
/src/BlazorUI/Bit.BlazorUI.Extras/Scripts/*.js
243243
/src/BlazorUI/Bit.BlazorUI.Extras/wwwroot/scripts/*.js
244244
/src/BlazorUI/Bit.BlazorUI.Extras/wwwroot/**/*.css.gz
245+
!/src/BlazorUI/Bit.BlazorUI.Extras/wwwroot/quilljs/*.css
245246

246247
/src/BlazorUI/Bit.BlazorUI.Assets/**/*.css
247248
/src/BlazorUI/Bit.BlazorUI.Assets/wwwroot/scripts/*.js
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
/**
2+
* Minimal `EventEmitter` interface that is molded against the Node.js
3+
* `EventEmitter` interface.
4+
*/
5+
declare class EventEmitter3<
6+
EventTypes extends ValidEventTypes = string | symbol,
7+
Context extends any = any
8+
> {
9+
static prefixed: string | boolean;
10+
11+
/**
12+
* Return an array listing the events for which the emitter has registered
13+
* listeners.
14+
*/
15+
eventNames(): Array<EventNames<EventTypes>>;
16+
17+
/**
18+
* Return the listeners registered for a given event.
19+
*/
20+
listeners<T extends EventNames<EventTypes>>(
21+
event: T
22+
): Array<EventListener3<EventTypes, T>>;
23+
24+
/**
25+
* Return the number of listeners listening to a given event.
26+
*/
27+
listenerCount(event: EventNames<EventTypes>): number;
28+
29+
/**
30+
* Calls each of the listeners registered for a given event.
31+
*/
32+
emit<T extends EventNames<EventTypes>>(
33+
event: T,
34+
...args: EventArgs<EventTypes, T>
35+
): boolean;
36+
37+
/**
38+
* Add a listener for a given event.
39+
*/
40+
on<T extends EventNames<EventTypes>>(
41+
event: T,
42+
fn: EventListener3<EventTypes, T>,
43+
context?: Context
44+
): this;
45+
addListener<T extends EventNames<EventTypes>>(
46+
event: T,
47+
fn: EventListener3<EventTypes, T>,
48+
context?: Context
49+
): this;
50+
51+
/**
52+
* Add a one-time listener for a given event.
53+
*/
54+
once<T extends EventNames<EventTypes>>(
55+
event: T,
56+
fn: EventListener3<EventTypes, T>,
57+
context?: Context
58+
): this;
59+
60+
/**
61+
* Remove the listeners of a given event.
62+
*/
63+
removeListener<T extends EventNames<EventTypes>>(
64+
event: T,
65+
fn?: EventListener3<EventTypes, T>,
66+
context?: Context,
67+
once?: boolean
68+
): this;
69+
off<T extends EventNames<EventTypes>>(
70+
event: T,
71+
fn?: EventListener3<EventTypes, T>,
72+
context?: Context,
73+
once?: boolean
74+
): this;
75+
76+
/**
77+
* Remove all listeners, or those of the specified event.
78+
*/
79+
removeAllListeners(event?: EventNames<EventTypes>): this;
80+
}
81+
82+
declare interface ListenerFn<Args extends any[] = any[]> {
83+
(...args: Args): void;
84+
}
85+
86+
declare interface EventEmitterStatic {
87+
new <
88+
EventTypes extends ValidEventTypes = string | symbol,
89+
Context = any
90+
>(): EventEmitter3<EventTypes, Context>;
91+
}
92+
93+
/**
94+
* `object` should be in either of the following forms:
95+
* ```
96+
* interface EventTypes {
97+
* 'event-with-parameters': any[]
98+
* 'event-with-example-handler': (...args: any[]) => void
99+
* }
100+
* ```
101+
*/
102+
declare type ValidEventTypes = string | symbol | object;
103+
104+
declare type EventNames<T extends ValidEventTypes> = T extends string | symbol
105+
? T
106+
: keyof T;
107+
108+
declare type ArgumentMap<T extends object> = {
109+
[K in keyof T]: T[K] extends (...args: any[]) => void
110+
? Parameters<T[K]>
111+
: T[K] extends any[]
112+
? T[K]
113+
: any[];
114+
};
115+
116+
declare type EventListener3<
117+
T extends ValidEventTypes,
118+
K extends EventNames<T>
119+
> = T extends string | symbol
120+
? (...args: any[]) => void
121+
: (
122+
...args: ArgumentMap<Exclude<T, string | symbol>>[Extract<K, keyof T>]
123+
) => void;
124+
125+
declare type EventArgs<
126+
T extends ValidEventTypes,
127+
K extends EventNames<T>
128+
> = Parameters<EventListener3<T, K>>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
declare class Block extends BlockBlot {
2+
cache: {
3+
delta?: Delta | null;
4+
length?: number;
5+
};
6+
delta(): Delta;
7+
deleteAt(index: number, length: number): void;
8+
formatAt(index: number, length: number, name: string, value: unknown): void;
9+
insertAt(index: number, value: string, def?: unknown): void;
10+
insertBefore(blot: Blot, ref?: Blot | null): void;
11+
length(): number;
12+
moveChildren(target: Parent, ref?: Blot | null): void;
13+
optimize(context: {
14+
[key: string]: any;
15+
}): void;
16+
path(index: number): [Blot, number][];
17+
removeChild(child: Blot): void;
18+
split(index: number, force?: boolean | undefined): Blot | null;
19+
}
20+
21+
declare class BlockEmbed extends EmbedBlot {
22+
attributes: AttributorStore;
23+
domNode: HTMLElement;
24+
attach(): void;
25+
delta(): Delta;
26+
format(name: string, value: unknown): void;
27+
formatAt(index: number, length: number, name: string, value: unknown): void;
28+
insertAt(index: number, value: string, def?: unknown): void;
29+
}
30+
31+
declare function blockDelta(blot: BlockBlot, filter?: boolean): Delta;
32+
declare function bubbleFormats(blot: Blot | null, formats?: Record<string, unknown>, filter?: boolean): Record<string, unknown>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
declare class Break extends EmbedBlot {
2+
static value(): undefined;
3+
optimize(): void;
4+
length(): number;
5+
value(): string;
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
declare class Container extends ContainerBlot {
2+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
declare class Cursor extends EmbedBlot {
2+
static blotName: string;
3+
static className: string;
4+
static tagName: string;
5+
static CONTENTS: string;
6+
static value(): undefined;
7+
selection: Selection;
8+
textNode: QuillText;
9+
savedLength: number;
10+
constructor(scroll: ScrollBlot, domNode: HTMLElement, selection: Selection);
11+
detach(): void;
12+
format(name: string, value: unknown): void;
13+
index(node: Node, offset: number): number;
14+
length(): number;
15+
position(): [Text, number];
16+
remove(): void;
17+
restore(): EmbedContextRange | null;
18+
update(mutations: MutationRecord[], context: Record<string, unknown>): void;
19+
optimize(context?: unknown): void;
20+
value(): string;
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
interface EmbedContextRange {
2+
startNode: Node | Text;
3+
startOffset: number;
4+
endNode?: Node | Text;
5+
endOffset?: number;
6+
}
7+
8+
declare class Embed extends EmbedBlot {
9+
contentNode: HTMLSpanElement;
10+
leftGuard: Text;
11+
rightGuard: Text;
12+
constructor(scroll: ScrollBlot, node: Node);
13+
index(node: Node, offset: number): number;
14+
restore(node: Text): EmbedContextRange | null;
15+
update(mutations: MutationRecord[], context: Record<string, unknown>): void;
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
declare class Inline extends InlineBlot {
2+
static allowedChildren: BlotConstructor[];
3+
static order: string[];
4+
static compare(self: string, other: string): number;
5+
formatAt(index: number, length: number, name: string, value: unknown): void;
6+
optimize(context: {
7+
[key: string]: any;
8+
}): void;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
declare class Scroll extends ScrollBlot {
2+
static blotName: string;
3+
static className: string;
4+
static tagName: string;
5+
static defaultChild: typeof Block;
6+
static allowedChildren: (typeof Block | typeof BlockEmbed | typeof Container)[];
7+
emitter: Emitter;
8+
batch: false | MutationRecord[];
9+
constructor(registry: Registry, domNode: HTMLDivElement, { emitter }: {
10+
emitter: Emitter;
11+
});
12+
batchStart(): void;
13+
batchEnd(): void;
14+
emitMount(blot: Blot): void;
15+
emitUnmount(blot: Blot): void;
16+
emitEmbedUpdate(blot: Blot, change: unknown): void;
17+
deleteAt(index: number, length: number): void;
18+
enable(enabled?: boolean): void;
19+
formatAt(index: number, length: number, format: string, value: unknown): void;
20+
insertAt(index: number, value: string, def?: unknown): void;
21+
insertBefore(blot: Blot, ref?: Blot | null): void;
22+
insertContents(index: number, delta: Delta): void;
23+
isEnabled(): boolean;
24+
leaf(index: number): [LeafBlot | null, number];
25+
line(index: number): [Block | BlockEmbed | null, number];
26+
lines(index?: number, length?: number): (Block | BlockEmbed)[];
27+
optimize(context?: {
28+
[key: string]: any;
29+
}): void;
30+
optimize(mutations?: MutationRecord[], context?: {
31+
[key: string]: any;
32+
}): void;
33+
path(index: number): [Blot, number][];
34+
remove(): void;
35+
update(source?: EmitterSource): void;
36+
update(mutations?: MutationRecord[]): void;
37+
updateEmbedAt(index: number, key: string, change: unknown): void;
38+
protected handleDragStart(event: DragEvent): void;
39+
private deltaToRenderBlocks;
40+
private createBlock;
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
declare class QuillText extends TextBlot {
2+
}
3+
declare function escapeText(text: string): string;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
declare class Composition {
2+
private scroll;
3+
private emitter;
4+
isComposing: boolean;
5+
constructor(scroll: Scroll, emitter: Emitter);
6+
private setupListeners;
7+
private handleCompositionStart;
8+
private handleCompositionEnd;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
declare type AttributeMap = {
2+
[key: string]: unknown;
3+
}
4+
5+
declare namespace AttributeMap {
6+
function compose(a?: AttributeMap, b?: AttributeMap, keepNull?: boolean): AttributeMap | undefined;
7+
function diff(a?: AttributeMap, b?: AttributeMap): AttributeMap | undefined;
8+
function invert(attr?: AttributeMap, base?: AttributeMap): AttributeMap;
9+
function transform(a: AttributeMap | undefined, b: AttributeMap | undefined, priority?: boolean): AttributeMap | undefined;
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
declare type EmbedHandler<T> = {
2+
compose(a: T, b: T, keepNull: boolean): T;
3+
invert(a: T, b: T): T;
4+
transform(a: T, b: T, priority: boolean): T;
5+
}
6+
7+
declare class Delta {
8+
static Op: typeof Op;
9+
static OpIterator: typeof OpIterator;
10+
static AttributeMap: typeof AttributeMap;
11+
private static handlers;
12+
static registerEmbed<T>(embedType: string, handler: EmbedHandler<T>): void;
13+
static unregisterEmbed(embedType: string): void;
14+
private static getHandler;
15+
ops: Op[];
16+
constructor(ops?: Op[] | {
17+
ops: Op[];
18+
});
19+
insert(arg: string | Record<string, unknown>, attributes?: AttributeMap | null): this;
20+
delete(length: number): this;
21+
retain(length: number | Record<string, unknown>, attributes?: AttributeMap | null): this;
22+
push(newOp: Op): this;
23+
chop(): this;
24+
filter(predicate: (op: Op, index: number) => boolean): Op[];
25+
forEach(predicate: (op: Op, index: number) => void): void;
26+
map<T>(predicate: (op: Op, index: number) => T): T[];
27+
partition(predicate: (op: Op) => boolean): [Op[], Op[]];
28+
reduce<T>(predicate: (accum: T, curr: Op, index: number) => T, initialValue: T): T;
29+
changeLength(): number;
30+
length(): number;
31+
slice(start?: number, end?: number): Delta;
32+
compose(other: Delta): Delta;
33+
concat(other: Delta): Delta;
34+
diff(other: Delta, cursor?: number | any): Delta;
35+
eachLine(predicate: (line: Delta, attributes: AttributeMap, index: number) => boolean | void, newline?: string): void;
36+
invert(base: Delta): Delta;
37+
transform(index: number, priority?: boolean): number;
38+
transform(other: Delta, priority?: boolean): Delta;
39+
transformPosition(index: number, priority?: boolean): number;
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
declare type Op = {
2+
insert?: string | Record<string, unknown>;
3+
delete?: number;
4+
retain?: number | Record<string, unknown>;
5+
attributes?: AttributeMap;
6+
}
7+
declare namespace Op {
8+
function length(op: Op): number;
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
declare class OpIterator {
2+
ops: Op[];
3+
index: number;
4+
offset: number;
5+
constructor(ops: Op[]);
6+
hasNext(): boolean;
7+
next(length?: number): Op;
8+
peek(): Op;
9+
peekLength(): number;
10+
peekType(): string;
11+
rest(): Op[];
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
declare type SelectionInfo = {
2+
newRange: Range;
3+
oldRange: Range;
4+
};
5+
6+
declare class Editor {
7+
scroll: Scroll;
8+
delta: Delta;
9+
constructor(scroll: Scroll);
10+
applyDelta(delta: Delta): Delta;
11+
deleteText(index: number, length: number): Delta;
12+
formatLine(index: number, length: number, formats?: Record<string, unknown>): Delta;
13+
formatText(index: number, length: number, formats?: Record<string, unknown>): Delta;
14+
getContents(index: number, length: number): Delta;
15+
getDelta(): Delta;
16+
getFormat(index: number, length?: number): Record<string, unknown>;
17+
getHTML(index: number, length: number): string;
18+
getText(index: number, length: number): string;
19+
insertContents(index: number, contents: Delta): Delta;
20+
insertEmbed(index: number, embed: string, value: unknown): Delta;
21+
insertText(index: number, text: string, formats?: Record<string, unknown>): Delta;
22+
isBlank(): boolean;
23+
removeFormat(index: number, length: number): Delta;
24+
update(change: Delta | null, mutations?: MutationRecord[], selectionInfo?: SelectionInfo | undefined): Delta;
25+
}

0 commit comments

Comments
 (0)