@rtsee/ngx 0.0.103 → 0.0.104

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.
Files changed (44) hide show
  1. package/dist/ngx/fesm2022/rtsee-ngx.mjs +2992 -1624
  2. package/dist/ngx/fesm2022/rtsee-ngx.mjs.map +1 -1
  3. package/dist/ngx/index.d.ts +98 -11
  4. package/dist/ngx/src/lib/theme/common-components/image-uploader.scss +37 -4
  5. package/dist/ngx/src/lib/theme/common-variables.scss +1 -1
  6. package/dist/ngx/src/lib/theme/common.scss +1 -1
  7. package/dist/ngx/src/lib/theme/containers/shell.scss +2 -2
  8. package/dist/ngx/src/lib/theme/forms/variables.scss +1 -2
  9. package/dist/ngx/src/lib/theme/messenger/call-widget.scss +25 -6
  10. package/dist/ngx/src/lib/theme/messenger/chat-input.scss +206 -17
  11. package/dist/ngx/src/lib/theme/messenger/chat-thumbnail.scss +79 -62
  12. package/dist/ngx/src/lib/theme/messenger/chat.scss +38 -23
  13. package/dist/ngx/src/lib/theme/messenger/chats-list.scss +10 -10
  14. package/dist/ngx/src/lib/theme/messenger/create-chat.scss +383 -0
  15. package/dist/ngx/src/lib/theme/messenger/index.scss +7 -0
  16. package/dist/ngx/src/lib/theme/messenger/invite-link.scss +63 -0
  17. package/dist/ngx/src/lib/theme/messenger/message-time-and-status.scss +29 -15
  18. package/dist/ngx/src/lib/theme/messenger/message.scss +36 -21
  19. package/dist/ngx/src/lib/theme/messenger/messages-list.scss +83 -68
  20. package/dist/ngx/src/lib/theme/messenger/messenger-header.scss +257 -77
  21. package/dist/ngx/src/lib/theme/messenger/messenger-search.scss +26 -11
  22. package/dist/ngx/src/lib/theme/messenger/messenger.scss +42 -26
  23. package/dist/ngx/src/lib/theme/messenger/payment-product-snippet.scss +57 -72
  24. package/dist/ngx/src/lib/theme/messenger/payments.scss +31 -105
  25. package/dist/ngx/src/lib/theme/messenger/profile.scss +109 -137
  26. package/dist/ngx/src/lib/theme/messenger/rate-input.scss +37 -15
  27. package/dist/ngx/src/lib/theme/messenger/variables.scss +13 -3
  28. package/dist/ngx/src/lib/theme/rts-common/_index.scss +24 -0
  29. package/dist/ngx/src/lib/theme/rts-common/_variables-colors.scss +133 -0
  30. package/dist/ngx/src/lib/theme/rts-common/_variables-effects.scss +28 -0
  31. package/dist/ngx/src/lib/theme/rts-common/_variables-layout.scss +30 -0
  32. package/dist/ngx/src/lib/theme/rts-common/_variables-spacing.scss +12 -0
  33. package/dist/ngx/src/lib/theme/rts-common/_variables-typography.scss +36 -0
  34. package/dist/ngx/src/lib/theme/rts-common/animations.scss +77 -0
  35. package/dist/ngx/src/lib/theme/rts-common/avatars.scss +76 -0
  36. package/dist/ngx/src/lib/theme/rts-common/buttons.scss +169 -0
  37. package/dist/ngx/src/lib/theme/rts-common/cards.scss +71 -0
  38. package/dist/ngx/src/lib/theme/rts-common/forms.scss +191 -0
  39. package/dist/ngx/src/lib/theme/rts-common/inputs.scss +109 -0
  40. package/dist/ngx/src/lib/theme/rts-common/labels.scss +80 -0
  41. package/dist/ngx/src/lib/theme/rts-common/messages.scss +60 -0
  42. package/dist/ngx/src/lib/theme/rts-common/user-thumbnails.scss +68 -0
  43. package/dist/ngx/src/lib/theme/styles.scss +1 -0
  44. package/package.json +11 -11
