@muraai/mnl-chat 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/esm2020/lib/chat.module.mjs +87 -0
- package/esm2020/lib/components/ng-chat/ng-chat.component.mjs +588 -0
- package/esm2020/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.mjs +128 -0
- package/esm2020/lib/components/ng-chat-options/ng-chat-options.component.mjs +29 -0
- package/esm2020/lib/components/ng-chat-window/ng-chat-window.component.mjs +247 -0
- package/esm2020/lib/core/chat-adapter.mjs +18 -0
- package/esm2020/lib/core/chat-controller.mjs +2 -0
- package/esm2020/lib/core/chat-group-adapter.mjs +2 -0
- package/esm2020/lib/core/chat-option.mjs +2 -0
- package/esm2020/lib/core/chat-participant-status-descriptor.mjs +6 -0
- package/esm2020/lib/core/chat-participant-status.enum.mjs +8 -0
- package/esm2020/lib/core/chat-participant-type.enum.mjs +6 -0
- package/esm2020/lib/core/chat-participant.mjs +2 -0
- package/esm2020/lib/core/default-file-upload-adapter.mjs +43 -0
- package/esm2020/lib/core/file-upload-adapter.mjs +2 -0
- package/esm2020/lib/core/group.mjs +14 -0
- package/esm2020/lib/core/guid.mjs +11 -0
- package/esm2020/lib/core/localization.mjs +2 -0
- package/esm2020/lib/core/message-counter.mjs +25 -0
- package/esm2020/lib/core/message-type.enum.mjs +7 -0
- package/esm2020/lib/core/message.mjs +7 -0
- package/esm2020/lib/core/paged-history-chat-adapter.mjs +9 -0
- package/esm2020/lib/core/participant-metadata.mjs +6 -0
- package/esm2020/lib/core/participant-response.mjs +3 -0
- package/esm2020/lib/core/scroll-direction.enum.mjs +6 -0
- package/esm2020/lib/core/theme.enum.mjs +7 -0
- package/esm2020/lib/core/user.mjs +7 -0
- package/esm2020/lib/core/window.mjs +20 -0
- package/esm2020/lib/firstLetter.pipe.mjs +20 -0
- package/esm2020/lib/material.module.mjs +50 -0
- package/esm2020/lib/pipes/emojify.pipe.mjs +41 -0
- package/esm2020/lib/pipes/group-message-display-name.pipe.mjs +24 -0
- package/esm2020/lib/pipes/linkfy.pipe.mjs +34 -0
- package/esm2020/lib/pipes/sanitize.pipe.mjs +21 -0
- package/esm2020/lib/services/chat.service.mjs +14 -0
- package/esm2020/muraai-mnl-chat.mjs +5 -0
- package/esm2020/public-api.mjs +25 -0
- package/fesm2015/muraai-mnl-chat.mjs +1426 -0
- package/fesm2015/muraai-mnl-chat.mjs.map +1 -0
- package/fesm2020/muraai-mnl-chat.mjs +1424 -0
- package/fesm2020/muraai-mnl-chat.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/chat.module.d.ts +24 -0
- package/lib/components/ng-chat/ng-chat.component.d.ts +130 -0
- package/lib/components/ng-chat-friends-list/ng-chat-friends-list.component.d.ts +45 -0
- package/lib/components/ng-chat-options/ng-chat-options.component.d.ts +12 -0
- package/lib/components/ng-chat-window/ng-chat-window.component.d.ts +65 -0
- package/lib/core/chat-adapter.d.ts +15 -0
- package/lib/core/chat-controller.d.ts +6 -0
- package/lib/core/chat-group-adapter.d.ts +4 -0
- package/lib/core/chat-option.d.ts +9 -0
- package/lib/core/chat-participant-status-descriptor.d.ts +3 -0
- package/lib/core/chat-participant-status.enum.d.ts +6 -0
- package/lib/core/chat-participant-type.enum.d.ts +4 -0
- package/lib/core/chat-participant.d.ts +9 -0
- package/lib/core/default-file-upload-adapter.d.ts +14 -0
- package/lib/core/file-upload-adapter.d.ts +5 -0
- package/lib/core/group.d.ts +13 -0
- package/lib/core/guid.d.ts +3 -0
- package/lib/core/localization.d.ts +15 -0
- package/lib/core/message-counter.d.ts +10 -0
- package/lib/core/message-type.enum.d.ts +5 -0
- package/lib/core/message.d.ts +10 -0
- package/lib/core/paged-history-chat-adapter.d.ts +10 -0
- package/lib/core/participant-metadata.d.ts +3 -0
- package/lib/core/participant-response.d.ts +6 -0
- package/lib/core/scroll-direction.enum.d.ts +4 -0
- package/lib/core/theme.enum.d.ts +5 -0
- package/lib/core/user.d.ts +10 -0
- package/lib/core/window.d.ts +13 -0
- package/lib/firstLetter.pipe.d.ts +7 -0
- package/lib/material.module.d.ts +14 -0
- package/lib/pipes/emojify.pipe.d.ts +7 -0
- package/lib/pipes/group-message-display-name.pipe.d.ts +9 -0
- package/lib/pipes/linkfy.pipe.d.ts +7 -0
- package/lib/pipes/sanitize.pipe.d.ts +10 -0
- package/lib/services/chat.service.d.ts +6 -0
- package/package.json +31 -0
- package/public-api.d.ts +21 -0
- package/src/assets/icons.css +140 -0
- package/src/assets/loading-spinner.css +59 -0
- package/src/assets/ng-chat.component.default.css +106 -0
- package/src/assets/notification.png +0 -0
- package/src/assets/notification.wav +0 -0
- package/src/assets/themes/ng-chat.theme.dark.scss +71 -0
- package/src/assets/themes/ng-chat.theme.default.scss +63 -0
- package/src/assets/user.png +0 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { Message } from "./message";
|
|
3
|
+
import { ParticipantResponse } from "./participant-response";
|
|
4
|
+
import { IChatParticipant } from './chat-participant';
|
|
5
|
+
export declare abstract class ChatAdapter {
|
|
6
|
+
abstract listFriends(): Observable<ParticipantResponse[]>;
|
|
7
|
+
abstract getMessageHistory(destinataryId: any): Observable<Message[]>;
|
|
8
|
+
abstract sendMessage(message: Message): void;
|
|
9
|
+
onFriendsListChanged(participantsResponse: ParticipantResponse[]): void;
|
|
10
|
+
onMessageReceived(participant: IChatParticipant, message: Message): void;
|
|
11
|
+
/** @internal */
|
|
12
|
+
friendsListChangedHandler: (participantsResponse: ParticipantResponse[]) => void;
|
|
13
|
+
/** @internal */
|
|
14
|
+
messageReceivedHandler: (participant: IChatParticipant, message: Message) => void;
|
|
15
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Window } from '../core/window';
|
|
2
|
+
import { IChatParticipant } from '../core/chat-participant';
|
|
3
|
+
export interface IChatOption {
|
|
4
|
+
isActive: boolean;
|
|
5
|
+
displayLabel: string;
|
|
6
|
+
chattingTo: Window;
|
|
7
|
+
action?: (chattingTo: Window) => void;
|
|
8
|
+
validateContext: (participant: IChatParticipant) => boolean;
|
|
9
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ChatParticipantStatus } from "./chat-participant-status.enum";
|
|
2
|
+
import { ChatParticipantType } from "./chat-participant-type.enum";
|
|
3
|
+
export interface IChatParticipant {
|
|
4
|
+
readonly participantType: ChatParticipantType;
|
|
5
|
+
readonly id: any;
|
|
6
|
+
readonly status: ChatParticipantStatus;
|
|
7
|
+
readonly avatar: string | null;
|
|
8
|
+
readonly displayName: string;
|
|
9
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { IFileUploadAdapter } from './file-upload-adapter';
|
|
2
|
+
import { HttpClient } from '@angular/common/http';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
import { Message } from './message';
|
|
5
|
+
export declare class DefaultFileUploadAdapter implements IFileUploadAdapter {
|
|
6
|
+
private _serverEndpointUrl;
|
|
7
|
+
private _http;
|
|
8
|
+
/**
|
|
9
|
+
* @summary Basic file upload adapter implementation for HTTP request form file consumption
|
|
10
|
+
* @param _serverEndpointUrl The API endpoint full qualified address that will receive a form file to process and return the metadata.
|
|
11
|
+
*/
|
|
12
|
+
constructor(_serverEndpointUrl: string, _http: HttpClient);
|
|
13
|
+
uploadFile(file: File, participantId: any): Observable<Message>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { User } from "./user";
|
|
2
|
+
import { ChatParticipantStatus } from "./chat-participant-status.enum";
|
|
3
|
+
import { IChatParticipant } from "./chat-participant";
|
|
4
|
+
import { ChatParticipantType } from "./chat-participant-type.enum";
|
|
5
|
+
export declare class Group implements IChatParticipant {
|
|
6
|
+
constructor(participants: User[]);
|
|
7
|
+
id: string;
|
|
8
|
+
chattingTo: User[];
|
|
9
|
+
readonly participantType: ChatParticipantType;
|
|
10
|
+
status: ChatParticipantStatus;
|
|
11
|
+
avatar: string | null;
|
|
12
|
+
displayName: string;
|
|
13
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface Localization {
|
|
2
|
+
title: string;
|
|
3
|
+
messagePlaceholder: string;
|
|
4
|
+
searchPlaceholder: string;
|
|
5
|
+
statusDescription: StatusDescription;
|
|
6
|
+
browserNotificationTitle: string;
|
|
7
|
+
loadMessageHistoryPlaceholder: string;
|
|
8
|
+
}
|
|
9
|
+
export interface StatusDescription {
|
|
10
|
+
online: string;
|
|
11
|
+
busy: string;
|
|
12
|
+
away: string;
|
|
13
|
+
offline: string;
|
|
14
|
+
[key: string]: string;
|
|
15
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Window } from './window';
|
|
2
|
+
export declare class MessageCounter {
|
|
3
|
+
static formatUnreadMessagesTotal(totalUnreadMessages: number): string;
|
|
4
|
+
/**
|
|
5
|
+
* Returns a formatted string containing the total unread messages of a chat window.
|
|
6
|
+
* @param window The window instance to count the unread total messages.
|
|
7
|
+
* @param currentUserId The current chat instance user id. In this context it would be the sender.
|
|
8
|
+
*/
|
|
9
|
+
static unreadMessagesTotal(window: Window, currentUserId: any): string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { Observable } from 'rxjs';
|
|
2
|
+
import { Message } from "./message";
|
|
3
|
+
import { ChatAdapter } from "./chat-adapter";
|
|
4
|
+
/**
|
|
5
|
+
* @description Chat Adapter decorator class that adds pagination to load the history of messagesr.
|
|
6
|
+
* You will need an existing @see ChatAdapter implementation
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class PagedHistoryChatAdapter extends ChatAdapter {
|
|
9
|
+
abstract getMessageHistoryByPage(destinataryId: any, size: number, page: number): Observable<Message[]>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ChatParticipantStatus } from "./chat-participant-status.enum";
|
|
2
|
+
import { IChatParticipant } from "./chat-participant";
|
|
3
|
+
import { ChatParticipantType } from "./chat-participant-type.enum";
|
|
4
|
+
export declare class User implements IChatParticipant {
|
|
5
|
+
readonly participantType: ChatParticipantType;
|
|
6
|
+
id: any;
|
|
7
|
+
displayName: string;
|
|
8
|
+
status: ChatParticipantStatus;
|
|
9
|
+
avatar: string;
|
|
10
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Message } from "./message";
|
|
2
|
+
import { IChatParticipant } from "./chat-participant";
|
|
3
|
+
export declare class Window {
|
|
4
|
+
constructor(participant: IChatParticipant, isLoadingHistory: boolean, isCollapsed: boolean);
|
|
5
|
+
participant: IChatParticipant;
|
|
6
|
+
messages: Message[];
|
|
7
|
+
newMessage?: string;
|
|
8
|
+
isCollapsed?: boolean;
|
|
9
|
+
isLoadingHistory: boolean;
|
|
10
|
+
hasFocus: boolean;
|
|
11
|
+
hasMoreMessages: boolean;
|
|
12
|
+
historyPage: number;
|
|
13
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class FirstLetterPipe implements PipeTransform {
|
|
4
|
+
transform(value: string): string;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FirstLetterPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<FirstLetterPipe, "firstLetterPipe", false>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { FormsModule } from '@angular/forms';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/material/button";
|
|
4
|
+
import * as i2 from "@angular/material/form-field";
|
|
5
|
+
import * as i3 from "@angular/material/icon";
|
|
6
|
+
import * as i4 from "@angular/material/input";
|
|
7
|
+
import * as i5 from "@angular/forms";
|
|
8
|
+
import * as i6 from "@angular/material/menu";
|
|
9
|
+
export declare function modules(): (typeof FormsModule)[];
|
|
10
|
+
export declare class ChatMaterialModule {
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ChatMaterialModule, never>;
|
|
12
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<ChatMaterialModule, never, [typeof i1.MatButtonModule, typeof i2.MatFormFieldModule, typeof i3.MatIconModule, typeof i4.MatInputModule, typeof i5.FormsModule, typeof i5.ReactiveFormsModule, typeof i6.MatMenuModule], [typeof i1.MatButtonModule, typeof i2.MatFormFieldModule, typeof i3.MatIconModule, typeof i4.MatInputModule, typeof i5.FormsModule, typeof i5.ReactiveFormsModule, typeof i6.MatMenuModule]>;
|
|
13
|
+
static ɵinj: i0.ɵɵInjectorDeclaration<ChatMaterialModule>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class EmojifyPipe implements PipeTransform {
|
|
4
|
+
transform(message: string, pipeEnabled: boolean): string;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<EmojifyPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<EmojifyPipe, "emojify", false>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { IChatParticipant } from "../core/chat-participant";
|
|
3
|
+
import { Message } from "../core/message";
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
export declare class GroupMessageDisplayNamePipe implements PipeTransform {
|
|
6
|
+
transform(participant: IChatParticipant, message: Message): string;
|
|
7
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<GroupMessageDisplayNamePipe, never>;
|
|
8
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<GroupMessageDisplayNamePipe, "groupMessageDisplayName", false>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
export declare class LinkfyPipe implements PipeTransform {
|
|
4
|
+
transform(message: string, pipeEnabled: boolean): string;
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<LinkfyPipe, never>;
|
|
6
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<LinkfyPipe, "linkfy", false>;
|
|
7
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { PipeTransform } from '@angular/core';
|
|
2
|
+
import { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class SanitizePipe implements PipeTransform {
|
|
5
|
+
protected sanitizer: DomSanitizer;
|
|
6
|
+
constructor(sanitizer: DomSanitizer);
|
|
7
|
+
transform(url: string): SafeResourceUrl;
|
|
8
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SanitizePipe, never>;
|
|
9
|
+
static ɵpipe: i0.ɵɵPipeDeclaration<SanitizePipe, "sanitize", false>;
|
|
10
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@muraai/mnl-chat",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^14.2.0",
|
|
6
|
+
"@angular/core": "^14.2.0"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"module": "fesm2015/muraai-mnl-chat.mjs",
|
|
12
|
+
"es2020": "fesm2020/muraai-mnl-chat.mjs",
|
|
13
|
+
"esm2020": "esm2020/muraai-mnl-chat.mjs",
|
|
14
|
+
"fesm2020": "fesm2020/muraai-mnl-chat.mjs",
|
|
15
|
+
"fesm2015": "fesm2015/muraai-mnl-chat.mjs",
|
|
16
|
+
"typings": "index.d.ts",
|
|
17
|
+
"exports": {
|
|
18
|
+
"./package.json": {
|
|
19
|
+
"default": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
".": {
|
|
22
|
+
"types": "./index.d.ts",
|
|
23
|
+
"esm2020": "./esm2020/muraai-mnl-chat.mjs",
|
|
24
|
+
"es2020": "./fesm2020/muraai-mnl-chat.mjs",
|
|
25
|
+
"es2015": "./fesm2015/muraai-mnl-chat.mjs",
|
|
26
|
+
"node": "./fesm2015/muraai-mnl-chat.mjs",
|
|
27
|
+
"default": "./fesm2020/muraai-mnl-chat.mjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"sideEffects": false
|
|
31
|
+
}
|
package/public-api.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export * from './lib/chat.module';
|
|
2
|
+
export * from './lib/services/chat.service';
|
|
3
|
+
export * from './lib/components/ng-chat/ng-chat.component';
|
|
4
|
+
export * from './lib/core/chat-adapter';
|
|
5
|
+
export * from './lib/core/message';
|
|
6
|
+
export * from './lib/core/chat-participant-status.enum';
|
|
7
|
+
export * from './lib/core/user';
|
|
8
|
+
export * from './lib/core/participant-response';
|
|
9
|
+
export * from './lib/core/participant-metadata';
|
|
10
|
+
export * from './lib/core/window';
|
|
11
|
+
export * from './lib/core/localization';
|
|
12
|
+
export * from './lib/core/chat-controller';
|
|
13
|
+
export * from './lib/core/paged-history-chat-adapter';
|
|
14
|
+
export * from './lib/core/theme.enum';
|
|
15
|
+
export * from './lib/core/chat-option';
|
|
16
|
+
export * from './lib/core/group';
|
|
17
|
+
export * from './lib/core/chat-participant';
|
|
18
|
+
export * from './lib/core/chat-group-adapter';
|
|
19
|
+
export * from './lib/core/chat-participant-type.enum';
|
|
20
|
+
export * from './lib/core/message-type.enum';
|
|
21
|
+
export * from './lib/core/file-upload-adapter';
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
.user-icon
|
|
2
|
+
{
|
|
3
|
+
box-sizing: border-box;
|
|
4
|
+
background-color: #FFF;
|
|
5
|
+
border: 2px solid;
|
|
6
|
+
width: 32px;
|
|
7
|
+
height: 20px;
|
|
8
|
+
border-radius: 64px 64px 0 0/64px;
|
|
9
|
+
margin-top: 14px;
|
|
10
|
+
margin-left: -1px;
|
|
11
|
+
display: inline-block;
|
|
12
|
+
vertical-align: middle;
|
|
13
|
+
position: relative;
|
|
14
|
+
font-style: normal;
|
|
15
|
+
color: #ddd;
|
|
16
|
+
text-align: left;
|
|
17
|
+
text-indent: -9999px;
|
|
18
|
+
}
|
|
19
|
+
.user-icon:before{
|
|
20
|
+
border: 2px solid;
|
|
21
|
+
background-color: #FFF;
|
|
22
|
+
width: 12px;
|
|
23
|
+
height: 12px;
|
|
24
|
+
top: -19px;
|
|
25
|
+
border-radius: 50%;
|
|
26
|
+
position: absolute;
|
|
27
|
+
left: 50%;
|
|
28
|
+
-webkit-transform: translateX(-50%);
|
|
29
|
+
-ms-transform: translateX(-50%);
|
|
30
|
+
transform: translateX(-50%);
|
|
31
|
+
}
|
|
32
|
+
.user-icon:before, .user-icon:after
|
|
33
|
+
{
|
|
34
|
+
content: '';
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
}
|
|
37
|
+
.upload-icon {
|
|
38
|
+
position: absolute;
|
|
39
|
+
margin-left: 3px;
|
|
40
|
+
margin-top: 12px;
|
|
41
|
+
width: 13px;
|
|
42
|
+
height: 4px;
|
|
43
|
+
border: solid 1px currentColor;
|
|
44
|
+
border-top: none;
|
|
45
|
+
border-radius: 1px;
|
|
46
|
+
}
|
|
47
|
+
.upload-icon:before {
|
|
48
|
+
content: '';
|
|
49
|
+
position: absolute;
|
|
50
|
+
top: -8px;
|
|
51
|
+
left: 6px;
|
|
52
|
+
width: 1px;
|
|
53
|
+
height: 9px;
|
|
54
|
+
background-color: currentColor;
|
|
55
|
+
}
|
|
56
|
+
.upload-icon:after {
|
|
57
|
+
content: '';
|
|
58
|
+
position: absolute;
|
|
59
|
+
top: -8px;
|
|
60
|
+
left: 4px;
|
|
61
|
+
width: 4px;
|
|
62
|
+
height: 4px;
|
|
63
|
+
border-top: solid 1px currentColor;
|
|
64
|
+
border-right: solid 1px currentColor;
|
|
65
|
+
-webkit-transform: rotate(-45deg);
|
|
66
|
+
transform: rotate(-45deg);
|
|
67
|
+
}
|
|
68
|
+
.paperclip-icon {
|
|
69
|
+
position: absolute;
|
|
70
|
+
margin-left: 9px;
|
|
71
|
+
margin-top: 2px;
|
|
72
|
+
width: 6px;
|
|
73
|
+
height: 12px;
|
|
74
|
+
border-radius: 4px 4px 0 0;
|
|
75
|
+
border-left: solid 1px currentColor;
|
|
76
|
+
border-right: solid 1px currentColor;
|
|
77
|
+
border-top: solid 1px currentColor;
|
|
78
|
+
-webkit-transform: rotate(45deg);
|
|
79
|
+
transform: rotate(45deg);
|
|
80
|
+
}
|
|
81
|
+
.paperclip-icon:before {
|
|
82
|
+
content: '';
|
|
83
|
+
position: absolute;
|
|
84
|
+
top: 11px;
|
|
85
|
+
left: -1px;
|
|
86
|
+
width: 4px;
|
|
87
|
+
height: 6px;
|
|
88
|
+
border-radius: 0 0 3px 3px;
|
|
89
|
+
border-left: solid 1px currentColor;
|
|
90
|
+
border-right: solid 1px currentColor;
|
|
91
|
+
border-bottom: solid 1px currentColor;
|
|
92
|
+
}
|
|
93
|
+
.paperclip-icon:after {
|
|
94
|
+
content: '';
|
|
95
|
+
position: absolute;
|
|
96
|
+
left: 1px;
|
|
97
|
+
top: 1px;
|
|
98
|
+
width: 2px;
|
|
99
|
+
height: 10px;
|
|
100
|
+
border-radius: 4px 4px 0 0;
|
|
101
|
+
border-left: solid 1px currentColor;
|
|
102
|
+
border-right: solid 1px currentColor;
|
|
103
|
+
border-top: solid 1px currentColor;
|
|
104
|
+
}
|
|
105
|
+
.check-icon {
|
|
106
|
+
color: #000;
|
|
107
|
+
position: absolute;
|
|
108
|
+
margin-left: 3px;
|
|
109
|
+
margin-top: 4px;
|
|
110
|
+
width: 14px;
|
|
111
|
+
height: 8px;
|
|
112
|
+
border-bottom: solid 1px currentColor;
|
|
113
|
+
border-left: solid 1px currentColor;
|
|
114
|
+
-webkit-transform: rotate(-45deg);
|
|
115
|
+
transform: rotate(-45deg);
|
|
116
|
+
}
|
|
117
|
+
.remove-icon {
|
|
118
|
+
color: #000;
|
|
119
|
+
position: absolute;
|
|
120
|
+
margin-left: 3px;
|
|
121
|
+
margin-top: 10px;
|
|
122
|
+
}
|
|
123
|
+
.remove-icon:before {
|
|
124
|
+
content: '';
|
|
125
|
+
position: absolute;
|
|
126
|
+
width: 15px;
|
|
127
|
+
height: 1px;
|
|
128
|
+
background-color: currentColor;
|
|
129
|
+
-webkit-transform: rotate(45deg);
|
|
130
|
+
transform: rotate(45deg);
|
|
131
|
+
}
|
|
132
|
+
.remove-icon:after {
|
|
133
|
+
content: '';
|
|
134
|
+
position: absolute;
|
|
135
|
+
width: 15px;
|
|
136
|
+
height: 1px;
|
|
137
|
+
background-color: currentColor;
|
|
138
|
+
-webkit-transform: rotate(-45deg);
|
|
139
|
+
transform: rotate(-45deg);
|
|
140
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
.loader,
|
|
2
|
+
.loader:before,
|
|
3
|
+
.loader:after {
|
|
4
|
+
background: #E3E3E3;
|
|
5
|
+
-webkit-animation: load1 1s infinite ease-in-out;
|
|
6
|
+
animation: load1 1s infinite ease-in-out;
|
|
7
|
+
width: 1em;
|
|
8
|
+
height: 4em;
|
|
9
|
+
}
|
|
10
|
+
.loader {
|
|
11
|
+
color: #E3E3E3;
|
|
12
|
+
text-indent: -9999em;
|
|
13
|
+
margin: 4px auto 0;
|
|
14
|
+
position: relative;
|
|
15
|
+
font-size: 4px;
|
|
16
|
+
-webkit-transform: translateZ(0);
|
|
17
|
+
-ms-transform: translateZ(0);
|
|
18
|
+
transform: translateZ(0);
|
|
19
|
+
-webkit-animation-delay: -0.16s;
|
|
20
|
+
animation-delay: -0.16s;
|
|
21
|
+
}
|
|
22
|
+
.loader:before,
|
|
23
|
+
.loader:after {
|
|
24
|
+
position: absolute;
|
|
25
|
+
top: 0;
|
|
26
|
+
content: '';
|
|
27
|
+
}
|
|
28
|
+
.loader:before {
|
|
29
|
+
left: -1.5em;
|
|
30
|
+
-webkit-animation-delay: -0.32s;
|
|
31
|
+
animation-delay: -0.32s;
|
|
32
|
+
}
|
|
33
|
+
.loader:after {
|
|
34
|
+
left: 1.5em;
|
|
35
|
+
}
|
|
36
|
+
@-webkit-keyframes load1 {
|
|
37
|
+
0%,
|
|
38
|
+
80%,
|
|
39
|
+
100% {
|
|
40
|
+
box-shadow: 0 0;
|
|
41
|
+
height: 4em;
|
|
42
|
+
}
|
|
43
|
+
40% {
|
|
44
|
+
box-shadow: 0 -2em;
|
|
45
|
+
height: 5em;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
@keyframes load1 {
|
|
49
|
+
0%,
|
|
50
|
+
80%,
|
|
51
|
+
100% {
|
|
52
|
+
box-shadow: 0 0;
|
|
53
|
+
height: 4em;
|
|
54
|
+
}
|
|
55
|
+
40% {
|
|
56
|
+
box-shadow: 0 -2em;
|
|
57
|
+
height: 5em;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
#ng-chat
|
|
2
|
+
{
|
|
3
|
+
position:fixed;
|
|
4
|
+
z-index:999;
|
|
5
|
+
right:0;
|
|
6
|
+
bottom:0;
|
|
7
|
+
box-sizing: initial;
|
|
8
|
+
font-size: 11pt;
|
|
9
|
+
text-align: left;
|
|
10
|
+
}
|
|
11
|
+
#ng-chat input
|
|
12
|
+
{
|
|
13
|
+
outline: none;
|
|
14
|
+
}
|
|
15
|
+
#ng-chat .shadowed
|
|
16
|
+
{
|
|
17
|
+
box-shadow: 0 4px 8px rgba(0,0,0,.25);
|
|
18
|
+
}
|
|
19
|
+
.ng-chat-loading-wrapper
|
|
20
|
+
{
|
|
21
|
+
height: 30px;
|
|
22
|
+
text-align: center;
|
|
23
|
+
font-size:0.9em;
|
|
24
|
+
}
|
|
25
|
+
.ng-chat-close
|
|
26
|
+
{
|
|
27
|
+
text-decoration:none !important;
|
|
28
|
+
color: red !important;
|
|
29
|
+
float:right !important;
|
|
30
|
+
font-weight: 900 !important;
|
|
31
|
+
font-size: 15px !important;
|
|
32
|
+
}
|
|
33
|
+
.ng-chat-title, .ng-chat-title:hover
|
|
34
|
+
{
|
|
35
|
+
position: relative;
|
|
36
|
+
z-index:2;
|
|
37
|
+
height:30px;
|
|
38
|
+
line-height: 30px;
|
|
39
|
+
font-size:0.9em;
|
|
40
|
+
padding: 0 10px;
|
|
41
|
+
display: block;
|
|
42
|
+
text-decoration: none;
|
|
43
|
+
color: white !important;
|
|
44
|
+
font-weight: 600 !important;
|
|
45
|
+
cursor: pointer;
|
|
46
|
+
background-color:#1b1b70 !important;
|
|
47
|
+
}
|
|
48
|
+
.ng-chat-title .ng-chat-title-visibility-toggle-area
|
|
49
|
+
{
|
|
50
|
+
display: inline-block;
|
|
51
|
+
width: 85%;
|
|
52
|
+
}
|
|
53
|
+
.ng-chat-title .ng-chat-title-visibility-toggle-area > strong{
|
|
54
|
+
font-weight: 600;
|
|
55
|
+
display: block;
|
|
56
|
+
overflow: hidden;
|
|
57
|
+
height: 30px;
|
|
58
|
+
text-overflow: ellipsis;
|
|
59
|
+
white-space: nowrap;
|
|
60
|
+
max-width: 85%;
|
|
61
|
+
float:left;
|
|
62
|
+
}
|
|
63
|
+
.ng-chat-title .ng-chat-title-visibility-toggle-area .ng-chat-participant-status
|
|
64
|
+
{
|
|
65
|
+
float: left;
|
|
66
|
+
margin-left: 5px;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.ng-chat-participant-status
|
|
70
|
+
{
|
|
71
|
+
display: inline-block;
|
|
72
|
+
border-radius: 25px;
|
|
73
|
+
width: 8px;
|
|
74
|
+
height: 8px;
|
|
75
|
+
margin-top:10px;
|
|
76
|
+
}
|
|
77
|
+
.ng-chat-participant-status.online
|
|
78
|
+
{
|
|
79
|
+
background-color: #92A400;
|
|
80
|
+
}
|
|
81
|
+
.ng-chat-participant-status.busy
|
|
82
|
+
{
|
|
83
|
+
background-color: #F91C1E;
|
|
84
|
+
}
|
|
85
|
+
.ng-chat-participant-status.away
|
|
86
|
+
{
|
|
87
|
+
background-color: #F7D21B;
|
|
88
|
+
}
|
|
89
|
+
.ng-chat-participant-status.offline
|
|
90
|
+
{
|
|
91
|
+
background-color: #BABABA;
|
|
92
|
+
}
|
|
93
|
+
.ng-chat-unread-messages-count
|
|
94
|
+
{
|
|
95
|
+
margin-left: 5px;
|
|
96
|
+
padding: 0 5px;
|
|
97
|
+
border-radius: 25px;
|
|
98
|
+
font-size: 0.9em;
|
|
99
|
+
line-height: 30px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.ng-chat-options-container
|
|
103
|
+
{
|
|
104
|
+
float: right;
|
|
105
|
+
margin-right: 5px;
|
|
106
|
+
}
|
|
Binary file
|
|
Binary file
|