@@ -1,14 +1,14 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, AfterViewInit, ElementRef, EventEmitter, OutputEmitterRef, ViewContainerRef, ComponentFactoryResolver, ChangeDetectorRef, OnDestroy } from '@angular/core';
2
+ import { OnInit, AfterViewInit, ElementRef, EventEmitter, OutputEmitterRef, ViewContainerRef, ComponentFactoryResolver, ChangeDetectorRef, OnDestroy, Type, OnChanges, SimpleChanges } from '@angular/core';
3
3
  import { RTSeeConference, RTSeePeerConnection } from '@rtsee/conference';
4
- import { RTSeeMessenger, RTSeeMessengerSearch, RTSeeMessage, RTSeeChat, RTSeeChatMember } from '@rtsee/messenger';
4
+ import { RTSeeMessenger, RTSeeMessengerSearch, RTSeeMessage, RTSeeChat, RTSeeChatMember, RTSeeMentionAutocomplete, RTSeeWorkflowAutocomplete, OzzyClientTask } from '@rtsee/messenger';
5
5
  import { IPeer, RTSeeTextLabelKeys, IRTSeeCall } from '@rtsee/core';
6
6
  import { HttpClient } from '@angular/common/http';
7
7
  import { RTSeeAuth, RTSeeAuthConfiguration, IRtseeSignInRequestOptions, IRTSeeSignInResponse, IRtseeSignUpRequestOptions, IRTSeeSignUpResponse, AuthEndpointsKeys } from '@rtsee/auth';
8
8
  import { Observable, Subscription } from 'rxjs';
9
9
  import * as i47 from '@angular/router';
10
10
  import { Router, ActivatedRoute } from '@angular/router';
11
- import { IRTSeePaymentProduct, IRTSeePaymentPriceItem, IRTSeeChat, RTSeeChatTypes, IMessageThumbnail } from '@rtsee/common';
11
+ import { IRTSeePaymentProduct, IRTSeePaymentPriceItem, IRTSeeChat, RTSeeChatTypes, IMessageThumbnail, IOzzyWorkflowDefinition, IOzzyTaskLog } from '@rtsee/common';
12
12
  import { RTSeeEventsDashboard, RTSeeDashboardClientSession, RTSeeDashboardEvent, RTSeeDashboardClient } from '@rtsee/events-dashboard';
13
13
  import { RTSee, INavigationConfig, IRouteConfig } from '@rtsee/factory';
14
14
  import { RTSeePresentation, RTSeeStory, RTSeePresentationSettings, RTSeeStorySlide } from '@rtsee/presentation';
@@ -155,6 +155,7 @@ declare class RTSeeContainerComponent implements OnInit {
155
155
  auth: RTSeeAuth<any>;
156
156
  constructor(authService: RTSeeAuthService, router: Router);
157
157
  ngOnInit(): void;
158
+ subscribeToHtmlEvents(): void;
158
159
  onSidenavToggleClicked(): void;
159
160
  defineSideNavState(url: string): void;
160
161
  static ɵfac: i0.ɵɵFactoryDeclaration<RTSeeContainerComponent, never>;
@@ -622,12 +623,7 @@ declare class MessagesListComponent implements AfterViewInit, OnDestroy, OnInit
622
623
  scrollToBottom(): void;
623
624
  formatDate(message: RTSeeMessage): string;
624
625
  private groupMessages;
625
- private performGrouping;
626
- private stitchGroups;
627
- private areForwardMessagesAdded;
628
- private areBackwardMessagesAdded;
629
626
  private saveFirstAndLastGroupedMessages;
630
- private getFirstAndLastMessage;
631
627
  protected readonly RTSeeChatTypes: typeof RTSeeChatTypes;
632
628
  static ɵfac: i0.ɵɵFactoryDeclaration<MessagesListComponent, never>;
633
629
  static ɵcmp: i0.ɵɵComponentDeclaration<MessagesListComponent, "rtsee-messages-list", never, { "chat": { "alias": "chat"; "required": false; }; "messenger": { "alias": "messenger"; "required": false; }; }, {}, never, never, true, never>;
@@ -653,14 +649,41 @@ declare class ChatThumbnailComponent {
653
649
  static ɵcmp: i0.ɵɵComponentDeclaration<ChatThumbnailComponent, "rtsee-chat-thumbnail", never, { "chat": { "alias": "chat"; "required": false; }; "messenger": { "alias": "messenger"; "required": false; }; }, {}, never, never, true, never>;
654
650
  }
655
651
 
656
- declare class ChatInputComponent {
652
+ declare class ChatInputComponent implements OnInit, OnDestroy {
657
653
  sendMessageForm: FormGroup;
658
654
  messenger: RTSeeMessenger;
659
655
  chat: RTSeeChat;
660
656
  chatInput: ElementRef<HTMLTextAreaElement>;
657
+ messageTextarea: ElementRef<HTMLTextAreaElement>;
658
+ autocomplete: RTSeeMentionAutocomplete;
659
+ workflowAutocomplete: RTSeeWorkflowAutocomplete;
660
+ mentionedMemberId: string | null;
661
+ agentAccessDenied: boolean;
662
+ /** prevents the Enter keyup that selected a workflow from sending the message */
663
+ private workflowJustSelected;
664
+ private accessDeniedTimer;
665
+ private onAutocompleteChanged;
666
+ private onAgentAccessDeniedBound;
667
+ ngOnInit(): void;
668
+ ngOnDestroy(): void;
669
+ get isGroupChat(): boolean;
661
670
  sendMessage(): void;
671
+ get anyAutocompleteVisible(): boolean;
672
+ onKeyDown(event: KeyboardEvent): void;
662
673
  onKeyUp(event: KeyboardEvent): void;
674
+ onInput(): void;
675
+ onMemberSelected(member: RTSeeChatMember): void;
676
+ onWorkflowSelected(workflow: IOzzyWorkflowDefinition): void;
677
+ stopAgent(): void;
678
+ dismissAccessDenied(): void;
663
679
  handleResize(): void;
680
+ private showAccessDeniedBanner;
681
+ private clearAccessDeniedTimer;
682
+ private updateAutocomplete;
683
+ private selectWorkflow;
684
+ private applyWorkflow;
685
+ private selectMention;
686
+ private applyMentionToInput;
664
687
  static ɵfac: i0.ɵɵFactoryDeclaration<ChatInputComponent, never>;
665
688
  static ɵcmp: i0.ɵɵComponentDeclaration<ChatInputComponent, "rtsee-chat-input", never, { "messenger": { "alias": "messenger"; "required": false; }; "chat": { "alias": "chat"; "required": false; }; }, {}, never, never, true, never>;
666
689
  }
@@ -683,8 +706,18 @@ declare class RtseeSoundbarComponent implements OnInit {
683
706
  declare class MessengerHeaderComponent {
684
707
  defaultImagesService: DefaultImagesService;
685
708
  messenger: RTSeeMessenger;
709
+ isDropdownOpen: boolean;
710
+ chatImageExpanded: boolean;
686
711
  constructor(defaultImagesService: DefaultImagesService);
687
712
  openProfile(id: string): void;
713
+ toggleDropdown(): void;
714
+ closeDropdown(): void;
715
+ openNewChatDialog(): void;
716
+ closeManageChatDialog(): void;
717
+ onChatSaved(chat: IRTSeeChat): void;
718
+ onChatImageClick(): void;
719
+ collapseInfo(): void;
720
+ get isGroupOrChannelChat(): boolean;
688
721
  protected readonly RTSeeTextLabelKeys: typeof RTSeeTextLabelKeys;
689
722
  static ɵfac: i0.ɵɵFactoryDeclaration<MessengerHeaderComponent, never>;
690
723
  static ɵcmp: i0.ɵɵComponentDeclaration<MessengerHeaderComponent, "rtsee-messenger-header", never, { "messenger": { "alias": "messenger"; "required": false; }; }, {}, never, never, true, never>;
@@ -813,5 +846,59 @@ declare class GtagService {
813
846
  static ɵprov: i0.ɵɵInjectableDeclaration<GtagService>;
814
847
  }
815
848
 
816
- export { EntitiesConfigurationsListComponent, EntitiesListComponent, FormComponent, GtagService, ManageEntityComponent, ManageEntityConfigurationComponent, MessengerComponent, NgxService, PaymentProductSnippetComponent, PresentationComponent, ProfileComponent, RTSeeAuthComponent, RTSeeConferenceComponent, RTSeeContainerComponent, RTSeeControlsComponent, RTSeeModule, RtseeEntityCommentsComponent, RtseeEntityPreviewComponent, RtseeEntityTagsComponent, RtseeEventsDashboardComponent, RtseePeerComponent, RtseeSettingsComponent, RtseeTagGroupManageComponent, RtseeTagGroupsManageComponent, RtseeTagManageComponent, RtseeTagsAccordionMenuComponent };
817
- export type { IAccordionItem, RTSeeTagForm, RTSeeTagGroupForm };
849
+ interface IWorkflowStepWidget {
850
+ /** matches IOzzyWorkflowStepDefinition.widget */
851
+ name: string;
852
+ /** standalone component with `step`, `workflow`, `chat`, `messenger` inputs */
853
+ component: Type<unknown>;
854
+ }
855
+ /**
856
+ * Registry of the components which render workflow steps inside the rts-workflow widget.
857
+ */
858
+ declare class WorkflowStepsService {
859
+ stepsMap: IWorkflowStepWidget[];
860
+ register(widget: IWorkflowStepWidget): void;
861
+ getStepComponentByName(name?: string): Type<unknown> | null;
862
+ static ɵfac: i0.ɵɵFactoryDeclaration<WorkflowStepsService, never>;
863
+ static ɵprov: i0.ɵɵInjectableDeclaration<WorkflowStepsService>;
864
+ }
865
+
866
+ /**
867
+ * Default client-side representation of a server-side OzzyTask.
868
+ * Can be used directly (`[task]`) or as a message widget (`message.data.taskId`).
869
+ */
870
+ declare class RTSeeTaskComponent implements OnInit, OnChanges, OnDestroy {
871
+ private cdr;
872
+ task?: OzzyClientTask | null;
873
+ message?: RTSeeMessage;
874
+ messenger?: RTSeeMessenger;
875
+ chat?: RTSeeChat;
876
+ /** hide the execute button (e.g. when the workflow executes the task itself) */
877
+ allowExecute: boolean;
878
+ logsContainer?: ElementRef<HTMLDivElement>;
879
+ copied: 'input' | 'output' | null;
880
+ private subscribedTask;
881
+ private onChangedBound;
882
+ constructor(cdr: ChangeDetectorRef);
883
+ ngOnInit(): void;
884
+ ngOnChanges(changes: SimpleChanges): void;
885
+ ngOnDestroy(): void;
886
+ get statusLabel(): string;
887
+ get statusClass(): string;
888
+ get inputJson(): string;
889
+ get outputJson(): string;
890
+ get hasOutput(): boolean;
891
+ get hasLogs(): boolean;
892
+ execute(): void;
893
+ copy(kind: 'input' | 'output'): Promise<void>;
894
+ trackLog(index: number, log: IOzzyTaskLog): string;
895
+ private toJson;
896
+ private subscribe;
897
+ private unsubscribe;
898
+ private onTaskChanged;
899
+ static ɵfac: i0.ɵɵFactoryDeclaration<RTSeeTaskComponent, never>;
900
+ static ɵcmp: i0.ɵɵComponentDeclaration<RTSeeTaskComponent, "rtsee-task", never, { "task": { "alias": "task"; "required": false; }; "message": { "alias": "message"; "required": false; }; "messenger": { "alias": "messenger"; "required": false; }; "chat": { "alias": "chat"; "required": false; }; "allowExecute": { "alias": "allowExecute"; "required": false; }; }, {}, never, never, true, never>;
901
+ }
902
+
903
+ export { EntitiesConfigurationsListComponent, EntitiesListComponent, FormComponent, GtagService, ManageEntityComponent, ManageEntityConfigurationComponent, MessengerComponent, NgxService, PaymentProductSnippetComponent, PresentationComponent, ProfileComponent, RTSeeAuthComponent, RTSeeConferenceComponent, RTSeeContainerComponent, RTSeeControlsComponent, RTSeeModule, RTSeeTaskComponent, RtseeEntityCommentsComponent, RtseeEntityPreviewComponent, RtseeEntityTagsComponent, RtseeEventsDashboardComponent, RtseePeerComponent, RtseeSettingsComponent, RtseeTagGroupManageComponent, RtseeTagGroupsManageComponent, RtseeTagManageComponent, RtseeTagsAccordionMenuComponent, WorkflowStepsService };
904
+ export type { IAccordionItem, IWorkflowStepWidget, RTSeeTagForm, RTSeeTagGroupForm };
@@ -14,18 +14,51 @@
14
14
 
15
15
  .rtsee-image-uploader-preview-image {
16
16
  width: 100%;
17
+ border-radius: 8px;
17
18
  }
18
19
 
19
20
  .rtsee-preloader-image-placeholder {
20
- padding-bottom: 100%;
21
- background-color: rgba(0, 0, 0, 0.4);
21
+ padding: 48px 24px;
22
+ background: linear-gradient(
23
+ 135deg,
24
+ rgba(108, 92, 231, 0.06) 0%,
25
+ rgba(162, 155, 254, 0.03) 100%
26
+ );
27
+ border: 2px dashed rgba(162, 155, 254, 0.3);
28
+ border-radius: 12px;
22
29
  display: flex;
23
30
  flex-direction: column;
24
31
  justify-content: center;
25
32
  align-items: center;
33
+ gap: 12px;
34
+ transition: border-color 0.2s ease, background 0.2s ease;
26
35
 
27
- .rtsee-preloader-image-placeholder-text {
28
- display: flex;
36
+ &:hover {
37
+ border-color: rgba(162, 155, 254, 0.6);
38
+ background: linear-gradient(
39
+ 135deg,
40
+ rgba(108, 92, 231, 0.1) 0%,
41
+ rgba(162, 155, 254, 0.06) 100%
42
+ );
43
+ }
44
+
45
+ .rtsee-upload-icon {
46
+ font-size: 40px;
47
+ color: rgba(162, 155, 254, 0.6);
48
+ transition: color 0.2s ease;
49
+ }
50
+
51
+ .rtsee-upload-text {
52
+ font-size: 14px;
53
+ color: rgba(162, 155, 254, 0.5);
54
+ font-weight: 500;
55
+ letter-spacing: 0.3px;
56
+ }
57
+ }
58
+
59
+ &:hover .rtsee-preloader-image-placeholder {
60
+ .rtsee-upload-icon {
61
+ color: rgba(162, 155, 254, 0.85);
29
62
  }
30
63
  }
31
64
 
@@ -77,7 +77,7 @@ $rts-disabled-color: #82DBD8;
77
77
  $rts-slightly-active-color: #B3E8E5;
78
78
  $rts-super-active-color: #3BACB6;
79
79
 
80
- $video-container-width: 320px;
80
+ $video-container-width: 420px;
81
81
  $video-container-height: 240px;
82
82
 
83
83
  // new design-variables
@@ -2,7 +2,7 @@
2
2
  @import "./common-components/preloader";
3
3
  @import "./messenger/variables";
4
4
 
5
- .rtsee-messenger, .rtsee-events-dashboard {
5
+ .rtsee-messenger, .rts-messenger, .rtsee-events-dashboard {
6
6
  font-family: "Work Sans", Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,Oxygen-Sans,Ubuntu,Cantarell,Helvetica Neue,sans-serif;
7
7
  }
8
8
 
@@ -27,8 +27,8 @@
27
27
 
28
28
  &.rtsee-shell-messenger-active {
29
29
  .rtsee-messenger-container {
30
- .rtsee-messenger {
31
- .rtsee-messenger-header-container {
30
+ .rts-messenger {
31
+ .rts-messenger-header-container {
32
32
  top: $video-container-height;
33
33
  }
34
34
  }
@@ -1,8 +1,7 @@
1
1
  @import "../common-variables";
2
2
 
3
3
  $rts-form-field-offset: $rts-offset-md;
4
- $rts-form-background-color: #fff;
4
+ $rts-form-background-color: transparent;
5
5
 
6
6
  $rts-spinner-d-md: 64px;
7
7
  $rts-spinner-d-sm: 32px;
8
-
@@ -1,11 +1,30 @@
1
+ // ═══════════════════════════════════════════════════════════════════
2
+ // MESSENGER — Call Widget
3
+ // ═══════════════════════════════════════════════════════════════════
1
4
  @import "./variables";
2
5
 
3
- .rtsee-call-widget {
4
- .rtsee-join-call-btn {
6
+ .rts-call-widget {
7
+ .rts-join-call-btn {
5
8
  border: none;
6
- background: $rts-new-primary-color;
7
- color: $rts-font-color-dbg-light;
8
- border-radius: $rts-new-border-radius-rounded;
9
- padding: $rts-new-offset-sm $rts-new-offset-md;
9
+ background: linear-gradient(135deg, $rtsu-accent-purple 0%, $rtsu-accent-purple-light 100%);
10
+ color: #fff;
11
+ border-radius: $rtsu-radius-md;
12
+ padding: $rtsu-space-sm + $rtsu-space-xs $rtsu-space-lg;
13
+ font-family: $rtsu-font-family;
14
+ font-weight: $rtsu-font-weight-semibold;
15
+ font-size: $rtsu-font-size-base;
16
+ cursor: pointer;
17
+ box-shadow: $rtsu-shadow-accent-sm;
18
+ transition: transform $rtsu-transition-fast,
19
+ box-shadow $rtsu-transition-fast;
20
+
21
+ &:hover {
22
+ transform: translateY(-1px);
23
+ box-shadow: $rtsu-shadow-accent-md;
24
+ }
25
+
26
+ &:active {
27
+ transform: translateY(0);
28
+ }
10
29
  }
11
30
  }
@@ -1,50 +1,239 @@
1
+ // ═══════════════════════════════════════════════════════════════════
2
+ // MESSENGER — Chat Input
3
+ // ═══════════════════════════════════════════════════════════════════
1
4
  @import "./variables";
2
5
  @import "../common-variables";
3
6
 
4
- .rtsee-chat-input {
5
- padding-right: $rtsee-chat-input-height;
7
+ .rts-chat-input {
8
+ padding-right: $rts-chat-input-height;
6
9
  position: relative;
7
- overflow: hidden;
10
+ overflow: visible;
8
11
 
9
- .rtsee-send-message {
12
+ .rts-send-message {
10
13
  &::-webkit-scrollbar {
11
14
  display: none;
12
15
  }
13
16
 
14
- .rtsee-chat-input-form {
17
+ .rts-chat-input-form {
15
18
  overflow: hidden;
16
19
  line-height: 0;
17
20
 
18
- .rtsee-chat-input-field {
21
+ .rts-chat-input-field {
19
22
  width: 100%;
20
23
  max-height: 130px;
21
24
  border: none;
22
25
  outline: none;
23
- font-size: 16px;
26
+ font-size: $rtsu-font-size-md;
27
+ font-family: $rtsu-font-family;
28
+ background: transparent;
29
+ color: var(--rts-text-primary);
30
+ padding: $rtsu-space-sm;
31
+ resize: none;
32
+
33
+ &::placeholder {
34
+ color: var(--rts-text-muted);
35
+ }
36
+
37
+ &:disabled,
38
+ &[disabled] {
39
+ opacity: 0.5;
40
+ cursor: not-allowed;
41
+ background: var(--rts-bg-dim, rgba(0, 0, 0, 0.03));
42
+ }
24
43
  }
25
44
  }
26
45
  }
27
46
 
28
- .rtsee-send-message-button {
47
+ .rts-send-message-button {
29
48
  position: absolute;
30
- height: 35px;
49
+ height: $rts-chat-input-height - $rts-offset-md;
31
50
  line-height: 0;
32
- right: 0;
33
- bottom: 0;
34
- width: $rtsee-chat-input-height;
35
- background: none;
51
+ right: $rtsu-space-xs;
52
+ bottom: $rtsu-space-xs;
53
+ width: $rts-chat-input-height - $rts-offset-md;
54
+ background: linear-gradient(135deg, $rtsu-accent-purple 0%, $rtsu-accent-purple-light 100%);
36
55
  border: none;
37
56
  outline: none;
38
- font-size: 27px;
39
- color: $rts-new-primary-color;
57
+ border-radius: $rtsu-radius-sm;
58
+ color: #fff;
40
59
  cursor: pointer;
60
+ display: flex;
61
+ align-items: center;
62
+ justify-content: center;
63
+ transition: transform $rtsu-transition-fast,
64
+ box-shadow $rtsu-transition-fast;
65
+ box-shadow: $rtsu-shadow-accent-sm;
41
66
 
42
67
  span {
43
- line-height: 35px;
68
+ font-size: 18px;
69
+ line-height: 1;
70
+ }
71
+
72
+ &:hover {
73
+ transform: scale(1.05);
74
+ box-shadow: $rtsu-shadow-accent-md;
44
75
  }
45
76
 
77
+ &:active {
78
+ transform: scale(0.95);
79
+ }
80
+ }
81
+
82
+ .rts-send-message-button-stop {
83
+ background: linear-gradient(135deg, #e74c3c 0%, #c0392b 100%);
84
+ box-shadow: 0 2px 8px rgba(231, 76, 60, 0.3);
85
+
46
86
  &:hover {
47
- opacity: 0.7;
87
+ box-shadow: 0 4px 16px rgba(231, 76, 60, 0.4);
48
88
  }
49
89
  }
50
90
  }
91
+
92
+ .rts-chat-input-streaming {
93
+ .rts-send-message {
94
+ opacity: 0.7;
95
+ }
96
+ }
97
+
98
+ // --- @-Mention Suggestions Popup ---
99
+ .rts-chat-member-suggestions {
100
+ position: absolute;
101
+ bottom: 100%;
102
+ left: 0;
103
+ right: $rts-chat-input-height;
104
+ background: var(--rts-bg-secondary, #fff);
105
+ border: 1px solid var(--rts-border-dim);
106
+ border-radius: $rtsu-radius-sm;
107
+ box-shadow: $rtsu-shadow-md;
108
+ z-index: 100;
109
+ margin-bottom: $rtsu-space-xs;
110
+ overflow: hidden;
111
+ }
112
+
113
+ .rts-chat-member-suggestion {
114
+ display: flex;
115
+ align-items: center;
116
+ gap: $rtsu-space-sm;
117
+ padding: $rtsu-space-sm $rtsu-space-md;
118
+ cursor: pointer;
119
+ transition: background $rtsu-transition-fast;
120
+
121
+ &:hover,
122
+ &.rts-chat-member-suggestion-active {
123
+ background: var(--rts-bg-hover, rgba(0, 0, 0, 0.05));
124
+ }
125
+ }
126
+
127
+ .rts-chat-member-suggestion-avatar {
128
+ width: 28px;
129
+ height: 28px;
130
+ border-radius: 50%;
131
+ background-size: cover;
132
+ background-position: center;
133
+ background-color: var(--rts-bg-dim);
134
+ flex-shrink: 0;
135
+ }
136
+
137
+ .rts-chat-member-suggestion-name {
138
+ font-size: $rtsu-font-size-md;
139
+ font-family: $rtsu-font-family;
140
+ color: var(--rts-text-primary);
141
+ white-space: nowrap;
142
+ overflow: hidden;
143
+ text-overflow: ellipsis;
144
+ }
145
+
146
+ // --- #-Workflow Suggestions Popup ---
147
+ .rts-workflow-suggestions-head {
148
+ padding: 6px $rtsu-space-md 2px;
149
+ font-size: 10px;
150
+ font-weight: 700;
151
+ letter-spacing: 0.08em;
152
+ text-transform: uppercase;
153
+ color: var(--rts-text-secondary, #8a8fa3);
154
+ }
155
+
156
+ .rts-workflow-suggestion-icon {
157
+ display: inline-flex;
158
+ align-items: center;
159
+ justify-content: center;
160
+ width: 28px;
161
+ height: 28px;
162
+ flex-shrink: 0;
163
+ border-radius: 8px;
164
+ color: #fff;
165
+ font-weight: 700;
166
+ background: linear-gradient(135deg, #6366f1, #8b5cf6);
167
+ }
168
+
169
+ .rts-workflow-suggestion-body {
170
+ display: flex;
171
+ flex-direction: column;
172
+ min-width: 0;
173
+ }
174
+
175
+ .rts-workflow-suggestion-meta {
176
+ font-size: 11px;
177
+ color: var(--rts-text-secondary, #8a8fa3);
178
+ }
179
+
180
+ // --- Agent Access Denied Banner ---
181
+ .rts-agent-access-denied-banner {
182
+ position: absolute;
183
+ bottom: 100%;
184
+ left: 0;
185
+ right: $rts-chat-input-height;
186
+ display: flex;
187
+ align-items: center;
188
+ gap: $rtsu-space-sm;
189
+ padding: $rtsu-space-sm $rtsu-space-md;
190
+ background: var(--rts-bg-warning, #fff3e0);
191
+ border: 1px solid var(--rts-border-warning, #ffcc80);
192
+ border-radius: $rtsu-radius-sm;
193
+ box-shadow: $rtsu-shadow-md;
194
+ z-index: 100;
195
+ margin-bottom: $rtsu-space-xs;
196
+ animation: rts-banner-slide-in 0.2s ease-out;
197
+ }
198
+
199
+ .rts-agent-access-denied-icon {
200
+ font-size: 16px;
201
+ flex-shrink: 0;
202
+ }
203
+
204
+ .rts-agent-access-denied-text {
205
+ flex: 1;
206
+ font-size: $rtsu-font-size-sm;
207
+ font-family: $rtsu-font-family;
208
+ color: var(--rts-text-warning, #e65100);
209
+ line-height: 1.4;
210
+ }
211
+
212
+ .rts-agent-access-denied-dismiss {
213
+ flex-shrink: 0;
214
+ padding: 4px 12px;
215
+ border: none;
216
+ border-radius: $rtsu-radius-sm;
217
+ background: var(--rts-text-warning, #e65100);
218
+ color: #fff;
219
+ font-size: $rtsu-font-size-sm;
220
+ font-family: $rtsu-font-family;
221
+ font-weight: 600;
222
+ cursor: pointer;
223
+ transition: opacity $rtsu-transition-fast;
224
+
225
+ &:hover {
226
+ opacity: 0.85;
227
+ }
228
+ }
229
+
230
+ @keyframes rts-banner-slide-in {
231
+ from {
232
+ opacity: 0;
233
+ transform: translateY(4px);
234
+ }
235
+ to {
236
+ opacity: 1;
237
+ transform: translateY(0);
238
+ }
239
+ }